Flash AS游戏引擎原理

其实一提到游戏引擎,很多初学者,会显得有一种畏惧感,会觉得这是一个非常高深的东西。曾经页游行业很乱,就像现在的手游一样,各种非计算机专业出生的同学,经过一个短暂的培训就开始了程序员之旅。

这篇文章仅仅从简单的角度讲解一下游戏引擎在显示渲染上的原理,用位图渲染的方式来实现,供新手们学习交流,如有不足的,望指出。

最简单的图形引擎,主要三个部分:摄影机(Camera),场景画布(Canvas),画布中的显示对象(Displayobject)。

为了便于大家理解,我直接把Camera都忽略掉,假设我们FlashPlayer的整个窗口就是Camera,就剩下了这个样子。

Flash本身就是一款图形引擎,但现在我抛弃掉Flash的渲染,重新按自己的方式通过位图来渲染我们的游戏,来让大家更容易理解。

首先,定义Canvas画布:

假设我们的游戏帧频是基于FlashPlayer的。

	public class Canvas extends Sprite
	{

		//画布上的位图
		private var _canvasBitMap:Bitmap = null;

		//画布上的位图数据
		private var _canvasBitMapData:BitmapData = null;

		//画布上的显示对象
		private var _objList:Array = null;

		public function Canvas()
		{
			addEventListener(Event.ENTER_FRAME,onEnterFrame);

			//假设我们画布是1000*600的大小
			_canvasBitMapData = new BitmapData(1000,600);
			_canvasBitMap = new Bitmap(_canvasBitMapData);
			addChild(_canvasBitMap);
		}

		//每一帧的心跳入口
		private function onEnterFrame(e:Event):void
		{
			update();
			draw();
		}

		//数据的更新
		private function update():void
		{
			for(var i:int = 0;i<_objList.length;i++)
			{
				_objList[i].update();
			}
		}

		//渲染
		private function draw():void
		{
			clear();
			for(var i:int = 0;i<_objList.length;i++)
			{
				_objList[i].draw(_canvasBitMapData);
			}
		}

		//清空上一帧的位图数据
		private function clear():void
		{

		}

		//往画布上添加一个显示对象
		private function addChild(obj:Displayobject):void
		{
			_objList.push(obj);
		}

	}

其次,定义Displayobject

	public class Displayobject
	{

		//显示对象自己的位图数据
		private var _bitMapData:BitmapData = null;

		public var x:Number;
		public var y:Number;
		public var height:Number;
		public var width:Number;

		public function Displayobject()
		{

		}

		//更新显示对象数据
		public function update():void
		{

		}

		//渲染显示对象
		public function draw(data:BitmapData):void
		{
			data.copyPixels(_bitMapData,); //将自己的位图数据拷贝到画布上
		}

	}

就这么简单的两个类,我们的基于位图的渲染引擎的出来了

接口update()

public function update():void

这个接口与draw()是在每一帧的时候都会调用,我们一般用它来处理一些什么东西呢?

1.  位置的更新,也就是坐标的更新,每一个显示对象在画布都有坐标,假设它是一个匀速运动的小车,那我们就可以根据它的运行速度,每一帧的时间,得到它当前的坐标。

2. 碰撞的检测,我们也可以把一些碰撞的检测放到这里来处理。

3. 动作的播放,比如我们有一个动作序列表,[1,2,3,4,5,6] 每一帧我们是播一个序列值,这个序列值是多少,决定了_bitMapData的具体计算方式。

接口draw()

public function draw(data:BitmapData):void
		{
			data.copyPixels(_bitMapData,); //将自己的位图数据拷贝到画布上
		}

这个接口的目的,主要是将update计算好后的一个新的位图数据,把它画到画布场景中去,上面给的copyPixels是不对的,这样写的目的是告诉大家,拷贝这个位图数据到画布中去,主要与新的位图数据的坐标和宽高有关。

一个简单的游戏引擎,其实就是这个样子,再加上IO,声音,Socekt,然后再把它用MVC模式合理化,就可以拿来开发游戏了。

引擎的渲染,也就是draw()是非常消耗CPU资源的,我们常常会在这些地方做一些优化,比如我们有一些显示对象很明显能算出它是会被前面的显示对象完全档住,那这种对象我们是不是可以考虑在draw的时候不渲染它呢。

现在Flash已经支持硬件加速了,在actionscript里增加了一个stage3D,只要我们理解到了图像引擎的原理,我们自己尝试去写一个游戏引擎来练习练习也不难的,同样我们拿到一款成熟的引擎比如Starling的时候,要把它理解清楚也很容易。

时间: 2024-11-19 01:16:27

Flash AS游戏引擎原理的相关文章

VC++实战《星际传奇》网游课程第一部分网络游戏开发基础篇(游戏引擎设计)

本系列课程基于最新的DirectX11接口进行深入细致的讲解,内容涉及D3D11原理与应用.DirectInput.DirectSound等: 教程中专门针对新兴的D3D11接口展开深入的讲解,详细讲解了D3D11渲染管线.DirectComputer(参看<VC++游戏开发系列之Directcomputer并行计算原理与实践--DX11游戏实战开发>).Tessellation.多线程渲染.Shader动态链接等新内容.新知识.并且基于这些内容的基础,更进一步讲解了光照模型原理及实现.高级的

cocos2d-x游戏引擎核心之四——绘图原理和绘图技巧

一.OpenGL基础 游戏引擎是对底层绘图接口的包装,Cocos2d-x 也一样,它是对不同平台下 OpenGL 的包装.OpenGL 全称为 Open Graphics Library,是一个开放的.跨平台的高性能图形接口.OpenGL ES 则是 OpenGL 在移动设备上的衍生版本,具备与 OpenGL 一致的结构,包含了常用的图形功能.Cocos2d-x 就是一个基于 OpenGL 的游戏引擎,因此它的绘图部分完全由 OpenGL 实现.OpenGL 是一个基于 C 语言的三维图形 AP

Python游戏引擎开发(四):TextField文本类

上一章我们主要介绍了显示对象和如何显示图片.本章来讲述显示文本. 以下是本系列教程前几章地址,在阅读本篇正文之前,请务必阅读前几章内容. Python游戏引擎开发(一):序 Python游戏引擎开发(二):创建窗口以及重绘界面 Python游戏引擎开发(三):显示图片 文本类TextField 使用过flash的朋友都知道,这个类其实不光是显示文本用的,还可以用于显示输入框.我这里就只实现一些基础实用的功能,以后有时间了慢慢拓展.和上一章一样,TextField是一个显示对象,继承自Displa

Python游戏引擎开发(一):序

邂逅Python 写了这么久的html5,感觉html5学得差不多了,是时候去接触更多的语言来扩充自己的能力了.我先后看了Swift,Java等语言.首先开发Swift需要一台mac,对于我这个寒士而言,过于奢华了一些:Java吧,又感觉太胖了,不够苗条,身材不好,也看不上.最后遇到了Miss Python,先前也和她打过交道,不过感觉语法怪怪的,总是出现>>>这类符号(当时没有深入接触,不晓得是命令输入提示),实在是太高冷了.幸好遇见了廖雪峰大侠,在他的引荐下,我开始初步了解Pytho

Atitit 游戏的原理与概论attilax总结

1. 游戏历史2 1.1.1. 盘点PC游戏史上最重要的50款游戏2 1.1.2. 回味人类文明进程 五款经典的历史游戏2 2. 游戏类型(主要分为6类:动作.冒险.模拟.角色扮演.休闲和其他)2 3. <游戏设计的100个原理>((美)迪斯潘...)2 4. <游戏>((美)加维...)[3 5. 游戏开发工程师修炼之道3 6. 基础概念 (导演,场景,层,以及精灵,调度器scheduler)3 7. 人机交互(事件分发机制 Event Dispatcher4 8. 主要功能(流

Python游戏引擎开发(六):动画的小小研究

今天我们来研究动画,其实这个动画就是一个Sprite+Bitmap的结合体.不造什么是Sprite和Bitmap?=__=#看来你是半路杀进来的,快去看看前几章吧: Python游戏引擎开发(一):序 Python游戏引擎开发(二):创建窗口以及重绘界面 Python游戏引擎开发(三):显示图片 Python游戏引擎开发(四):TextField文本类 Python游戏引擎开发(五):Sprite精灵类和鼠标事件 动画的原理 一般而言,我们的动画是用的这样一种图片: 播放动画的时候,像播放电影一

Python游戏引擎开发(三):显示图片

在上一章中我们讲了如何创建窗口以及对界面进行重绘.可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大致讲一下原因: 由于我们的游戏是动态的,所以我们每次更改数据后(例如播放动画时切换图片),要让界面显示更改后的结果,一般的想法是:首先进行擦除原先要改的地方,然后再把变更的内容画出来.不过这个看似简单,如果遇到了重叠放置的对象就麻烦了,比如说A在B的下面,我们要更改A,那么把A擦掉后,B也会被擦掉,原因在于我们的画布是2D的,无法控制Z方向的擦除.这样一来,我们除了重画A还要再把B画上去.

20 款免费的 JavaScript 游戏引擎

使用 HTML5,CSS3 和 Javascript 可以帮助面向对象开发者开发拥有各种特性的游戏,比如:3D 动画效果,Canvas,数学,颜色,声音,WebGL 等等.最明显的优势在于使用 HTML5 开发的游戏能在任何现代化流行的设备上运行. 某些游戏引擎仅仅是一个抽象的层次,就简单处理一些或者更多的繁杂游戏开发任务:其他只是注重 asset 加载,输入,物理效果,音频,sprite 地图和动画,而且相当多样化.还有一些引擎架构极其简单,只包括一个 2D 水平的编辑器和调试工具. 大部分的

Atitit 基于dom的游戏引擎

1. 添加sprite控件(cocos,createjs,dom)1 1.1.1. Cocos1 1.1.2. createjs1 1.1.3. Dom模式2 1.2. 动画移动的实现原理2 1.3. 动画移动(cocos2d-js,jquery animate,create.js)2 1.4. ---code3 1. 添加sprite控件(cocos,createjs,dom) 1.1.1. Cocos // var sushi = new cc.Sprite(res.Sushi_png);