[新闻资讯] 使用Flex和Actionscript开发Flash游戏——重复背景绘制
来源:互联网 发布:博客天下 知乎 编辑:程序博客网 时间:2024/05/31 18:45
[新闻资讯] 使用Flex和Actionscript开发Flash游戏——重复背景绘制
Flex, Flash, Actionscript, 游戏, 开发
我的评论:最后一篇~作者的架构的思想是很好的~涵盖了游戏的诸多方面,很细致。
对这篇文你有啥看法,跟贴说说吧!欢迎口水和板砖,哈哈。欢迎大家和我们一同分享更多资讯。
这一部分,我们要加入一个可以滚动的重复的背景。
第9部分中,我们添加了关卡的按时调用功能构成的关卡结构。这个绘制主要用来显示界面上的敌机,但是对于背景的显示并不是很有用。这个部分,我们要绘制预定义的可重复的背景。
重复背景由一系列很小的可重复的图片排列而成,在这里,就是按网格排列。这样做有几个优点,最重要的就是可以减小内存的需求。用一张很小的图像来渲染背景,每一关能减小内存好几兆,同时保留了高细节的呈现。只不过背景并不响应单块的互动事件,只是被关卡载入。与此相对,重复背景占用内存小,设计师同样可以利用这一特点制作出相当好看的背景。
第一步就是绘制一个可自重复的背景图片。我发现了很多不错的图片 http://lostgarden.com/labels/free%20game%20graphics.html。站点上还有一些其它有趣的资源。
下一步是找一个关卡编辑器,提供我们交互界面操作。当然也可以自己开发(这个可以再写一系列文章了)。幸好,有人已经做了这个工作。TaT自重复地图编辑器:http://kotisivu.dnainternet.net/ttilli/tilemapeditor/download.htm
其中的层编辑和xml导出都很好用。
当然,我们需要在游戏中加代码了~首先是存储背景数据。TiledBackgroundDefinition类来了~看看代码:
TiledBackgroundDefinition.as复制代码tiles属性是一个多维数组,包含了GraphicsResources的引用,这些用来绘制背景,三维分别表示层、行和列。例如:tiles[1][4][5]指向GraphicsResource到第六列,第五行,第二层——从0开始索引的。tileWidth和tileHeight属性定义了关卡北京的尺寸。tileScrollRate定义了关卡滚动速度。
现在我们可以存储定义自重复背景了。LevelDefinitions类用来存储定义。让我们看看代码:
LevelDefinitions.as复制代码(待续)
第9部分中,我们添加了关卡的按时调用功能构成的关卡结构。这个绘制主要用来显示界面上的敌机,但是对于背景的显示并不是很有用。这个部分,我们要绘制预定义的可重复的背景。
重复背景由一系列很小的可重复的图片排列而成,在这里,就是按网格排列。这样做有几个优点,最重要的就是可以减小内存的需求。用一张很小的图像来渲染背景,每一关能减小内存好几兆,同时保留了高细节的呈现。只不过背景并不响应单块的互动事件,只是被关卡载入。与此相对,重复背景占用内存小,设计师同样可以利用这一特点制作出相当好看的背景。
第一步就是绘制一个可自重复的背景图片。我发现了很多不错的图片 http://lostgarden.com/labels/free%20game%20graphics.html。站点上还有一些其它有趣的资源。
下一步是找一个关卡编辑器,提供我们交互界面操作。当然也可以自己开发(这个可以再写一系列文章了)。幸好,有人已经做了这个工作。TaT自重复地图编辑器:http://kotisivu.dnainternet.net/ttilli/tilemapeditor/download.htm
其中的层编辑和xml导出都很好用。
当然,我们需要在游戏中加代码了~首先是存储背景数据。TiledBackgroundDefinition类来了~看看代码:
TiledBackgroundDefinition.as
- package
- {
- public class TiledBackgroundDefinition
- {
- public var tiles:Array = null;
- public var tileScrollRate:Number = 0;
- public var tileWidth:int = 0;
- public var tileHeight:int = 0;
- }
- }
现在我们可以存储定义自重复背景了。LevelDefinitions类用来存储定义。让我们看看代码:
LevelDefinitions.as
- LevelDefinitions.as
- package
- {
- import flash.geom.*;
- import flash.utils.*;
- public class LevelDefinitions
- {
- protected static var instance:LevelDefinitions = null;
- protected var levelDefinitions:Dictionary = new Dictionary();
- public var levelTileMaps:Dictionary = new Dictionary();
- static public function get Instance():LevelDefinitions
- {
- if ( instance == null )
- instance = new LevelDefinitions();
- return instance;
- }
- public function LevelDefinitions()
- {
- }
- public function addLevelDefinition(levelID:int, element:LevelDefinitionElement):void
- {
- if (levelDefinitions[levelID] == null)
- levelDefinitions[levelID] = new Array();
- (levelDefinitions[levelID] as Array).push(element);
- levelDefinitions[levelID].sort(LevelDefinitionElement.sort);
- }
- public function getNextLevelDefinitionElements(levelID:int, lastTime:Number):Array
- {
- var returnArray:Array = new Array();
- var nextTime:Number = -1;
- if (levelDefinitions[levelID] != null)
- {
- for each (var levelDefElement:LevelDefinitionElement in levelDefinitions[levelID])
- {
- if (levelDefElement.time > lastTime && nextTime == -1)
- {
- returnArray.push(levelDefElement);
- nextTime = levelDefElement.time;
- }
- else if (levelDefElement.time == nextTime)
- {
- returnArray.push(levelDefElement);
- }
- else if (levelDefElement.time > nextTime && nextTime != -1)
- break;
- }
- }
- return returnArray.length == 0?null:returnArray;
- }
- public function getNextLevelID(levelID:int):int
- {
- if (levelDefinitions[levelID + 1] == null) return 0;
- return levelID + 1;
- }
- public function startup():void
- {
- GameObjectManager.Instance.addCollidingPair( CollisionIdentifiers.PLAYER, CollisionIdentifiers.ENEMY);
- GameObjectManager.Instance.addCollidingPair( CollisionIdentifiers.ENEMY, CollisionIdentifiers.PLAYERWEAPON);
- GameObjectManager.Instance.addCollidingPair( CollisionIdentifiers.PLAYER, CollisionIdentifiers.ENEMYWEAPON);
- defineLevel1();
- defineLevel2();
- }
- public function shutdown():void
- {
- }
- protected function defineLevel1():void
- {
- var level1Tiles:TiledBackgroundDefinition = new TiledBackgroundDefinition();
- levelTileMaps[1] = level1Tiles;
- level1Tiles.tileScrollRate = 25;
- level1Tiles.tileHeight = 40;
- level1Tiles.tileWidth = 40;
- level1Tiles.tiles =
- [
- [
- [ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1]
- ...
- ,[ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1, ResourceManager.GreenGraphicsID1]
- ]
- ,[
- [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
- ...
- ,[null, ResourceManager.GreenGraphicsID62, ResourceManager.GreenGraphicsID63, ResourceManager.GreenGraphicsID64, null, ResourceManager.GreenGraphicsID48, ResourceManager.GreenGraphicsID49, null, null, null, null, null, null, null, null]
- ]
- ];
- LevelDefinitions.Instance.addLevelDefinition(
- 1,
- new LevelDefinitionElement(
- 4,
- function():void
- {
- for each (var xPos:int in [150, 350])
- {
- (Enemy.pool.ItemFromPool as Enemy).startupBasicEnemy(
- ResourceManager.SmallBluePlaneGraphics,
- new Point(xPos, -ResourceManager. SmallBluePlaneGraphics.bitmap.height),
- 55);
- }
- }
- ));
- ...
- }
- protected function defineLevel2():void
- {
- ...
- }
- }
- }
- 1
评分次数
威望 + 1 点 银子 + 20 两
达达
本主题由 达达 于 昨天 12:43 审核通过
收藏 分享 评分
我是小辛~
回复 引用
订阅 报告 道具 TOP
立刻订阅天地会人人快报,时刻同步全球RIA技术与资讯热点! RSS订阅地址: http://feeds.feedburner.com/9RIAnews
linus1115
- 发短消息
- 加为好友
linus1115 当前离线
- UID
- 2178
- 帖子
- 123
- 精华
- 0
- 积分
- 881
- 威望
- 13 点
- 银子
- 312 两
- 阅读权限
- 50
- 来自
- 北京
- 在线时间
- 41 小时
- 注册时间
- 2007-12-31
- 最后登录
- 2009-9-14
香坛护法
沙发
发表于 昨天 13:27 | 只看该作者
我们添加了一个新的属性levelTileMaps,这是一个Dictionary类型,用来将TiledBackgroundDefinitions映射至LevelID(和第9部分levelDefinitions属性类似)。
同样的,我们增加了两个新方法:defineLevel1和defineLevel2。这两个方法用于分别定义levels,看上去新的自重复的背景定义有点累赘。在这两个方法中,我们创建TiledBackgroundDefinition对象,初始化它们并赋值到levelTileMaps属性上。
当你使用TaT创建关卡时,会得到两个很重要的文件:tileset.xml(定义了单个的字重复图像)和一个 你关卡的名字.xml文件(定义了图片在关卡中的排列情况)。我们要把 你关卡的名字.xml文件的数据放到tiles数组中。
你可能会奇怪,怎样才能把xml数据存到多维数组中。简单说,我创建另一个程序,将xml转换成Actionscript代码,然后创建数组。为什么不选择在程序中解析XML呢?理由和我不选择用xml定义关卡结构是一样的:解析xml并转换数据类型是一个很复杂的过程,而转换xml为actionscript要简单很多。这里我就不讲解转换程序的代码了,你可以在这里下载到:http://flexfighters.svn.sourcefo ... /TatResourceParser/
TaT编辑器创建的第二个xml定义了组成关卡的单个的自重复图像。使用上面的程序,我们也可以将其转换成actionscript代码,嵌入图像然后用ResourceManager创建与之对应的GraphicsResource对象。新的代码重复部分很多,下面我只写一小部分不一样的:
ResourceManager.as (新代码示例)复制代码
同样的,我们增加了两个新方法:defineLevel1和defineLevel2。这两个方法用于分别定义levels,看上去新的自重复的背景定义有点累赘。在这两个方法中,我们创建TiledBackgroundDefinition对象,初始化它们并赋值到levelTileMaps属性上。
当你使用TaT创建关卡时,会得到两个很重要的文件:tileset.xml(定义了单个的字重复图像)和一个 你关卡的名字.xml文件(定义了图片在关卡中的排列情况)。我们要把 你关卡的名字.xml文件的数据放到tiles数组中。
你可能会奇怪,怎样才能把xml数据存到多维数组中。简单说,我创建另一个程序,将xml转换成Actionscript代码,然后创建数组。为什么不选择在程序中解析XML呢?理由和我不选择用xml定义关卡结构是一样的:解析xml并转换数据类型是一个很复杂的过程,而转换xml为actionscript要简单很多。这里我就不讲解转换程序的代码了,你可以在这里下载到:http://flexfighters.svn.sourcefo ... /TatResourceParser/
TaT编辑器创建的第二个xml定义了组成关卡的单个的自重复图像。使用上面的程序,我们也可以将其转换成actionscript代码,嵌入图像然后用ResourceManager创建与之对应的GraphicsResource对象。新的代码重复部分很多,下面我只写一小部分不一样的:
ResourceManager.as (新代码示例)
- [Embed(source="../media/Green26.png")]
- public static var GreenID65:Class;
- public static var GreenGraphicsID65:GraphicsResource = new GraphicsResource(new GreenID65());
- [Embed(source="../media/Green5.png")]
- public static var GreenID11:Class;
- public static var GreenGraphicsID11:GraphicsResource = new GraphicsResource(new GreenID11(), 1, 1, new Rectangle(0, 0, 40, 40));
- public static var GreenGraphicsID12:GraphicsResource = new GraphicsResource(new GreenID11(), 1, 1, new Rectangle(40, 0, 40, 40));
- public static var GreenGraphicsID17:GraphicsResource = new GraphicsResource(new GreenID11(), 1, 1, new Rectangle(0, 40, 40, 40));
- public static var GreenGraphicsID18:GraphicsResource = new GraphicsResource(new GreenID11(), 1, 1, new Rectangle(40, 40, 40, 40));
我是小辛~
新手看过来:天地会入会必读
回复 引用
报告 道具 TOP
mededu
- 发短消息
- 加为好友
mededu 当前离线
- UID
- 468
- 帖子
- 303
- 精华
- 0
- 积分
- 437
- 威望
- 2 点
- 银子
- 43 两
- 阅读权限
- 30
- 在线时间
- 281 小时
- 注册时间
- 2007-10-17
- 最后登录
- 2009-9-14
堂口教头
板凳
发表于 昨天 13:47 | 只看该作者
哪位有好的游戏素材提取的方法或经验啊,想找素材来作作实验
医学教育网
互联互动实验室
互联互动实验室
回复 引用
报告 道具 TOP
linus1115
- 发短消息
- 加为好友
linus1115 当前离线
- UID
- 2178
- 帖子
- 123
- 精华
- 0
- 积分
- 881
- 威望
- 13 点
- 银子
- 312 两
- 阅读权限
- 50
- 来自
- 北京
- 在线时间
- 41 小时
- 注册时间
- 2007-12-31
- 最后登录
- 2009-9-14
香坛护法
马扎
发表于 昨天 14:08 | 只看该作者
代码与其它资源定义相同,除了传给ResourceManager新的参数。这是为了适应TaT引用的结构——加入关卡的图片比自重复的图片尺寸大。所以,例如一个字重复图片大小是40x40像素,但是整个树的图像可以是40x80像素。在这种情况下,树的图片要引用两个独立的图片,按照定义,一个在上面,一个在下面。为了让GraphicsResouce指向相同大小的区域,我们可以将其指向相同的自重复图片。
现在,我们可以定义并保存自重复图像了。接下来就是要绘制了。请看代码:
TiledBackground.as复制代码
现在,我们可以定义并保存自重复图像了。接下来就是要绘制了。请看代码:
TiledBackground.as
- package
- {
- import flash.display.*;
- import flash.geom.*;
- import mx.collections.*;
- import mx.core.*;
- public class TiledBackground extends BaseObject
- {
- public var scrolling:Boolean = true;
- protected var yOffset:Number = 0;
- protected var definition:TiledBackgroundDefinition = null;
- static public var pool:ResourcePool = new ResourcePool(NewTiledBackground);
- static public function NewTiledBackground():TiledBackground
- {
- return new TiledBackground();
- }
- public function TiledBackground()
- {
- super();
- }
- public function startupTiledBackground(definition:TiledBackgroundDefinition):void
- {
- super.startupBaseObject(ZOrders.BACKGROUNDZORDER);
- this.definition = definition;
- this.yOffset = 0;
- this.scrolling = true;
- }
- override public function shutdown():void
- {
- super.shutdown();
- }
- override public function enterFrame(dt:Number):void
- {
- if (scrolling)
- {
- var mapHeight:int = definition.tiles[0].length * definition.tileHeight;
- var mapOverlap:int = mapHeight - Application.application.height;
- yOffset += definition.tileScrollRate * dt;
- if (yOffset > mapOverlap)
- {
- scrolling = false;
- yOffset = mapOverlap;
- }
- }
- }
- override public function copyToBackBuffer(db:BitmapData):void
- {
- var startRow:int = yOffset / definition.tileHeight;
- var startRowNumber:Number = yOffset / definition.tileHeight;
- var startRowHeight:int = definition.tileHeight * (startRowNumber - startRow);
- var drawnHeight:int = 0;
- var drawnWidth:int = 0;
- var layer:int = 0;
- var row:int = startRow;
- var col:int = 0;
- // loop through each layer
- for (layer = 0; layer < definition.tiles.length; ++layer)
- {
- // loop through each row
- var count:int = 0;
- for (row = (definition.tiles[layer] as Array).length - 1 - startRow; row >= 0 ; --row)
- {
- // loop through each column of the current row
- for (col = 0; col < (definition.tiles[layer][row] as Array).length; ++col)
- {
- var graphics:GraphicsResource = definition.tiles[layer][row][col] as GraphicsResource;
- var top:int = Application.application.height - drawnHeight - definition.tileHeight + startRowHeight;
- if (graphics != null)
- {
- db.copyPixels(
- graphics.bitmap,
- graphics.drawRect,
- new Point(
- col * definition.tileWidth,
- top),
- graphics.bitmapAlpha,
- new Point(
- graphics.drawRect.x,
- graphics.drawRect.y),
- true);
- }
- drawnWidth += definition.tileWidth;
- if (drawnWidth >= Application.application.width)
- break;
- }
- drawnWidth = 0;
- drawnHeight += definition.tileHeight;
- if (drawnHeight >= Application.application.height + definition.tileHeight)
- break;
- }
- drawnHeight = 0;
- }
- }
- }
- }
我是小辛~
回复 引用
报告 道具 TOP
A闪
- 发短消息
- 加为好友
A闪 当前离线
- UID
- 29898
- 帖子
- 31
- 精华
- 0
- 积分
- 110
- 威望
- 2 点
- 银子
- 29 两
- 阅读权限
- 20
- 来自
- 天津
- 在线时间
- 5 小时
- 注册时间
- 2009-3-29
- 最后登录
- 2009-9-14
天地会兄弟
地板
发表于 昨天 14:17 | 只看该作者
不错!用的是魔兽的地图吧?
回复 引用
报告 道具 TOP
linus1115
- 发短消息
- 加为好友
linus1115 当前离线
- UID
- 2178
- 帖子
- 123
- 精华
- 0
- 积分
- 881
- 威望
- 13 点
- 银子
- 312 两
- 阅读权限
- 50
- 来自
- 北京
- 在线时间
- 41 小时
- 注册时间
- 2007-12-31
- 最后登录
- 2009-9-14
香坛护法
6#
发表于 昨天 14:51 | 只看该作者
这里要讲解3个属性。scrolling属性标记关卡是否在滚动(true),false表示level已经滚动到了尽头。yOffset属性用来保存level滚动了多少。definition属性保存了到一个自重复background definitions的引用,在Level类中创建。
enterFrame方法和copyToBackBuffer方法做了大量的工作。等执行enterFrame方法时,TiledBackground根据TiledBackgroundDefinition类(定义了滚动速度)的tileScrollRate属性向下滚动。一旦探测到滚动到了尽头,就把scrolling设置为false然后停止更新yOffset。copyToBackBuffer方法决定在哪里绘制自重复图像。第一次是层的循环,然后是行和列,将它们绘制到正确的位置。
TiledBackground实例的创建也需要分割老的GameObject类。原先GameObject表示每一个元素都由一个GrphicsResource类实例表示。而现在TiledBackground可能会访问很多很多的GraphicsResources在屏幕上绘制它们。为了适应这个情况,我们创建一个新类叫BaseObject,保存了所有通用的属性,不包括GraphicsResource。TiledBackground和GameObject同时继承自BaseObject,而Player和Enemy保持不变。
Level类将所有的工作融合到一起,并在合适的地方创建TiledBackground。来看看代码:
Level.as复制代码
enterFrame方法和copyToBackBuffer方法做了大量的工作。等执行enterFrame方法时,TiledBackground根据TiledBackgroundDefinition类(定义了滚动速度)的tileScrollRate属性向下滚动。一旦探测到滚动到了尽头,就把scrolling设置为false然后停止更新yOffset。copyToBackBuffer方法决定在哪里绘制自重复图像。第一次是层的循环,然后是行和列,将它们绘制到正确的位置。
TiledBackground实例的创建也需要分割老的GameObject类。原先GameObject表示每一个元素都由一个GrphicsResource类实例表示。而现在TiledBackground可能会访问很多很多的GraphicsResources在屏幕上绘制它们。为了适应这个情况,我们创建一个新类叫BaseObject,保存了所有通用的属性,不包括GraphicsResource。TiledBackground和GameObject同时继承自BaseObject,而Player和Enemy保持不变。
Level类将所有的工作融合到一起,并在合适的地方创建TiledBackground。来看看代码:
Level.as
- package
- {
- import flash.events.*;
- import flash.geom.*;
- import flash.media.*;
- import flash.net.*;
- import flash.utils.*;
- import mx.core.*;
- public class Level
- {
- protected static var instance:Level = null;
- protected static const TimeBetweenLevelElements:Number = 2;
- protected static const TimeBetweenClouds:Number = 2.5;
- protected static const TimeToLevelEnd:Number = 2;
- protected var nextDefinitions:Array = null;
- protected var levelID:int = 0;
- protected var totalTime:Number = 0;
- protected var timeToNextCloud:Number = 0;
- protected var timeToLevelEnd:Number = 0;
- protected var backgroundMusic:SoundChannel = null;
- public var levelEnd:Boolean = false;
- static public function get Instance():Level
- {
- if ( instance == null )
- instance = new Level();
- return instance;
- }
- public function Level()
- {
- }
- public function startup(levelID:int):void
- {
- new Player().startupPlayer();
- timeToLevelEnd = TimeToLevelEnd;
- levelEnd = false;
- backgroundMusic = ResourceManager.Track1FX.play(0, int.MAX_VALUE);
- this.totalTime = 0;
- this.levelID = levelID;
- nextDefinitions = LevelDefinitions.Instance.getNextLevelDefinitionElements(levelID, 0);
- var tileDefinition:TiledBackgroundDefinition = LevelDefinitions.Instance.levelTileMaps[levelID] as TiledBackgroundDefinition;
- if (tileDefinition != null)
- (TiledBackground.pool.ItemFromPool as TiledBackground).startupTiledBackground(tileDefinition);
- }
- public function shutdown():void
- {
- backgroundMusic.stop();
- backgroundMusic = null;
- }
- public function enterFrame(dt:Number):void
- {
- totalTime += dt;
- if (nextDefinitions == null)
- {
- if (Enemy.pool.NumberOfActiveObjects == 0)
- levelEnd = true;
- }
- else
- {
- var nextLevelDefTime:Number = (nextDefinitions[0] as LevelDefinitionElement).time;
- if (totalTime >= nextLevelDefTime)
- {
- for each (var levelDefElement:LevelDefinitionElement in nextDefinitions)
- levelDefElement.func();
- nextDefinitions = LevelDefinitions.Instance.getNextLevelDefinitionElements(levelID, nextLevelDefTime);
- }
- }
- // add cloud
- timeToNextCloud -= dt;
- if (timeToNextCloud <= dt)
- {
- timeToNextCloud = TimeBetweenClouds;
- var cloudBackgroundLevelElement: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;
- var scale:Number = timeToLevelEnd / TimeToLevelEnd;
- if (scale < 0) scale = 0;
- var transform:SoundTransform = backgroundMusic.soundTransform;
- transform.volume = scale;
- backgroundMusic.soundTransform = transform;
- }
- if (timeToLevelEnd <= 0)
- Application.application.currentState = "LevelEnd";
- }
- }
- }
我是小辛~
回复 引用
报告 道具 TOP
linus1115
- 发短消息
- 加为好友
linus1115 当前离线
- UID
- 2178
- 帖子
- 123
- 精华
- 0
- 积分
- 881
- 威望
- 13 点
- 银子
- 312 两
- 阅读权限
- 50
- 来自
- 北京
- 在线时间
- 41 小时
- 注册时间
- 2007-12-31
- 最后登录
- 2009-9-14
香坛护法
7#
发表于 昨天 14:56 | 只看该作者
只用了3行代码来表示创建BackgroundLevelElement。
加入了自重复背景的绘制后,我们的游戏有了一个好看的背景,同时不会消耗太多的内存。多亏了免费的地图编辑器和资源。
结果:http://flexfighters.sourceforge.net/flexfighters10.html
源码:http://sourceforge.net/projects/ ... ers/FlexFighters10/
【全系列完~】
加入了自重复背景的绘制后,我们的游戏有了一个好看的背景,同时不会消耗太多的内存。多亏了免费的地图编辑器和资源。
结果:http://flexfighters.sourceforge.net/flexfighters10.html
源码:http://sourceforge.net/projects/ ... ers/FlexFighters10/
【全系列完~】
- [新闻资讯] 使用Flex和Actionscript开发Flash游戏——重复背景绘制
- [新闻资讯] 使用Flex和Actionscript开发Flash游戏——设定关卡
- 使用Flex和Actionscript开发Flash游戏
- 使用FLEX和Actionscript开发FLASH 游戏-使用输入和动态背景
- 使用FLEX 和 Actionscript开发FLASH 游戏—嵌入资源和增加游戏元素
- 使用Flex和Actionscript开发Flash游戏 —— 双缓冲渲染
- 使用Flex和Actionscript开发Flash游戏——碰撞检测
- 使用FLEX和Actionscript开发FLASH 游戏-位图动画
- 使用FLEX和Actionscript开发FLASH 游戏-碰撞检测
- 使用FLEX 和 Actionscript开发FLASH 游戏(一)
- 使用FLEX 和 Actionscript 开发FLASH 游戏2
- 使用FLEX和 Actionscript 开发FLASH游戏(三)-1
- 使用FLEX和 Actionscript 开发FLASH游戏(三)-2
- 使用FLEX和 Actionscript 开发FLASH游戏(三)-3
- 使用FLEX和 Actionscript 开发FLASH游戏(三)-4
- 使用FLEX和 Actionscript 开发FLASH游戏(四)-1
- 使用FLEX和 Actionscript 开发FLASH游戏(四)-2
- 使用FLEX和 Actionscript 开发FLASH游戏(五)
- JAVA对文件的操作大全
- 什么情况导致全表扫描,而不是用索引
- 开发类的网址
- 测试下代码高亮
- SQL事务
- [新闻资讯] 使用Flex和Actionscript开发Flash游戏——重复背景绘制
- UPS短信报警控制方案
- tomcat配置context项目修改时自动加载
- sshfs把远程主机的文件系统映射到本地的目录中
- 自动完成校验的表单操作
- 水泵机组短信远程控制方案
- 打开窗体的几种方式?
- 生产线短信报警控制器
- Flex SEO(Search engine optimization),让浏览器找到你的flash站点