所以我一直用Action Script 3和CS5.5制作这个游戏。你要做的是在飞越太空时避免小行星。我认为让太阳系中的行星在整个游戏过程中在屏幕上向下移动会很酷。有点让它看起来像你飞过他们。我这样做的方式是每秒每帧增加5个y坐标。一旦他们的y坐标达到600(屏幕的底部),我会添加一个新行星,它会做同样的事情。出于某种原因,一旦我到达土星,一切都变得奇怪。土星来得很早,天王星也是如此。我不知道发生了什么事。我对这个好时光感到沮丧。这是我认为存在问题的部分。
public function onTick(timerEvent:TimerEvent):void {
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是一个具有每个动画片段的起始坐标的函数。因此,一旦地球达到600的y坐标,则火星开始于(300,-100)。然后它被添加到屏幕上。 levels是一个变量,可以提高每个fps的分数。 PlanetMovement是每个动画片段将移动每个fps的程度。如果我使用> =则分数会提高太多。这正是发生的事情。地球出现在它应该的位置。然后火星按时出现。然后由于某种原因,土星在火星和木星中间弹出。在土星到达底部后,天王星出现了。然后木星到达底部,一切正常。土星出现,然后天王星按顺序出现
答案 0 :(得分:2)
唉。不幸的是,这比你所暗示的要复杂得多。它真的可以帮助你编写某种类型的代码计划,开发一些伪代码,显示基本逻辑(和逻辑错误),然后编码。
以下是构建此想法的更好方法的示例。但是,我不认为你的想法是可怕的记忆意识。你应该只根据需要引入行星,并根据需要移除它们。研究一种称为“对象池”的技术,以帮助更好地构建它。
太阳系类:
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);
}
}
}
}
这是行星类:
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。
答案 1 :(得分:0)
马上,我可以看到一个重大问题。更改以下所有语句:
if (saturn.y==600)
到
if (saturn.y>=600)
只是说==表示只有在你的Y值正好是600的情况下你才会触发条件。
请注意,您也可以将levels = levels+20
之类的内容更改为levels += 20;
。
答案 2 :(得分:0)
当像这样移动东西时,最好使用“&gt; =”而不是“==”来检查位置。如果你的对象从y = 1开始怎么办?然后它永远不会达到600,它会永远地继续下去。
即使还没有调用PlanetsStart,你似乎也在调用PlanentMovement。