Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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 在AS3中使用BitmapData进行hitTesting-我的播放器沉入平台_Actionscript 3_Flash_Collision Detection_Game Physics_Hittest - Fatal编程技术网

Actionscript 3 在AS3中使用BitmapData进行hitTesting-我的播放器沉入平台

Actionscript 3 在AS3中使用BitmapData进行hitTesting-我的播放器沉入平台,actionscript-3,flash,collision-detection,game-physics,hittest,Actionscript 3,Flash,Collision Detection,Game Physics,Hittest,我正在做一个拼盘。以下是我到目前为止的情况: (使用箭头键四处走动和跳跃) 当你从跳跃中落地时,你会在地面上下沉几个像素,然后被推上(我不喜欢这样) 当你走下山时,你会失去与地面的接触,而地面看起来很不稳(我不喜欢这样) 当你上山时,你被推到山顶的速度非常慢(我尤其不喜欢这样) 我基本上希望玩家在行走时能够沿着山的轮廓移动(除非山太陡,我想我以后会解决这个问题)。 有什么办法可以做到这一点吗 这是我的代码(现在只是时间线上的代码,直到我真正知道怎么做。舞台上有两个电影剪辑-playerClip和

我正在做一个拼盘。以下是我到目前为止的情况: (使用箭头键四处走动和跳跃)

当你从跳跃中落地时,你会在地面上下沉几个像素,然后被推上(我不喜欢这样)

当你走下山时,你会失去与地面的接触,而地面看起来很不稳(我不喜欢这样)

当你上山时,你被推到山顶的速度非常慢(我尤其不喜欢这样)

我基本上希望玩家在行走时能够沿着山的轮廓移动(除非山太陡,我想我以后会解决这个问题)。 有什么办法可以做到这一点吗

这是我的代码(现在只是时间线上的代码,直到我真正知道怎么做。舞台上有两个电影剪辑-playerClip和groundClip):

导入flash.geom.Rectangle;
导入flash.display.BitmapData;
导入flash.events.Event;
导入flash.geom.Point;
导入flash.events.KeyboardEvent;
//位图数据资料
var groundRect:Rectangle=groundClip.getBounds(这个);
var groundClipBmpData=新的位图数据(groundRect.width,groundRect.height,true,0);
groundClipBmpData.draw(groundClip);
var playerRect:Rectangle=playerClip.getBounds(这个);
var playerClipBmpData=新位图数据(playerRect.width,playerRect.height,true,0);
playerClipBmpData.draw(playerClip);
//球员运动变量
变量跳跃:布尔=假;
var-grounded:Boolean=false;
var moveRight:Boolean=false;
var moveLeft:Boolean=false;
var xMove=0;
var-yMove=0;
常数跳跃强度=10;
常数xMax=5;
常数xAccel=1;
恒重力=1;
addEventListener(Event.ENTER\u FRAME,enterFrame);
stage.addEventListener(键盘事件.KEY\u DOWN,onKeyPress);
stage.addEventListener(KeyboardEvent.KEY\u UP,onKeyRelease);
函数enterFrame(e:事件):无效{
/*----球员运动----*/
//运动加速度
if(moveLeft==true){
xMove-=xAccel;
}else if(moveRight==true){
xMove+=xAccel;
}否则如果(xMove>0){
xMove-=xAccel;
}否则如果(xMove<0){
xMove+=xAccel;
}
//最大步行速度
如果(xMove>xMax){
xMove=xMax;
}否则如果(xMove<-xMax){
xMove=-xMax;
}
//跳跃
如果(跳转==真){
接地=假;
yMove=-跳跃强度;
跳跃=假;
}
/*----位图数据资料----*/
var playerRect:Rectangle=playerClip.getBounds(这个);
var playerOffset:Matrix=playerClip.transform.Matrix;
playerOffset.tx=playerClip.x-playerRect.x;
playerOffset.ty=playerClip.y-playerRect.y;
var playerClipBmpData=新位图数据(playerRect.width,playerRect.height,true,0);
playerClipBmpData.draw(playerClip,playerOffset);
var groundRect:Rectangle=groundClip.getBounds(这个);
var groundClipBmpData=新的位图数据(groundRect.width,groundRect.height,true,0);
var groundOffset:Matrix=groundClip.transform.Matrix;
groundOffset.tx=groundClip.x-groundRect.x;
groundOffset.ty=groundClip.y-groundRect.y;
groundClipBmpData.draw(groundClip,groundOffset);
//坐标
变量rLoc:Point=新点(groundRect.x,groundRect.y);
变量组:点=新点(playerRect.x,playerRect.y);
//玩家的未来坐标
变量bLocFuture:Point=新点(playerRect.x+xMove,playerRect.y+yMove);
//用玩家的未来坐标击中测试场
如果(地面CLIPBMPDATA.hitTest(rLoc,
255,
playerClipBmpData,
bLocFuture,
255
)) {
接地=正确;
playerClip.y--;
yMove=0;
}否则{
yMove+=重力;
}
//移动玩家
playerClip.y+=yMove;
playerClip.x+=xMove;
//删除无用的位图数据以节省内存
playerClipBmpData.dispose();
groundClipBmpData.dispose();
}
按键功能(e:键盘事件):无效{
如果(e.keyCode==37){
moveLeft=true;
moveRight=false;
}否则如果(e.keyCode==39){
moveRight=true;
moveLeft=false;
}否则如果(e.keyCode==38){
如果(接地==真){
跳跃=真;
}
}
}
功能onKeyRelease(e:键盘事件):无效{
如果(e.keyCode==37){
moveLeft=false;
}否则如果(e.keyCode==39){
moveRight=false;
}
}

我想你想要改变的是,让玩家在水面上行走,而不是上浮:

if (groundClipBmpData.hitTest(rLoc,
    255,
    playerClipBmpData,
    bLocFuture,
    255
      )) {
        grounded = true;
        playerClip.y--;
        yMove = 0;
    } else {
        yMove += GRAVITY;
    }
您要做的是这样的:

if(groundClipBmpData.hitTest(rLoc, 255, playerClipBmpData, bLocFuture, 255))
{
    yMove += GRAVITY;
} 
else
{
    grounded = true;
    yMove = 0;
}

while(groundClipBmpData.hitTest(rLoc, 255, playerClipBmpData, bLocFuture, 255))
{
    playerClip.y--;
}
playerClip.y++;

请注意,如果(xMove>xMax)xMove=xMax,有一种很好的方法。xMove=Math.max(xMove,xMax);//我现在就开始回答-你的代码评论得很好谢谢你的回复。我最后稍微修改了一下代码。。我只需要找到我在另一个更简单的问题中概述的某个坐标:
if(groundClipBmpData.hitTest(rLoc, 255, playerClipBmpData, bLocFuture, 255))
{
    yMove += GRAVITY;
} 
else
{
    grounded = true;
    yMove = 0;
}

while(groundClipBmpData.hitTest(rLoc, 255, playerClipBmpData, bLocFuture, 255))
{
    playerClip.y--;
}
playerClip.y++;