How do I consider Z order for collision checks?

Get help using Construct 2

Post » Tue Jun 03, 2014 12:39 pm

Hey guys,

I am currently trying to tell an object to only collide with another object if they are connected on the Z axis.
This means that if another object is in between those two object on the Z axis, collision should not happen.
Is there any practical way to handle this? Since I didn't find a nice solution yet I resize the collision polygons of the objects by frame depending on the position which is a very inaccurate and dirty solution.

Any help is appreciated.

Posts: 41
Reputation: 527

Post » Tue Jun 03, 2014 2:10 pm

hey jcstranger, thats a good question ,

I dont know if there is a better way but ...I would consider keeping in mind the process order of your event sheets.

Event sheets process commands from top to bottom so basically if you combined this knowledge with turning on and off groups of events you should be able to come up with a solution.

Or another possibly easier way would be to use Instance Variables, in this case I would use Booleans

1st ....-Put all of your Collision checked objects into a Family and then assign a Boolean Instance Variable to the Family
Name it something like "Collision_Enabled"

Then if you put all of your Collision check Events in a Group on your Event Sheet, you could direct the Z-index equal Collision objects to The Collision Actions in the next Event because Event Sheets process from top to bottom

The Construct 2 manual entries on Z order are
The name of the layer the instance is currently on.
The zero-based index of the layer the instance is currently on.
Gets the zero-based index of the Z order of this instance within its current layer. 0 is the bottom instance, increasing up to the top instance.

So..The next step would be to would create 2 Groups of events one controlling the other...You might be able to make this a sub event but it may work better as a separate event...Trial and error will tell which works best

Group 1 The Z- index Check
Create the following event and place it within its own Named Group
for example : "Z-index Check Group"
This 1st Group event only compares the Z-index of each object and triggers the Boolean Instance Variable per Object BUT only if they are actually colliding..
This way you save on alot of processor work ..otherwise you will be clogging up the system with unnecessary checks per tick.

Z-index Check Group Conditions
Code: Select all
-->Object or Family 1--> on Collision with Object or Family 2
--> System ->Compare 2 Variables-> Object 1 Zindex = Object 2 Zindex
--> System->Turn on Group "Collision Actions"

Next... Event Group 2

Actual Collision Actions

Create another Event and place it within its own Named Group
For example : "Collision Actions"
This Group handles the actual Events that happen if the Z-Index proves equal per object but only if its turned on by the first event group ie only if the Objects Boolean Variable is Triggered TRUE by the first z-index check Group

Collision Actions Group Conditions

Code: Select all
-->System-> For each Object
-->Object->Is Boolean Instance Instance Set ("Collision_Enabled")
--> Here is where you would place any actions that are related to the triggered Collisions

This should be all that is required..I know it sounds complex but if you follow the steps it should work
providing I didnt miss or forget anything

Hope that Helps
Last edited by mystazsea on Tue Jun 03, 2014 3:03 pm, edited 1 time in total.
When in doubt..or you are lost in a Zombie apocalypse or someone is giving you a hard time..Remember one thing..... Read the Construct 2 will save your life.:)
Posts: 318
Reputation: 7,710

Post » Tue Jun 03, 2014 2:33 pm

hi mystazsea,

thats a very detailed answer, way more than i was hoping for.

I will try out your approach and let you know as soon as i have something (or not).

thank you very much.
Posts: 41
Reputation: 527

Post » Wed Jun 04, 2014 12:48 pm

so i finally figured out a solution that works for me.

in my game there is endless content randomly generated and scaled to 0 (destroyed).
besides, the player can also move stepwise (X pixel per touch)

currently, every second one new object is generated that contains 4 obstacles that can collide with the player, then they scale to 0.
what i do to solve the collision problem is that i set the new object and obstacle instance to a new layer every second.
this makes up to 18 layers. now, when i move my player, is substract it by one layer, else it also adds 1 layer per second.
this way i can check if the player position is on the obstacle position.
if both variables (player and obstacle) have the same "layer" variable, i check for collision.

i am not sure if this is a dirty solution performance wise, but it is at least very precise.

thx again for helping
Posts: 41
Reputation: 527

Return to How do I....?

Who is online

Users browsing this forum: IGDev, Metathronos and 8 guests