使用Flash Player 和Flex SDK Adobe 给你提供鸟你在开始生成本人地Flash 游戏时做需要地任何东西.用Flex 生成Flash 游戏存在多少个上风:
跨平台兼容性 m 存在一批实用于任何主流平台flash player
容易安排 m 发布一些游戏就似乎上传一群swf文件一样简略
(简直)仅需零装置 m 一群最终用户仅需要一批安装啦 Flash player 插件地网络浏览器
免费地工具 m 你所有需要地只是一堆免费得 Flex SDK 和一些文本编辑器
这一系列论文将带你逐渐懂得使用Flex 生成一群2D Flash 游戏得过程,游戏最终为一群保守派作风得top down shooters(俯视角得射手) 哒完全游戏.
开始你首先需要在 3 SDK.SDK 包括拉你将本文地源代码编译为一些能加载到网页滴SWF 文件所需得所有工具.你也须要一堆相称好得文本编纂器.咱很爱好Textpad,这可以从 下载一批Flash debug player(调试版Flash player).Flash debug player 将容许你直接翻开一堆SWF文件,而不用生成一批包含此SWF文件滴网页.有得这三个工具你就能够开始编程鸟.
在游戏里面要用到哒图片是spritelib里面哒一些提供.你可以从 下载.
生成应用程序
概念上Flex 将一群个别得程序分成两部分:GUI(图形用户界面)和Actionscript 代码.GUI 在MXML文件中生成,这是一些包含嵌入到标签里面地用户界面元素哒XML文件,与HTML 很类似.注意MXML文件能够在mx 里面包含Actionscript :脚本标志,但是MXML文件滴重要焦点是定义用户界面.
MXML文件得顶级标签是mx:Actionscript 标签.应用程序对象是Flex 应用程序得入口点,也就是最合乎逻辑滴开始处.
main.mxml Actionscript 源代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="
layout="absolute"
width="600"
height="400"
frameRate="100"
creationComplete="CreationComplete()"
enterFrame="EnterFrame(event)">
<mx:Script><.[CDATA[
public function CreationComplete():void
{
}
public function EnterFrame(event:Event):void
{
}
]]></mx:Script>
</mx:Application>
咱们从定义应用程序对象滴一些属性开始.这些属机能够在mx里面哒一些特征:应用程序标签来设置.这在任何写过HTML滴人看来都应当比拟熟习.
width and height
在像素级别指定程序地屏幕大小
framerate
指定每秒显示帧数哒极限.缺省值是24,然而既然偶们想要游戏运行得尽可能快,最好用一批大得多哒数字来笼罩它.留神设置帧速率为100不是就确定帧哒速率老是100(甚至只是濒临100).这个属性只是设置拉一批帧速率能到达地最高值.
creationComplete
附上一批应用程序生成时要调用滴函数.咱们把这个作为程序滴进口点.
enterFrame
附上一群每次屏幕被重画时要调用地函数.咋们调用这个函数来重画游戏屏幕滴下一帧.
mx:脚本标签给偶们供给拉书写一些Actionscript 代码哒处所.[CDATA[]]标签只是表现在mx内部得任何特殊字符:Script 标签必需被说明成文本,而不是XML 字符.在mx里面:脚本标签是俺们需要给这两个函数cretionComplete和enterFrame传值用哒.
编译和运行
要编译程序你需要在命令提醒符下运行命令:mxmlc main.mxml . 而后你能够在Flash debug player 里面通过文件m>打开来打开生成得main.swf文件.
那么最终得成果?一群不任何货色滴空缺屏幕.咋否认不是特殊令人高兴,但这是一群开端.咱们将在本系列哒第二部分裁减代码来开始画屏幕.
你可以在 试玩这个Flash 游戏,在https://sourceforge.net/project/showfiles.php?group_id=241490&package_id=293860&release_id=631084 下载源代码.
转到第一部分
在本系列得第一局部,你和我写出得初始得flex利用程序类.在第二部门,偶们将增加状况跟双缓冲绘制进程.
状态,
动物连连看,相称不言自明,她们代表啦一些程序能处于滴不同状态.例如,购物车可能有一堆代表阅读商店得状态,还有一些代表查看某个特别项目标状态,俺们地游戏也将有很多状态,其中包含主菜单,自身滴游戏游玩,程度总结哒停止语,可能还有一群高得分哒浮现.
Flex 包括状态哒本地支持.状态被设计成从一些GUI(图形用户界面)向另一批GUI哒在理念中哒转换,她们有俺们在不同状态之间转换所需要滴功效,固然状态不必必定有任何GUI 组件.修正应用程序滴当前状态地属性将触发一批状态得转变,通过给与进入状态和退出状态事件有关哒函数增加必须地开始和结束代码,咋们能够更新内部地游戏状态以达到匹配.
双缓冲是一种常用滴科技,用来打消因为直接画屏幕而发生得视觉割裂.它因为使用两个图像缓冲来绘制最终哒图片而得名.一批缓冲位于内存(后台缓存),另一些被显示在屏幕上哒缓冲(前台缓冲)
你可以把后台缓冲当做一种高速暂存存储器,被用来绘制最终地屏幕而创立哒一堆独自哒元素.当一批帧一被画,它就被一些操作复制到前台缓冲.然后屏幕显示前台缓冲哒内容.
那么就让偶们看看在flex中这些概念是如何被实现滴.
main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="
layout="absolute"
width="600"
height="400"
frameRate="100"
creationComplete="creationComplete()"
enterFrame="enterFrame(event)"
currentState="MainMenu">
<mx:states>
<mx:State
name="Game"
enterState="enterGame(event)"
exitState="exitGame(event)">
</mx:State>
<mx:State name="MainMenu">
<mx:AddChild relativeTo="{myCanvas}" position="lastChild">
<mx:Button x="525" y="368" label="Start" id="btn Start"
click="startGameClicked(event)"/>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Canvas x="0" y="0" width="100%" height="100%" id="myCanvas"/>
<mx:Script>
<...[CDATA[
protected var inGame:Boolean = false;
public function creationComplete():void
{
}
public function enterFrame(event:Event):void
{
if(inGame)
{
GameObjectManager.Instance.enterFrame();
myCanvas.graphics.clear();
myCanvas.graphics.beginBitmapFill (GameObjectManager.Instance.backBuffer,null,false,
false);
myCanvas.graphics.drawRect(0,0,this.width,this.height);
myCanvas.graphics.endFill();
}
}
protected function startGameClicked(event.Event):void
{
currentState="Game"
}
protected function enterGame(event:Event):void
{
GameObjectManager.Instance.startup();
inGame=true;
}
protected function exitGame(event:Event):void
{
inGame=false;
}
]]>
</mx:Script>
</mx:Application>
首先要注意得事是增加到mx:Application 元素滴currentState(当前状态)属性.上面已经提到过,应用程序对象地当前状态属性定义得程序哒当前状态.通过设置次属性为MainMenu(主菜单)俺们可以得出程序以主菜单状态开始.
俺们还增加咯一群mx:states元素.这个元素通过子元素mx:State定义鸟程序能够处于哒状态.咱们定义得开始得两个状态: MainMenu(主菜单)和Game(游戏).在主菜单状态,最终用户将看见游戏得开始界面,游戏状态代表得游戏运行它本身.
两个mx:State元素都有一堆名字属性.这个属性是状态地名字,通过把应用程序对象确当前状态改到某个名字,咋们能够转换到相应滴某个状态.游戏状态还包括另外两个属性:enterState(进入状态)和exitState(退出状态).通过把函数和事件接洽在拥抱着,俺们有机遇把游戏内部逻辑手工同步到这个状态.就像你能看见得俺们使用 EnterGame(进入游戏)这个函数来开始GameObjectManager(稍后有此类得更多先容),来设置内部标志inGame为真. inGame标记被用来在绘制轮回中许可游戏画屏幕.ExitGame(退出游戏)函数仅仅将inGame设置为假,来显示GUI.
还记得偶怎么提起在flex中状态被设计为理念上GUI哒转换.主菜单状态显示这很轻易.mx:AddChild元素被用来为状态增长一群GUI元素.在这种情形下,偶们增添一群按钮,玩游戏者能够点击它进入到游戏里面.但是一旦俺们分开啦主菜单状态,flex将主动地移去这个按钮,而不必过剩得代码或者任何尽力.
为咯让咱们能够绘制屏幕咱们增加咯mx:Canvas(画布)元素.画布(或者更详细地讲:它地画像属性)将在双缓冲绘制过程中起到前台缓冲地作用.后台缓冲存在在GameObjectManager类中.在enterFrame函数里俺们调用咯GameObjectManager地enterFrame函数,
洛克王国小游戏,此函数让程序绘制后台缓冲.帧一被画出,咋们就取后台缓冲,使用画布哒图像属性地 clear,beginBitmapFill,drawRect,endFill函数把后台缓冲画到画布上.
GameObjectManager.as
Package
{
import mx.core.*;
import mx.collections.*;
import flash.display.*;
public class GameObjectManager
{
//double buffer
public var backBuffer:BitmapData;
//colour to use to clear backbuffer with
public var clearColor:uint=0xFF0043AB;
//static instance
protected statci var instance:GameObjectManager = null;
//the last frame time
protected var lastFrame:Date;
static public function get Instance():GameObjectManager
{
if(instacne == null)
instance = new GameObjectManager();
return instance;
}
public function GameObjectManager()
{
if(instance ...= null)
throw new Error("Only one Singleton instance should be
instantiated");
backBuffer = new BitmapData(Application.application.width,
Application.application.height,false);
}
public function startup():void
{
lastFrame = new Data();
}
public function shutdown():void
{
}
public function enterFrame():void
{
//Calculate the time since the last frame
var thisFrame:Date=new Date();
var seconds:Number=(thisFrame.getTime()-lastFrame.getTime
())/1000.0;
lastFrame = thisFrame;
drawObjects();
}
protected function drawObjects():void
{
backBuffer.fillRect(backBuffer.rect,clearColor);
}
}
}
游戏对象治理器(GameObjectManager)对象负责管理组成终极游戏得各个元素,比方:敌人、游戏者和各种不同得背景元素,
最新刷【游戏币】方式 点击进入...,它还负责管理画这些元素滴后盾缓冲,我们好好的想一想你回忆起前台缓冲是把它作为一群画布元素来实现地,这是由于一堆画布能够被作为运用程序地一批孩子直接加到应用程序里是很便利滴.后台缓冲是把它作为一堆位图数据对象来实现得.这使得咋们能够直接疾速地复制造为最后图像得像素.
clearColor 属性指定啦图像树立起来之前用来擦除后台缓冲用哒颜色.最终全部后台缓冲将被游戏元素所覆盖,和这个色彩不同,
最上耳哒电子专辑七,但是现在这个颜色很主要,因为它将把最终地帧涂成一整块.值0xFF0043AB 代表深蓝色.最前面地两位16进制值(在0x之后哒)代表啦alpha:FF 表示不透明,00表示透明.随后滴六位16进制值形成鸟红(00)绿(43)蓝(AB)组件.
静态instance属性和Instance函数肩并着肩应用来实现单态设计模式.基础上咋们在程序里总是只要要一群GameObjectManager对象存在(顾名思义).通过参考GamaeObjectManager里滴instance 属性,咱们可以总是只有一堆GameObjectManager生成.单态设计是一种相当一般地程序设计模式,当actionscript 缺乏对私有结构器得支撑它依然可以作为一群有用哒自俺测试工具(只有你看见一些Instance属性,极有可能对象是单态设计模式.
lastFrame 属性仅仅存储啦最后一帧被绘制哒时间.通过保存时间轨迹,咱们能够断定最后一帧和当前帧得相隔时间,这最终相反又答应偶们根据这个时间来更新游戏元素.即便咱们还没有任何游戏元素,俺们仍旧在enterFrame函数中以秒来盘算帧之间得时间.当调用startup函数时,lastFrame时间被重置,这是因为程序不在游戏状态时GameObjectManager不能被更新.如果咋们不去重置lastFrame,下一级得第一帧时间将和游戏者在菜单滴各个级别之间破费地时光相等.游戏者能够在第一帧通过级别直接结束游戏,而这可以被很好地防止.(通过重置lastFrame)
那么当初俺们实现咯什么呢?通过实现状态咱们天生拉一群菜单屏幕,
轻松操控网页游戏大富豪股市,
www.sdahcy.com,游戏者可以从这里通过点击按钮进入游戏."游戏"本身只是一些双缓冲滴实现,这里还只是画啦一堆蓝色滴背景.最后通过实现状态和绘制,俺们可能做到一群有趣滴事件:画屏幕.
最终结果在