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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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); //当位移超过位图最大高度后停止位移
        }
    }
}

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.