我正在制作一个横向侧滚动游戏,其中玩家的目标是尽可能地在游戏中获得。为了玩游戏,玩家必须跳过放在地面上的物体(岩石)。他还必须通过在这些冰上物体上射击一个物体(现在是一个球)来摧毁悬挂在舞台顶部的物体(冰)。我已经设法使游戏的跳跃部分工作,但我在设法让玩家破坏冰块时遇到了困难。
冰对象是将Movieclips放置在舞台上的容器中,使用for循环和一些数学randoms。玩家可以在这些冰块上射击物体来摧毁它们。我创建了一个在玩家的球击中冰块时激活的功能。两个对象在命中时都会消失,应该从容器中移除。此功能似乎确实移除了被击中的冰对象和玩家从舞台上射击的球。但是这两个对象仍然在容器中,你只是看不到它们。使玩家仍然可以击中冰块并死亡。玩家射击的球(不可见)也继续移动并摧毁正在容器中产生的所有冰对象,在玩家甚至看到它们之前摧毁所有冰对象。我已经尝试了几种方法来解决这个问题,但每当我解决问题时,似乎都会创建另一个。
这是我生成冰块并让它们移动的代码, 从右向左滚动:
/*placing ice objects in container cave*/
var k:int = 0;
var p:MovieClip;
for (k=0; k<=50; k++)
{
var scalexwaarde = Math.random();
if (scalexwaarde<0.4)
{
scalexwaarde = 0.4;
}
else if (scalexwaarde>0.8)
{
scalexwaarde = 0.8;
}
var scaleywaarde = Math.random();
if (scaleywaarde<0.3)
{
scaleywaarde = 0.3;
}
else if (scaleywaarde>0.9)
{
scaleywaarde = 0.9;
}
var rndm:int = (Math.floor(Math.random()*100))+1;
p = new ice();
cave.addChild(p);
p.y = 230;
p.scaleX = scalexwaarde * 1.1;
p.scaleY = scaleywaarde * 1.1;
p.x = 800 + (220 * rndm);
p.addEventListener(Event.ENTER_FRAME, move_ice);
p.addEventListener(Event.ENTER_FRAME, raakSnot);
p.addEventListener(Event.ENTER_FRAME, raken);
}
/*function for moving ice objects*/
var snelh:int = 9;
function move_ice(e:Event):void
{
e.target.x -= snelh;
}
用于创建玩家可以拍摄并使其移动的对象的代码:
/*creating the object*/
var s:MovieClip = new sneeze();
/*if the space is clicked, add to container cave*/
if (evt.keyCode == Keyboard.SPACE) // sneeze when pressed
{
cave.addChild(s);
s.x = n.x;
s.y = n.y;
s.addEventListener(Event.ENTER_FRAME, niezen);
}
/*making player object move and define speed*/
var snelhsneeze:int = 15;
function niezen(evt:Event):void
{
evt.target.x += snelhsneeze;
}
用于处理任何对象命中的代码:
/*function that switches to game over screen when
the player hits an object.*/
function raken(evt:Event):void
{
if (evt.target.hitTestPoint(n.x - 15,n.y,false) == true)
{
gotoAndStop(5);
grondGeraakt = false;
scrollSpeed = 0;
speed = 0;
snelh = 0;
while (cave.numChildren)
{
cave.removeChildAt(0);
}
}
else if (grondGeraakt == false)
{
}
}
用于处理最冰对象的代码(问题在这里):
/*FUNCTION THAT IS GIVING PROBLEMS*/
/*function activated when ball object hits ice object*/
function raakSnot(evt:Event)
{
if (evt.target.hitTestPoint(s.x,s.y-15,false) == true)
{
if(s.parent) // remove child s and its events (ball object)
{
s.parent.removeEventListener(Event.ENTER_FRAME, niezen);
s.parent.removeChild(s);
}
if(MovieClip(evt.target).parent) // remove ice object and its events
{
MovieClip(evt.target).parent.removeEventListener(Event.ENTER_FRAME, raken);
MovieClip(evt.target).parent.removeChild(MovieClip(evt.target));
}
}
}
对此问题的任何帮助都将受到高度赞赏,因为我真的不知道出了什么问题。提前谢谢!
答案 0 :(得分:0)
即使你已经移除了这个物体,所有活跃的冰仍然会在指定的点上被击中(不是物体,它被移除但保留了它的x和y属性值)。如果像“sneezeActive”这样的布尔值为真,你应该做的只是检查碰撞。
if (evt.target.hitTestPoint(n.x - 15,n.y,false)&&sneezeActive)
如果检测到碰撞,则应将sneezeActive设置为false。每次玩家打喷嚏时,将sneezeActive设置为true。这样,基于该点可以检测到碰撞的唯一时间是喷嚏是否有效,之后它被停用直到执行另一个喷嚏。