Я пытаюсь создать платформерную игру во 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;
}
}
}
картина!
Дополнительная информация:
Платформы кино символы клипа, все происходящие из того же символа. Их тянут на холст и размер. Символ платформы имеет связь AS называется «платформа», которая, как идентифицируются ребенок в качестве платформы в коде
игрока представляет собой прямоугольник без какой-либо анимации
Обе платформы и игрок имеет ориентацию в центр объекта.
Я снова позиционировал for-loops и ничего не изменил. – grimrader22
В вашем горизонтальном тестовом цикле, как насчет того, как вы поворачиваете альфа платформы, с которой вы сталкиваетесь .50, чтобы вы могли видеть, какая часть вызывает столкновение. Если он сталкивается с верхней частью, когда вы делаете чек, вы не сделали должным образом то, что я предложил. – prototypical
Что значит «проверить, какая штука»? вы имеете в виду верхнюю, левую, нижнюю и правую? Как мне изменить его, чтобы я мог видеть, какую часть? Изменение альфы каждого символа просто делает их прозрачными. – grimrader22