Game Development Community

Initial moving platforms

by Tom Feni · in Torque Game Builder · 01/23/2006 (11:53 am) · 6 replies

Well I started on a moving platform of sorts using triggers.
problem is the trigger only recognizes the player the way its set up.. and I have tried to add a second trigger for the platform but since it uses a different layer they dont collide right..
ie player is on player and platform is on platform layer.. but the trigger only collides with player..

well here is all the relevant code I pulled together from TDN and what I have just thrown together..

added $triggerGroup = 3; to the other groups
$platformGroup = 0;
$playerGroup = 1;
$starGroup = 2;
$triggerGroup = 3;

$platformLayer = 5;
$playerLayer = 2;

at the end of createlevel I have

createTrigger("-10 92", "30 -40", "playerFall();", "", "");
createTrigger("-10 22", "30 -40", "resetMover();", "", "");

and

createMovers();

which calls
function createMovers()
{
     $mover = new t2dStaticSprite() { scenegraph = t2dScene; };
     $mover.setPosition("-10 90");
     $mover.setSize( "14 3" );
     $mover.setImageMap( woodImageMap );
     $mover.setCollisionActive(false, true);
     $mover.setCollisionPhysics(true, false);
     $mover.setCollisionResponse(CLAMP);
     $mover.setCollisionMaxIterations(2);
     $mover.setCollisionCallback(true);
     $mover.setLayer($platformLayer);
     $mover.setGroup($platformGroup);

     moveUp();

}

function moveUp()
{
    $mover.setLinearVelocity( "0 -1" );

}

function resetMover()
{
    $mover.setWorldLimit(OFF);
    $mover.safeDelete();
    createMovers();
}
which is basically creating a mover at the bottom and sending it upwards at -1 speed.. :) when the mover hits the trigger it should call the resetMover function which should delte it and then createMovers, hence a perpetual loop, that will create a looping mover..

now if the player is on the platform and hits the trigger the platform diosappears and a new platform arrives down below..
and if i change it so the platform is the controlling collision then it does exactly what it should.. but I need to figure out how to add both $player and $platform groups/layers into the collision scenerio so it cycles thru and says if this is player then this if platform then this..

oh and this is the trigger code..
new SimGroup(TriggerCheckGroup);

function createTrigger(%pos, %size, %enter, %stay, %leave)
{
   %trigger = new t2dSceneObject()
   {
      scenegraph = t2dscene;
   };
   %trigger.setPosition(%pos);
   %trigger.setSize(%size);
   %trigger.setGroup($triggerGroup);
   %trigger.setCollisionMasks(BIT($playerGroup), BIT($playerLayer));
   %trigger.setLayer($platformLayer);
   %trigger.setCollisionActive(true, false);
   %trigger.enterAction = %enter;
   %trigger.stayAction = %stay;
   %trigger.leaveAction = %leave;
   %trigger.setDebugOn(BIT(5));
   
}

function collidePlayerTrigger(%trigger)
{
   TriggerCheckGroup.add(%trigger);
   %trigger.inNow = true;
}

function checkTrigger(%trigger)
{
   if (!%trigger.inPrev && %trigger.inNow)
      schedule(0, 0, "eval", %trigger.enterAction);

   else if (%trigger.inPrev && %trigger.inNow)
      schedule(0, 0, "eval", %trigger.stayAction);

   else if (%trigger.inPrev && !%trigger.inNow)
   {
      schedule(0, 0, "eval", %trigger.leaveAction);
      TriggerCheckGroup.remove(%trigger);
   }

   %trigger.inPrev = %trigger.inNow;
   %trigger.inNow = false;
}
and the collision...
function t2dSceneObject::onCollision(%srcObj, %dstObj, %srcRef,
   %dstRef, %time, %normal, %contactCount, %contacts)
{
   switch (%srcObj.getGroup())
   {
      case $playerGroup:
         switch (%dstObj.getGroup())
         {
            case $platformGroup:
               collidePlayerPlatform(%normal);
               
            case $starGroup:

               pickup(%dstObj);
               updateScores();

            case $triggerGroup:
               collidePlayerTrigger(%dstObj);
                  echo("anything happening yet");

         }

   }
}

#1
01/23/2006 (11:53 am)
*continued


thats about the gist of it.. the rest of it is just the basic stuff..
I tried to use (BIT($platformGroup) | BIT($playerGroup) , BIT($platformLayer) | BIT($playerLayer))
but that didnt work either..

[/code]

anyways if you know of something that might work I am all ears.. if not then at least I can share my attempt at platform building.. :)

TomFeni
#2
01/23/2006 (5:09 pm)
Hi Tom,

I'm having a hard time figuring out what you're trying to do (fighting the flu right now, so my head's not so clear).

If you're trying to register a collision between your trigger and your moving platform, you'll need to add your platform's group and layer to your trigger's collisions masks. You'll also need to add a case to the first switch in your collision callback for your trigger's group. Something like:

function t2dSceneObject::onCollision(%srcObj, %dstObj, %srcRef,
   %dstRef, %time, %normal, %contactCount, %contacts)
{
   switch (%srcObj.getGroup())
   {

      case $playerGroup:
         switch (%dstObj.getGroup()) {
            case $platformGroup:
               collidePlayerPlatform(%normal);
               
            case $starGroup:

               pickup(%dstObj);
               updateScores();

            case $triggerGroup:
               collidePlayerTrigger(%dstObj);
                  echo("anything happening yet");

         }

      case $triggerGroup:
         switch (%dstObj.getGroup()) {
             case $platformGroup:
                 collideTriggerPlatform(%dstObj);
         }
   }
}

Currently (and as far as I can tell), the only way your trigger does anything upon collision is through your collidePlayerTrigger(%trigger) function, which isn't called when a platform collides with a trigger.

I hope this is at least a little relevant to your problem (I could be waaay off :)
-Chris
#3
01/23/2006 (8:47 pm)
Ok gave up on triggers so decided to try just using schedules.. seems to work for a bit but after a few passes t2d crashes..

not sure if its due to the delete function I have going..

// ----------------------------------------------------------------------------
// initial moving platform
// ----------------------------------------------------------------------------

function createMovers()
{
   createMoverA();
   createMoverB();
   createMoverC();
   createMoverD();
}

function createMoverA()
{
     $mover = new t2dStaticSprite() { scenegraph = t2dScene; };
     $mover.setPosition( "-10 88" );
     $mover.setSize( "14 4" );
     $mover.setImageMap( platform );
     $mover.setCollisionActive(false, true);
     $mover.setCollisionPhysics(true, false);
     $mover.setCollisionResponse(CLAMP);
     $mover.setCollisionMaxIterations(1);
     $mover.setCollisionCallback(true);
     $mover.setLayer($platformLayer);
     $mover.setGroup($platformGroup);
     moveUp();
}

function createMoverB()
{
     $mover = new t2dStaticSprite() { scenegraph = t2dScene; };
     $mover.setPosition( "46 8" );
     $mover.setSize( "14 4" );
     $mover.setImageMap( platform );
     $mover.setCollisionActive(false, true);
     $mover.setCollisionPhysics(true, false);
     $mover.setCollisionResponse(CLAMP);
     $mover.setCollisionMaxIterations(1);
     $mover.setCollisionCallback(true);
     $mover.setLayer($platformLayer);
     $mover.setGroup($platformGroup);
     moveDown();
}

function createMoverC()
{
     $mover = new t2dStaticSprite() { scenegraph = t2dScene; };
     $mover.setPosition( "90 88" );
     $mover.setSize( "14 4" );
     $mover.setImageMap( platform );
     $mover.setCollisionActive(false, true);
     $mover.setCollisionPhysics(true, false);
     $mover.setCollisionResponse(CLAMP);
     $mover.setCollisionMaxIterations(1);
     $mover.setCollisionCallback(true);
     $mover.setLayer($platformLayer);
     $mover.setGroup($platformGroup);
     moveUp();
}

function createMoverD()
{
     $mover = new t2dStaticSprite() { scenegraph = t2dScene; };
     $mover.setPosition( "144 8" );
     $mover.setSize( "10.5 4" );
     $mover.setImageMap( platform );
     $mover.setCollisionActive(false, true);
     $mover.setCollisionPhysics(true, false);
     $mover.setCollisionResponse(CLAMP);
     $mover.setCollisionMaxIterations(1);
     $mover.setCollisionCallback(true);
     $mover.setLayer($platformLayer);
     $mover.setGroup($platformGroup);
     moveDown();
}

function moveUp()
{
    $mover.setLinearVelocity( "0 -6" );
    schedule(13500, 0, "resetMover");
}

function moveDown()
{
    $mover.setLinearVelocity( "0 6" );
    schedule(13500, 0, "resetMover");
}


function resetMover()
{

    $mover.safeDelete();
    createMoverA();
    createMoverB();
    createMoverC();
    createMoverD();
}

maybe it is not deleteing right.. hmmm... :)

TomFeni
#4
01/23/2006 (9:33 pm)
Ok simplified it down a bit more..
function createMovers()
{
   createMoverA();
   createMoverB();
   createMoverC();
   createMoverD();
}

function createMoverA()
{
     $moverA = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverA.setPosition( "-10 88" );
     $moverA.setSize( "14 4" );
     $moverA.setImageMap( platform );
     $moverA.setCollisionActive(false, true);
     $moverA.setCollisionPhysics(true, false);
     $moverA.setCollisionResponse(CLAMP);
     $moverA.setCollisionMaxIterations(1);
     $moverA.setCollisionCallback(true);
     $moverA.setLayer($platformLayer);
     $moverA.setGroup($platformGroup);
     $moverA.setWorldLimit( kill, "-190 0 190 90" );
     $moverA.setLinearVelocity( "0 -6" );

}

function createMoverB()
{
     $moverB = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverB.setPosition( "46 8" );
     $moverB.setSize( "14 4" );
     $moverB.setImageMap( platform );
     $moverB.setCollisionActive(false, true);
     $moverB.setCollisionPhysics(true, false);
     $moverB.setCollisionResponse(CLAMP);
     $moverB.setCollisionMaxIterations(1);
     $moverB.setCollisionCallback(true);
     $moverB.setLayer($platformLayer);
     $moverB.setGroup($platformGroup);
     $moverB.setWorldLimit( kill, "-190 0 190 90" );
     $moverB.setLinearVelocity( "0 6" );

}

function createMoverC()
{
     $moverC = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverC.setPosition( "90 88" );
     $moverC.setSize( "14 4" );
     $moverC.setImageMap( platform );
     $moverC.setCollisionActive(false, true);
     $moverC.setCollisionPhysics(true, false);
     $moverC.setCollisionResponse(CLAMP);
     $moverC.setCollisionMaxIterations(1);
     $moverC.setCollisionCallback(true);
     $moverC.setLayer($platformLayer);
     $moverC.setGroup($platformGroup);
     $moverC.setWorldLimit( kill, "-190 0 190 90" );
     $moverC.setLinearVelocity( "0 -6" );

}

function createMoverD()
{
     $moverD = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverD.setPosition( "144 8" );
     $moverD.setSize( "10.5 4" );
     $moverD.setImageMap( platform );
     $moverD.setCollisionActive(false, true);
     $moverD.setCollisionPhysics(true, false);
     $moverD.setCollisionResponse(CLAMP);
     $moverD.setCollisionMaxIterations(1);
     $moverD.setCollisionCallback(true);
     $moverD.setLayer($platformLayer);
     $moverD.setGroup($platformGroup);
     $moverD.setWorldLimit( kill, "-190 0 190 90" );
     $moverD.setLinearVelocity( "0 6" );

}

function t2dStaticSprite::onRemove()
{
   echo("sprite deleted");
}

now I need to figure a way to respawn these things.. :)

i tried to use createMovers(); in the onremove function but that just caused them to add a platform each pass so first delete 2 then 2nd delete 3 and on the 3rd delete it crashed..
#5
01/23/2006 (9:57 pm)
Ok easiest solutions are the best.. :)

// ----------------------------------------------------------------------------
// initial moving platform
// ----------------------------------------------------------------------------

function createMovers()
{
   createMoverA();
   createMoverB();
   createMoverC();
   createMoverD();
}

function createMoverA()
{
     $moverA = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverA.setPosition( "-10 88" );
     $moverA.setSize( "14 4" );
     $moverA.setImageMap( platform );
     $moverA.setCollisionActive(false, true);
     $moverA.setCollisionPhysics(true, false);
     $moverA.setCollisionResponse(CLAMP);
     $moverA.setCollisionMaxIterations(1);
     $moverA.setCollisionCallback(true);
     $moverA.setLayer($platformLayer);
     $moverA.setGroup($platformGroup);
     $moverA.setWorldLimit( kill, "-190 0 190 90" );
     $moverA.setLinearVelocity( "0 -6" );
     schedule(13500, 0, "createMoverA");
}

function createMoverB()
{
     $moverB = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverB.setPosition( "46 8" );
     $moverB.setSize( "14 4" );
     $moverB.setImageMap( platform );
     $moverB.setCollisionActive(false, true);
     $moverB.setCollisionPhysics(true, false);
     $moverB.setCollisionResponse(CLAMP);
     $moverB.setCollisionMaxIterations(1);
     $moverB.setCollisionCallback(true);
     $moverB.setLayer($platformLayer);
     $moverB.setGroup($platformGroup);
     $moverB.setWorldLimit( kill, "-190 0 190 90" );
     $moverB.setLinearVelocity( "0 6" );
     schedule(13500, 0, "createMoverB");
}

function createMoverC()
{
     $moverC = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverC.setPosition( "90 88" );
     $moverC.setSize( "14 4" );
     $moverC.setImageMap( platform );
     $moverC.setCollisionActive(false, true);
     $moverC.setCollisionPhysics(true, false);
     $moverC.setCollisionResponse(CLAMP);
     $moverC.setCollisionMaxIterations(1);
     $moverC.setCollisionCallback(true);
     $moverC.setLayer($platformLayer);
     $moverC.setGroup($platformGroup);
     $moverC.setWorldLimit( kill, "-190 0 190 90" );
     $moverC.setLinearVelocity( "0 -6" );
     schedule(13500, 0, "createMoverC");
}

function createMoverD()
{
     $moverD = new t2dStaticSprite() { scenegraph = t2dScene; };
     $moverD.setPosition( "144 8" );
     $moverD.setSize( "10.5 4" );
     $moverD.setImageMap( platform );
     $moverD.setCollisionActive(false, true);
     $moverD.setCollisionPhysics(true, false);
     $moverD.setCollisionResponse(CLAMP);
     $moverD.setCollisionMaxIterations(1);
     $moverD.setCollisionCallback(true);
     $moverD.setLayer($platformLayer);
     $moverD.setGroup($platformGroup);
     $moverD.setWorldLimit( kill, "-190 0 190 90" );
     $moverD.setLinearVelocity( "0 6" );
     schedule(13500, 0, "createMoverD");
}

function t2dStaticSprite::onRemove()
{
   echo("sprite deleted");
}

now the schedule time is almost exactly how long it takes to travel form top to bottom..

so if I change it to a lower # then a new platform will spawn before the first gets to the top so I can have staggered platforms.. for less wait time.. :) or make the number bigger for a longer wait time.. :)

man to easy huh?

TomFeni
#6
01/26/2006 (12:41 am)
Updated this to
// ----------------------------------------------------------------------------
// initial moving platform
// ----------------------------------------------------------------------------

function createExtras()
{
   platformGeneratingLoop();
   makeBricks();
}

// ------------------------------------------------------------
// This loop continuously generates new platforms every 13.5
// seconds.
// ------------------------------------------------------------
function platformGeneratingLoop() {
     //createMover( position, direction, length )
     createMover( "-10 88", "0 -6", 14 );
     createMover( "46 8", "0 6", 14 );
     createMover( "90 88", "0 -6", 14 );
     createMover( "144 8", "0 6", 10.5 );

     schedule( 8500, 0, "platformGeneratingLoop" );
}

// ------------------------------------------------------------
// A generic function for spawning a platform at a specific
// location.  Takes as arguments the %position and %direction
// you want the platform to start with.  The rest will be the
// same between each platform, so we just let the function set
// it up.
// ------------------------------------------------------------
function createMover( %position, %direction, %length ) {
     // Use a temporary variable to hold the new sprite
     // Temporary because we don't need to refer back to it once we're done
     %newMover = new t2dStaticSprite() { scenegraph = t2dScene; };

      //Set up the attributes based on the info we passed to the function
      //%position, %direction, %length
     %newMover.setPosition( %position );
     %newMover.setLinearVelocity( %direction );
     %newMover.setSize( %length SPC "4" );

     // Set up the attributes that are the same for each platform
     %newMover.setImageMap( platform );
     %newMover.setCollisionActive(false, true);
     %newMover.setCollisionPhysics(true, false);
     %newMover.setCollisionResponse(CLAMP);
     %newMover.setCollisionMaxIterations(1);
     %newMover.setCollisionCallback(true);
     %newMover.setLayer($platformLayer);
     %newMover.setGroup($platformGroup);
     %newMover.setWorldLimit( kill, "-190 0 190 90" );
}

this makes it easier to add new platforms :)
thanks to a guy over at t2d chat room for the code :)

works really nice..