战争迷雾算法+剧情模块+卡马克多方向滚动算法

单方向卡马克算法(以后补全多方向,最近比较忙的说)

卡马克算法其本质是用户所能看到的位图区域有多大,就渲染多大的位图。 传统的制作方法是内存中已经存在了整张的位图,只在用户可视界面做位图的位移。 假设位图的大小是 1024*768.而用户屏幕大小仅为800*600 那么内存中实际上浪费了 (1024-800)*(768-600) 像素的内存。
使用卡马克算法后,理论上无限大的位图都只消耗用户屏幕大小的 800*600 的内存。极大的提高了效率。

[cc lang=”actionscript3″ nowrap=”false”]
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;

[SWF(frameRate=”60″,width=”600″,height=”800″)]
public class camark extends Sprite
{
[Embed(source=”../Embeds/icon.jpg”)]
private var _icon:Class;

private var _bmp:Bitmap;
private var _bmd:BitmapData;

private var _disX:Number=0;
private var _disY:Number=0;

public function camark()
{
stage?init():addEventListener(Event.ADDED_TO_STAGE,init);
}

private function init(e:Event=null):void
{
makeBmd();
addEvent();
}

private function makeBmd():void
{
_bmd=new BitmapData(480+40,400+40,true,0);//创建一张位图宽480,高400,缓冲区大小为40
_bmd.draw(new _icon().bitmapData);

_bmp=new Bitmap(_bmd,”auto”,true); //创建用户OSD大小为400,400
_bmp.width=400;
_bmp.height=400;
_bmp.x=stage.stageWidth/2-_bmp.width/2;
_bmp.y=stage.stageHeight/2-_bmp.height/2;
addChild(_bmp);
}

private function addEvent():void
{
addEventListener(Event.ENTER_FRAME,onEnter);
}

private function onEnter(e:Event):void
{
_disY–;
_bmd.scroll(0,-1); //将位图像素向上位移1像素点
_bmd.fillRect(new Rectangle(0,400,_bmp.width+40,_bmp.height+40),0x000000); //将位移后的像素填充白色像素
_bmd.copyPixels(new _icon().bitmapData,new Rectangle(0,400,_bmp.width+40,_bmp.height+40),new Point(0,_bmd.height-40+_disY)); //用位图偏移的对应位置的像素填充白色像素
if(_disY<-400)removeEventListener(Event.ENTER_FRAME,onEnter); //当位移超过位图最大高度后停止位移 } } } [/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注