我正在制作我的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”。 所以,我希望例如当movieclip播放器触及movieclip cityhall时,y和x的速度为0或类似的东西。 找到解决方案是不可能的,所以我决定在这里寻求帮助。
谢谢:)
答案 0 :(得分:0)
你应该让+ =对玩家的速度具有同等的排斥力,即I.E.如果你的玩家以每帧5个像素的x速度撞到一堵墙,那么墙应该向玩家增加5个像素的速度,这样你的净移动就会为零。
答案 1 :(得分: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方向做同样的事情。我相信你可以从这里弄明白。干杯!
答案 2 :(得分:0)
首先是代码,因为大多数人在没有它的情况下没有动力去阅读(这在我的测试中被放置在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循环代码:
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;
}
}
希望这有效,祝你好运。
答案 3 :(得分: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)是本地的,我们应该在应用该方法之前将它们转换为全局空间。 More here和here