0

我正在制作我的 Flash 游戏,但是……碰撞是我的大问题。我尝试了每个网站,但没有任何效果。

播放器的代码是这样的:

    onClipEvent(enterFrame){
        if(Key.isDown(Key.RIGHT)) {
            this._x+=3
        }
            if(Key.isDown(Key.LEFT)) {
            this._x-=3
        }
            if(Key.isDown(Key.UP)) {
            this._y-=3
        }
            if(Key.isDown(Key.DOWN)) {
            this._y+=3
        }

    }

Collision:

    if(cityhallLeftWall.hitTest(Player._x+Player._width/2, Player._y, true)){
    Player._x -=0
    }
    if(cityhallRightWall.hitTest(Player._x-Player._width/2, Player._y, true)){
    Player._x +=0
    }
    if(cityhallTopWall.hitTest(Player._x, Player._y+Player._height/2, true)){
    Player._y +=0
    }
    if(cityhallBottomWall.hitTest(Player._x, Player._y-Player._height/2, true)){
    Player._y -=0
    }

播放器的影片剪辑被命名为“播放器”。该建筑的短片被命名为“cityhall”。所以,我想例如当电影剪辑播放器接触到电影剪辑市政厅时,y 和 x 速度得到 0 或类似的东西。只是不可能找到解决方案,所以我决定在这里寻求帮助。

谢谢 :)

4

4 回答 4

0

您应该使 += 与玩家的速度具有相等的排斥力,即如果您的玩家以每帧 5 像素的 x 速度撞到墙,则墙应该在相反的方向上为玩家增加 5 像素的速度,这样您就会得到净运动为零。

于 2016-06-23T22:32:21.653 回答
0

自从我在 AS2 中做任何事情以来已经有一段时间了,但我会尝试一下。

首先,为玩家的速度设置一个变量。它可能看起来像这样:

var speedX:Number = 0;

现在,在您的 enterFrame 函数中,添加以下内容:

Player._x += speedX; //

接下来,在每个 hitTest 方法中,执行以下操作:

if(cityhallLeftWall.hitTest(Player._x+Player._width/2, Player._y, true)){
    speedX = 0;
}

你需要对 y 方向做同样的事情。我相信你可以从这里弄清楚。干杯!

于 2016-07-11T01:53:28.520 回答
0

首先是代码,因为大多数人没有它就没有阅读的动力(在我的测试中,它被放置在movieclip Player中,或者对我来说只是movieclip P)

    onClipEvent(enterFrame){
    if(Key.isDown(Key.RIGHT)) {
        this._x+=3
    }
        if(Key.isDown(Key.LEFT)) {
        this._x-=3
    }
        if(Key.isDown(Key.UP)) {
        this._y-=3
    }
        if(Key.isDown(Key.DOWN)) {
        this._y+=3
    }
if(_root.cityhallLeftWall.hitTest(this._x-this._width/2, this._y, true)){
this._x +=3;
}
if(_root.cityhallRightWall.hitTest(this._x+this._width/2, this._y, true)){
this._x -=3;
}
if(_root.cityhallTopWall.hitTest(this._x, this._y-this._height/2, true)){
this._y +=3;
}
if(_root.cityhallBottomWall.hitTest(this._x, this._y+this._height/2, true)){
this._y -=3;
}
}

我测试了这段代码并找出了你的问题。这将很难用语言理解,所以请耐心等待(没有声誉点来发布图片)。

1.在测试右墙撞击测试时,您没有使用 Player._x+Player._width/2 但 Player._x-Player._width/2 这不起作用,因为您测试了字符的左边缘和右边缘墙,因此玩家在被推出时将“进入”墙内。

2.你对左墙犯了同样的错误,测试右边缘。

3.您没有像其他答案中提到的那样从播放器中减去速度,而是从播放器当前位置中减去 0,这没有任何作用,在这种情况下,您必须减去玩家在每个方向上移动的量 3 (上下左右)。

4.您的碰撞检查线不在输入帧括号中,因此只会在 swf 启动时检查一次,而不是每一帧。

5.这不是一个错误,而是提示使用while循环,就像当前的“if”一样,你会注意到如果玩家走到墙边并设法以某种方式进入并且直到按下方向键他可以留在里面墙但是虽然这不可能发生。

while循环的代码:

     onClipEvent(enterFrame){
     if(Key.isDown(Key.RIGHT)) {
        this._x+=3
     }
        if(Key.isDown(Key.LEFT)) {
        this._x-=3
    }
        if(Key.isDown(Key.UP)) {
        this._y-=3
    }
        if(Key.isDown(Key.DOWN)) {
        this._y+=3
    }

while(_root.cityhallLeftWall.hitTest(this._x-this._width/2, this._y, true)){
this._x +=3;
}
while(_root.cityhallRightWall.hitTest(this._x+this._width/2, this._y, true)){
this._x -=3;
}
while(_root.cityhallTopWall.hitTest(this._x, this._y-this._height/2, true)){
this._y +=3;
}
while(_root.cityhallBottomWall.hitTest(this._x, this._y+this._height/2, true)){
this._y -=3;
}
}

希望这行得通,祝你好运。

于 2016-08-01T18:30:54.523 回答
0

问题在于玩家的坐标。它们不是全球性的。

在你的碰撞函数中试试这个:

// store player's new local position in an object
var playerGlobalPosition = {
    x:Player._x,
    y:Player._y
};

// translate local position to global
Player.localToGlobal(playerGlobalPosition);

然后针对这些全局坐标进行测试:

if(cityhallLeftWall.hitTest(playerGlobalPosition.x + (Player._width/2), playerGlobalPosition.y, true)){
    Player._x -= 3; // as mentioned before, replace those 0 values with 3
}

解释:

在 hitTest 方法中,x 和 y 坐标在全局坐标空间中定义。因此,如果我们的坐标(Player._x 和 Player._y)是本地的,我们应该在应用该方法之前将它们转换到全局空间。 更多herehere

于 2017-04-09T07:37:26.670 回答