Torque2D/pong Tutorial TGB Game Arena
From TDN
|
|
[edit] Setting up a Tile Map
function createArena(%width, %height)
{
%arena = new t2dTileMap() { scenegraph = t2dscene; };
%arena.loadTileMap("~/data/tileMaps/arena1.tile");
%layer = %arena.getTileLayer(0);
%layer.setCollisionActive(false, true);
%layer.setGraphGroup($arenaGroup);
%layer.setLayer($arenaLayer);
// Hardcoded values not very good, this will
// be change in later versions.
%layer.setTileSize("2 2");
%layer.setPosition("49 37");
}
|
|
[edit] Setting up Collisions
function t2dSceneObject::onCollision(%srcObj, %dstObj, %srcRef,
%dstRef, %time, %normal, %contactCount, %contacts)
{
switch ( %srcObj.getGraphGroup() )
{
case $ballGroup: // the ball hits something
switch ( %dstObj.getGraphGroup() )
{
case $paddleGroup: // the ball hit the paddle
error("Hit Paddle...");
%scoreModifier = 10;
updateScore(%scoreModifier);
case $arenaGroup: // the ball hit the arena wall
error("Hit Arena wall...");
case $triggerGroup: // the ball hit a trigger. I used a trigger for the area behind the paddle.
killBall(%srcObj);
case $ballGroup: // the ball hit another ball
error("Hit another Ball...");
}
checkVelocity(%srcObj); // this function is to ensure a minimum speed and angle.
}
}
|
|
[edit] Setting up a Trigger
new SimGroup(TriggerCheckGroup);
function createTrigger(%pos, %size, %enter, %stay, %leave)
{
%trigger = new t2dSceneObject() { scenegraph = t2dscene; };
%trigger.setPosition(%pos);
%trigger.setSize(%size);
%trigger.setLayer($triggerLayer);
%trigger.setGraphGroup($triggerGroup);
%trigger.setCollisionMasks(BIT($ballGroup), BIT($ballLayer));
%trigger.setCollisionActive(true, true);
%trigger.enterAction = %enter;
%trigger.stayAction = %stay;
%trigger.leaveAction = %leave;
//%trigger.setDebugOn(BIT(0));
}
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;
}
|



