Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flash碰撞检测(Platformer游戏)_Actionscript 3_Flash_Collision Detection_Game Physics_Rectangles - Fatal编程技术网

Actionscript 3 Flash碰撞检测(Platformer游戏)

Actionscript 3 Flash碰撞检测(Platformer游戏),actionscript-3,flash,collision-detection,game-physics,rectangles,Actionscript 3,Flash,Collision Detection,Game Physics,Rectangles,我正在尝试用flash制作一个platformer游戏,使用ActionScript3。目前,除一件事外,一切正常 问题是: 当玩家与平台底部碰撞时,如果他的xVel不等于零,则调用水平碰撞检测循环,玩家将水平和垂直移动。这意味着他从下方跳出平台,但也被移动到平台的一侧。如果玩家的xVel等于零,则一切正常。这是因为没有调用水平碰撞循环。我不明白为什么会这样。任何帮助都将不胜感激 守则: import flash.events.Event; import flash.geom.Rectangle

我正在尝试用flash制作一个platformer游戏,使用ActionScript3。目前,除一件事外,一切正常

问题是:

当玩家与平台底部碰撞时,如果他的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;   
}
导入flash.events.Event;
导入flash.geom.Rectangle;
变量级别:数组=新数组();
var xVel=0;
var-yVel=0;
var xSpeed=15;
var-accel=1.5;
var-grav=2;
var跳线高度=15*grav;

对于(var i=0;i您需要首先测试天花板碰撞,并在水平检查之前进行相应调整。如果您不这样做,则在执行水平检查时,您的播放器与平台底部发生碰撞。

我重新定位了for循环,但没有任何更改。在您的水平测试循环中,您是否将alpha旋转你碰撞到的平台是0.50,这样你就可以看到是哪一块造成了碰撞。如果在你检查时它仍然与顶部碰撞,你就没有正确地执行我的建议。你说的“检查哪一块”是什么意思?你是说顶部、左侧、底部和右侧?我如何更改它以便我可以看到哪一块?更改alpha每一个符号的形状都是透明的。无论是这样,还是你的数学计算都允许玩家仍然与天花板平台发生碰撞,即使在碰撞被处理之后。我要求你更改alpha,这样就可以清楚地看到你碰撞的是哪一块。这是一个视觉辅助工具。如果你按照我的建议正确操作,并且你的数学是正确的,你应该我不会和那顶平台相撞的。
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;
            }
        }
    }