我有两个碰撞问题,当多次按下移动键时,玩家可以在对象中出现故障,并且一旦接触到对象的任何一侧,玩家的x
和y
移动都会停止。它应该只停止x
或y
,具体取决于它所接触的那一面。
当它接触边界框的左/右侧时,它仍然可以上下移动。当它接触边界框的顶部/底部时,它应该能够左右移动。
我在Player类ENTER_FRAME
内的移动代码:
private function onEnterFrame(event:Event):void
{
_vx = 0;
_vy = 0;
if (isRight)
{
_vx = 5;
}
if (isLeft)
{
_vx = -5;
}
if (isUp)
{
_vy = -5;
}
if (isDown)
{
_vy = 5;
}
x += _vx;
y += _vy;
}
我在CollisionBase类ENTER_FRAME
中的hitTestObject代码(MovieClips
的基类):
private function onEnterFrame(event:Event):void
{
if (MovieClip(parent).player.collisionArea.hitTestObject(this))
{
if (MovieClip(parent).player.isLeft)
{
MovieClip(parent).player.x -= MovieClip(parent).player._vx;
}
if (MovieClip(parent).player.isRight)
{
MovieClip(parent).player.x -= MovieClip(parent).player._vx;
}
if (MovieClip(parent).player.isUp)
{
MovieClip(parent).player.y -= MovieClip(parent).player._vy;
}
if (MovieClip(parent).player.isDown)
{
MovieClip(parent).player.y -= MovieClip(parent).player._vy;
}
}
}
FLA
档案:https://www.dropbox.com/s/k5dlxrsnvbrmtke/Subject.zip?dl=0
FLA
文件包含一个玩家和一张可以碰撞的床。
答案 0 :(得分:1)
您的游戏设计结构不合理。游戏逻辑应该只有一个ENTER_FRAME
。除此之外,您有一个ENTER_FRAME
用于玩家,一个ENTER_FRAME
用于交换子项,一个ENTER_FRAME
用于每个障碍。这种设计让您不止一次头疼,并将您的游戏性能放在场上。
要解决hitTest
的问题,请执行以下操作:
将此代码放入CollisionBase
Class
:
private function onEnterFrame(event:Event):void
{
var player:MovieClip = MovieClip(this.parent).player;
if (player.collisionArea.hitTestObject(this)) player.collision = true;
}
将此媒体资源添加到Player
Class
:
private var _collision:Boolean = false;
public function set collision(value:Boolean):void{
_collision = value;
}
然后,在onEnterFrame
函数的开头添加这些行:
private function onEnterFrame(event:Event):void
{
if(_collision){
x -= _vx;
y -= _vy;
_collision = false;
return;
}
_vx = 0;
_vy = 0;
if (isRight)
{
....
问题已解决,但现在你的玩家在遇到障碍时会闪烁。发生这种情况是因为玩家ENTER_FRAME
移动玩家,然后其他ENTER_FRAME
检查碰撞(在CollisionBase.class
中)并且在玩家ENTER_FRAME
的下一个周期中玩家执行退后。如果您有一个ENTER_FRAME
,那么这种事情永远不会发生。
我建议你另外一个选择。看看这个例子,看看它是如何制作的,也许它会给你一些想法;)