Collision between two identical objects?

1 favourites
  • 15 posts
From the Asset Store
Hand-painted tiles, objects, animated objects, and background to build a colorful Mayan civilization environment.
  • I'm making a breakout style game, and was wondering if there's a way to differentiate in the actions the reference to 'self' and 'other' instances of the same sprite?

  • You can use Pick nth instance in the System object to pick by index the objects involved in the collision event - just add the picking as a subevent and you should be good to go.

  • Ah - so - 1st would be 'self', 2nd etc would be 'other', if I understand correctly?

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • Have a look here:

    http://www.scirra.com/forum/checking-collision-between-2-objs-of-same-family_topic51401_post324216.html#324216

    The concept is the same if not using families.

  • Thanks, that helps a lot,I had a look at the attached, and I will go with families for now.

    I was just wondering if there was something simple that I was overlooking like :

    Sprite1 on Collision with Sprite1

    Sprite1(Self) Score+=1

    Sprite1(Other) Destroy

  • Hmm, managed to dig this topic back out haha.

    I did a quick demo for a friend tonight to show him how quick it is to concept stuff in Construct2. The actual game including sprites and basic physics was up and running in 20 minutes, but then came the hard part :

    http://www.johnnysix.net/games/Flap/

    If you try the demo you'll see what the issue is. Because I can't use the velocity component of a physics object directly, nor test for "self.variable" or "other.variable" when testing collision between two entities of the same type, everything goes a bit haywire.

    Link to CAPX file :

    http://www.johnnysix.net/games/Flap/flap.capx

    Click, drag and release anywhere to launch le oiseau.

  • Crap. I posted another topic for this without digging longer. But seriously is there a way to differentiate between the 2 instances involved in the collision?

  • I have searched everywhere for a simple solution for this, and is actually quite surprised that it seems overlooked; or did I just miss that part of the manual?

    Self and other is a neat solution in several other systems, and perfect for standard collisions and so on.

    Edit: Thanks to the one that mentioned pick nth instance - scirra.com/manual/124/system-conditions

    Ill try this and see how it works.

  • Ok, still not getting it...

    I got identical blue squares floating around in a random way. If two collides I want to check if they are the same size, and if they are increase both sizes by some amount. Different sized squares should merely bounce off eachother.

    What I want to do is (in a basic kind of way):

    If square collides with square

    AND

    self.height = other.height

    THEN

    self.height=self.height*1.1; self.width=self.width*1.1

    other.height=other.height*1.1; other.width=other.width*1.1

  • Ok, I found a (not so) quick and dirty event based solution but i'm not sure it's the best one. Anyway - it works!

    I have my blue square objects which I named "R". I also made a controller object named "C", which is placed off screen. C have two instance variables named "first" and "second".

    * R - on collision with R

    *     System - Pick R instance 1 (make a sub-event, system and "pick nth instance"

    The action part of the sub-event is "C" set "first" to R.height (height of R gets stored in the "first" variable of "C")

    * Make another sub-event to the first collision event but this time pick instance "1" and store the height in the variable named "second".

    * Create yet another sub-event (from the collision event), choose "C" compare instance variables and check if "first" and "second" are equal.

    * Create two new sub-event from the comparison sub-event (so that it's a sub-sub-event when viewed from the initial event); choose "System" and pick nth instance again (first instance "0" and then instance "1"). Adjust their sizes accordingly (or whatever you want to do).

    It sure gets more complex to explain then it looks on the screen.

    You basically have the first collision event to catch the actual collision event. Underneath this one you use "pick nth" to store the height (or something else) in a controller object, for the two objects involved (0 and 1 for pick nth).

    Last you compare these figures, but put this comparison-event under the initial even to avoid it getting checked outside actual collisions.

    So it works. it's just a bit clumsy.

  • Heres a pic that might explain it better. Now I just wait for a nicer solution. :)

    <img src="http://i39.tinypic.com/2n00nkz.jpg" border="0" />

    I should mention that I initially thought I would have the need for the IID's, which is why I made some space for them in the controller object. Looks like I didnt need them, so you can ignore those lines.

  • I would approach it like this:

    Family Trick Demo 02

    Also depending on how your objects are setup it's better to compare the heights using a defined threshold, since sometimes they can be slightly different due to rounding errors.

  • I would approach it like this:

    https://dl.dropboxusercontent.com/u/7871870/construct/family-trick-demo-02.capx

    Also depending on how your objects are setup it's better to compare the heights using a defined threshold, since sometimes they can be slightly different due to rounding errors.

    Sorry for late response. Had the wrong version installed, so I couldnt check out your solution.

    Anyways now I did, and it looks neat and fairly simple. Can't say I fully grasp it since I have yet to work with families, but as soon as I understand it i'll try to use your solution instead.

  • Typecasting would be nice though, as in "Block.Self" and "Block.Other" to apply actions specifically and without having to get too work around it.

  • I know this thread is old but i needed a similar solution. Just in case people are interested I found a fairly simple one through some trial and error:

    I used z order, by moving one specific instance to the top based on a condition, then picking the bottom instance to apply the action to, you should easily be able to achieve what you need with very little effort.

Jump to:
Active Users
There are 1 visitors browsing this topic (0 users and 1 guests)