所以我一直在用Action Script 3和CS5.5制作这个游戏。当你在太空中飞行时,你要做的是避开小行星。我认为让太阳系外的行星在整个游戏的背景中沿着屏幕移动是很酷的。看起来像是你从他们身边飞过。我这样做的方式是每秒在他们的y坐标上增加5个。一旦他们的y坐标达到600 (屏幕底部),我会添加一个新的行星来做同样的事情。由于某种原因,一旦我到达土星,一切都变得很奇怪。土星很早就来了,天王星也是。我不知道发生了什么。我对此感到沮丧了整整一个小时。这就是我认为存在问题的部分。
公共函数onTick(TimerEvent:TimerEvent):空{
earth.PlanetMovement(5);
if (earth.y==600)
{
mars.PlanetsStart(300, -100);
addChild( mars );
levels=levels+5;
}
mars.PlanetMovement(5);
if (mars.y==600)
{
jupiter.PlanetsStart(300,-150);
addChild (jupiter);
levels=levels+10;
}
jupiter.PlanetMovement(5);
if (jupiter.y==600)
{
saturn.PlanetsStart(300,-155);
addChild (saturn);
levels=levels+20;
}
saturn.PlanetMovement(5);
if (saturn.y==600)
{
uranus.PlanetsStart(300,-160)
addChild ( uranus);
levels=levels+25;
}
uranus.PlanetMovement(5);PlanetMovement和PlanetsStart是Planets类中的两个函数。如果您需要更多信息,请告诉我。
编辑:我想我应该进一步解释一下。PlanetsStart是一个具有每个电影剪辑的起始坐标的函数。因此,一旦地球的y坐标达到600,那么火星就从(300,-100)开始。然后将其添加到屏幕上。级别是一个变量,用于提高每个fps的分数。PlanetMovement是每个电影剪辑将移动每个fps的量。如果我使用>=,那么分数会提高太多。
这就是发生的事情。地球出现在它应该出现的地方。然后火星就会准时出现。然后出于某种原因,土星突然出现在火星的中央,木星也出现了。在此之后,土星到达底部,使天王星出现。然后木星到达底部,一切都像它应该的那样工作。土星出现,然后天王星按顺序出现
发布于 2012-04-25 11:22:30
呃。不幸的是,这比您所暗示的要复杂得多。首先编写某种类型的代码计划,开发一些显示基本逻辑(和逻辑错误)的伪代码,然后再编写代码,这真的会对您有所帮助。
下面是一个更好的构建这个想法的方法的例子。然而,我不认为你的想法是可怕的记忆意识。您应该只在需要时引入行星,并在需要时将其移除。研究一种名为“对象池”的技术,以帮助更好地组织这一过程。
太阳系类:
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.geom.Point;
public class SolarSystem extends MovieClip
{
private var PLANET_NAMES:Array = new Array("earth", "mars", "jupiter", "saturn", "uranus");
// you will have to fix these values:
private var PLANET_STARTS:Array = new Array(new Point(300, -100), new Point(300, -100),new Point(300, -100),new Point(300, -100),new Point(300, -100));
private var planets:Array;
private var maxY:Number = 600;
private var speed:Number = 5;
private var levels:Number = 0;
private var levelIncrement:Number = 5;
public function SolarSystem()
{
super();
addEventListener(Event.ADDED_TO_STAGE, initHnd, false, 0, true);
}
private function initHnd(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, initHnd);
runPlanets();
addEventListener(Event.ENTER_FRAME, frameHnd, false, 0, true);
}
private function runPlanets():void
{
for (var i:int = 0; i < PLANET_NAMES.length; i++)
{
planets[i] = new Planet();
planets[i].name = PLANET_NAMES[i];
Planet(planets[i]).startPlanet(PLANET_STARTS[i]);
this.addChild(planets[i]);
}
}
private function frameHnd(e:Event):void
{
if(planets && planets.length > 0){
// move all the planets until they are too low, then remove them.
// decrementing loop because planets will be being removed occasionally.
for (var i:int = planets.length -1; i >= 0; i--)
{
if (planets[i] && Planet(planets[i]).y >= maxY) {
// this seems very strange to me, but it will replicate what your code says:
levels += (levels + levelIncrement);
try {
removeChild(Planet(planets[i]));
planets[i] = null;
}catch (e:Error) { }
} else if ( Planet(planets[i]).isMoving ){
Planet(planets[i]).movePlanet(0, speed);
}
}
} else {
removeEventListener(Event.ENTER_FRAME, frameHnd);
}
}
}
}下面是planet类:
package
{
import flash.display.MovieClip;
public class Planet extends MovieClip
{
private var _isMoving:Boolean = false;
public function Planet()
{
super();
}
public function startPlanet(sx:Number, sy:Object):void
{
this.x = sx;
this.y = sy;
isMoving = true;
}
public function movePlanet(dx:Number, dy:Number):void
{
if (isMoving)
{
this.x += dx;
this.y += dy;
}
}
public function get isMoving():Boolean
{
return _isMoving;
}
public function set isMoving(value:Boolean):void
{
_isMoving = value;
}
}
}同样,这不是实现这一点的最佳方法,但将概念和操作分组到类中更易于管理。
HTH。
发布于 2012-04-25 10:18:38
一开始我就看到了一个大问题。从以下位置更改所有语句:
if (saturn.y==600)至
if (saturn.y>=600)只是说==意味着只有在Y值恰好为600的情况下才会触发条件。
注意:您也可以将levels = levels+20之类的内容简单地更改为levels += 20;。
发布于 2012-04-25 10:19:48
在像这样移动东西时,最好使用">=“而不是"==”来检查位置。如果你的对象从y=1开始呢?那么它永远不会达到600,它将永远继续下降。
而且,即使PlanetsStart还没有被调用,您似乎也在调用PlanentMovement。
https://stackoverflow.com/questions/10308369
复制相似问题