0

Я пытаюсь создать платформерную игру во Flash, используя ActionScript 3. В настоящее время все работает, за исключением одной вещи.Flash Collision Detection (Платформенная игра)

Проблема:

Когда игрок сталкивается с нижней части платформы, если его XVEL не равна нулю, горизонтальная петля обнаружения столкновений называется и игрок перемещается горизонтально, так и вертикально. Это означает, что он отскакивает от платформы снизу, но также перемещается в одну сторону платформы. Если xVel игрока равен нулю, все работает нормально. Это связано с тем, что горизонтальный цикл столкновений не вызывается. Я не могу понять, почему это происходит. Любая помощь будет принята с благодарностью.

Кодекс:

import flash.events.Event; 
import flash.geom.Rectangle; 

var level:Array = new Array(); 

var xVel = 0; 
var yVel = 0; 

var xSpeed = 15; 

var accel =1.5; 
var grav = 2; 
var jumpHeight = 15*grav; 


for(var i = 0; i<numChildren;i++){ 
    if(getChildAt(i) is platform){ 
     level.push(getChildAt(i).getRect(this)); 
    } 
} 

var upKeyDown = false; 
var leftKeyDown = false; 
var rightKeyDown = false; 
var downKeyDown = false; 


stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP,keyUp); 
stage.addEventListener(Event.ENTER_FRAME,gameLoop); 

function keyDown(e:KeyboardEvent){ 
    if(e.keyCode == Keyboard.UP){ 
     upKeyDown = true; 
    } 
    if(e.keyCode == Keyboard.LEFT){ 
     leftKeyDown = true; 
    } 
    if(e.keyCode == Keyboard.RIGHT){ 
     rightKeyDown = true; 
    } 
    if(e.keyCode == Keyboard.DOWN){ 
     downKeyDown = true; 
    } 
} 
function keyUp(e:KeyboardEvent){ 
    if(e.keyCode == Keyboard.UP){ 
     upKeyDown = false; 
    } 
    if(e.keyCode == Keyboard.LEFT){ 
     leftKeyDown = false; 
    } 
    if(e.keyCode == Keyboard.RIGHT){ 
     rightKeyDown = false; 
    } 
    if(e.keyCode == Keyboard.DOWN){ 
     downKeyDown = false; 
    } 
} 

function gameLoop(e:Event){ 
    if(rightKeyDown){ 
     if(xVel<xSpeed){ 
      xVel+=accel; 
     } 

    }else if(leftKeyDown){ 
     if(xVel>-xSpeed){ 
      xVel-=accel; 
     } 

    }else{ 
     xVel *=0.6; 
    } 
    //horizontal 
    player.x+=xVel; 
    for(i = 0; i<level.length;i++){ 
     if(player.getRect(this).intersects(level[i])){ 
      if(xVel>0){ 
       player.x = level[i].left-player.width/2; 
      } 
      if(xVel<0){ 
       player.x = level[i].right+player.width/2; 
      } 
      xVel = 0; 
     } 
    } 

    yVel+=grav; 
    player.y+=yVel; 
    var jumpable = false; 
    for(i = 0; i<level.length;i++){ 
     if(player.getRect(this).intersects(level[i])){ 
      if(yVel>0){ 
       player.y = level[i].top-player.height/2; 
       yVel = 0; 
       jumpable = true; 
      } 
      if(yVel<0){ 
       player.y = level[i].bottom+player.height/2; 
       yVel*=-0.5; 
      } 
     } 
    } 
    if(upKeyDown&&jumpable){ 
     jump(); 
    } 
    this.x = -player.x+(stage.stageWidth/2); 
    this.y = -player.y+(stage.stageHeight/2); 
} 

function jump(){ 
    yVel-=jumpHeight; 
} 

Где я думаю проблема возникает

player.x+=xVel; 
    for(i = 0; i<level.length;i++){ 
     if(player.getRect(this).intersects(level[i])){ 
      if(xVel>0){ 
       player.x = level[i].left-player.width/2; 
      } 
      if(xVel<0){ 
       player.x = level[i].right+player.width/2; 
      } 
      xVel = 0; 
     } 
    } 

    yVel+=grav; 
    player.y+=yVel; 
    var jumpable = false; 
    for(i = 0; i<level.length;i++){ 
     if(player.getRect(this).intersects(level[i])){ 
      if(yVel>0){ 
       player.y = level[i].top-player.height/2; 
       yVel = 0; 
       jumpable = true; 
      } 
      if(yVel<0){ 
       player.y = level[i].bottom+player.height/2; 
       yVel*=-0.5; 
      } 
     } 
    } 

картина!

A visual description

Дополнительная информация:

Платформы кино символы клипа, все происходящие из того же символа. Их тянут на холст и размер. Символ платформы имеет связь AS называется «платформа», которая, как идентифицируются ребенок в качестве платформы в коде

игрока представляет собой прямоугольник без какой-либо анимации

Обе платформы и игрок имеет ориентацию в центр объекта.

ответ

1

Что вам нужно для проверки переднего столкновения первым и соответствующим образом отрегулировать перед горизонтальной проверкой. Если вы этого не сделаете, тогда игрок будет сталкиваться с нижней частью платформы, когда вы выполняете горизонтальную проверку.

+0

Я снова позиционировал for-loops и ничего не изменил. – grimrader22

+0

В вашем горизонтальном тестовом цикле, как насчет того, как вы поворачиваете альфа платформы, с которой вы сталкиваетесь .50, чтобы вы могли видеть, какая часть вызывает столкновение. Если он сталкивается с верхней частью, когда вы делаете чек, вы не сделали должным образом то, что я предложил. – prototypical

+0

Что значит «проверить, какая штука»? вы имеете в виду верхнюю, левую, нижнюю и правую? Как мне изменить его, чтобы я мог видеть, какую часть? Изменение альфы каждого символа просто делает их прозрачными. – grimrader22