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