使用FLEX和Actionscript开发FLASH 游戏-碰撞检测(第六页)
Level.as
package
{
import flash.events.*;
import flash.geom.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import mx.collections.ArrayCollection;
import mx.core.*;
public class Level
{
protected static var instance:Level=null;
protected static const TimeBetweenLevelElements:Number=2;
protected static const TimeBetweenEnemies:Number=3;
protected static const TimeBetweenClouds:Number=2.5;
protected static const TimeToLevelEnd:Number=2;
protected var timeToNextLevelElement:Number=0;
protected var levelElementGraphics:ArrayCollection=new ArrayCollection();
protected var timeToNextEnemy:Number=0;
protected var enemyElementGraphics:ArrayCollection=new ArrayCollection();
protected var timeToNextCloud:Number=0;
protected var timeToLevelEnd:Number=0;
public var levelEnd:Boolean=false;
static public function get Instance():Level
{
if(instance==null)
instance=new Level();
return instance;
}
public function Level(caller:Function=null)
{
if(Level.instance!=null)
throw new Error("Only one Singleton instance should be instantiated");
levelElementGraphics.addItem(ResourceManager.SmallIslandGraphics);
levelElementGraphics.addItem(ResourceManager.BigIslandGraphics);
levelElementGraphics.addItem(ResourceManager.VolcanoIslandGraphics);
enemyElementGraphics.addItem(ResourceManager.SmallBluePlaneGraphics);
enemyElementGraphics.addItem(ResourceManager.SmallGreenPlaneGraphics);
enemyElementGraphics.addItem(ResourceManager.SmallWhitePlaneGraphics);
}
public function startup():void
{
timeToNextLevelElement=0;
new Player().startupPlayer();
timeToLevelEnd=TimeToLevelEnd;
levelEnd=false;
}
public function shutdown():void
{
}
public function enterFrame(dt:Number):void
{
//add a background element
timeToNextLevelElement-=dt;
if(timeToNextLevelElement<=0)
{
timeToNextLevelElement=TimeBetweenLevelElements;
var graphics:GraphicsResource=levelElementGraphics.getItemAt
(MathUtils.randomInteger(0,levelElementGraphics.length))as GraphicsResource;
var backgroundLevelElement:BackgroundLevelElement=
BackgroundLevelElement.pool.ItemFromPool as BackgroundLevelElement;
backgroundLevelElement.startupBackgroundLevelElement(
graphics,
new Point(Math.random()*Application.application.width,-graphics.bitmap.height),
ZOrders.BackgroundZOrder,
50);
}
//add an enemy
timeToNextEnemy-=dt;
if(timeToNextEnemy<=0)
{
timeToNextEnemy=TimeBetweenEnemies;
var enemygraphics:GraphicsResource=enemyElementGraphics.getItemAt
(MathUtils.randomInteger(0,enemyElementGraphics.length))as GraphicsResource;
var enemy:Enemy=Enemy.pool.ItemFromPool as Enemy;
enemy.startupBasicEnemy(
enemygraphics,
new Point(Math.random()*Application.application.width,-
enemygraphics.bitmap.height),
55);
}
//add cloud
timeToNextCloud-=dt;
if(timeToNextCloud<=dt)
{
timeToNextCloud=TimeBetweenClouds;
var cloudsBackgroundLevelElement:BackgroundLevelElement=
BackgroundLevelElement.pool.ItemFromPool as BackgroundLevelElement;
cloudBackgroundLevelElement.startupBackgroundLevelElement(
ResourceManager.CloudGraphics,
new Point(Math.random()*Application.application.width,-
ResourceManager.CloudGraphics.bitmap.height),
ZOrders.CloudsBelowZOrder,
75);
}
if(levelEnd)
timeToLevelEnd-=dt;
if(timeToLevelEnd<=0)
Application.application.currentState="MainMenu";
}
}
}
在Level类中做的改变仅仅让它在游戏者死亡时通过levelEnd属性被告知。当在enterFrame函数中使用timeToLevelEnd属性设置一个倒数计数器时,而且当timeToLevelEnd为0时状态被返回到MainMenu让我们回到主菜单屏幕。
碰撞检测在任何动作游戏中都是基本的。在本系列论文中我们实现了一个简单的,但是有效的碰撞检测系统,使得游戏者现在可以和游戏中的其他元素交互作用了,看起来就好像能够射下敌机。不幸的是目前的射下敌机实际上不是很令人满意,因为它们只是消失了。在本系列第七部分我们将增加一些动画到游戏里,来做一个好的爆炸效果。
在 http://flexfighters.sourceforge.net/flexfighters6.html处可查看最终效果,从 https://sourceforge.net/project/showfiles.php?group_id=241490&package_id=293860&release_id=632042处可下载资源。
<Previous Page | page: 1 2 3 4 5 6| Next Article in Series>