flash位图技术研究篇(3):移动缓冲区域

地图类,我们已经初步写了一下,功能还需要扩展完善,而我们现在尝试移动我们所在的缓冲区域。

上传一张:640x480的位图:我们把这张图作为地图

地图

我们使用这种素材作为我们地图,尝试一些移动我们的地图,如果让整张的地图移动,效率自然会低,我们采用的方式,仅仅移动矩形的方式,动态切割位图的方式。

键盘控制的方法:(这个方法类是网上一个人提供的,借用一下)

这个类写在package com.hero.ImageManager文件夹下:

package com.hero.ImageManager
{
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.display.DisplayObject;
    public class KEY {
        private static  var keyObj:KEY = null;
        private static  var keys:Object;
        public static function init(_stage:DisplayObject):void {
            if (keyObj == null) {
                keys = {};
                _stage.addEventListener(KeyboardEvent.KEY_DOWN, KEY.keyDownHandler);
                _stage.addEventListener(KeyboardEvent.KEY_UP, KEY.keyUpHandler);
            }
        }
        public static function isDown( keyCode:uint ):Boolean {
            return keys[keyCode];
             
        }
        private static function keyDownHandler( e:KeyboardEvent ):void {
            keys[e.keyCode] = true;
            trace( keys[e.keyCode]);
        }
        private static function keyUpHandler( e:KeyboardEvent ):void {
            delete keys[e.keyCode];
        }
    }

}


键值:说明一下键值,指定这些键值。上下左右,对于的一些键值。

package com.hero.ImageManager
{
    public final class KEYID
    {
        public static const VK_LEFT:uint  = 37;
        public static const VK_UP:uint    = 38;
        public static const VK_RIGHT:uint = 39;
        public static const VK_DOWN:uint  = 40;
       
    }
}


文档类:

导入上面的两个类:

package
{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.Rectangle;
    import flash.geom.Point;
    import flash.ui.Keyboard;
    import com.hero.ImageManager.*;
    public class Main extends Sprite
    {
        private var map:Map;
        private var mapdata:BitmapData=new map2(640,480);
        public function Main()
        {
            map=new Map(mapdata,0,0);
            map.x=0;
            map.y=0;
            addChildAt(map,0);
            KEY.init(stage);
            addEventListener(Event.ENTER_FRAME,DrawSence);
        }
        private function DrawSence(e:Event):void
        {
            map.CreateMap(300,300);
            keydownhandle();
        }
        private function keydownhandle():void
        {
            if (KEY.isDown(KEYID.VK_UP))
            {
                map.rect.y-=5;
            }
            else if (KEY.isDown(KEYID.VK_DOWN))
            {
                map.rect.y+=5;
            }
            else if (KEY.isDown(KEYID.VK_LEFT))
            {
                map.rect.x-=5;
            }
            else if (KEY.isDown(KEYID.VK_RIGHT))
            {
                map.rect.x+=5;
            }
        }
    }
}


创建一张位图,private var mapdata:BitmapData=new map2(640,480);外部导入我们的库里面。

实例化一个地图类对象,把这个对象mapdata作为我们所希望的对象参数

map=new Map(mapdata,0,0);
   map.x=0;
   map.y=0;
   addChildAt(map,0);

指定地图的位置。

键盘初始化:KEY.init(stage);

绘制场景:

private function DrawSence(e:Event):void
  {
   map.CreateMap(300,300);
   keydownhandle();
  }

通过控制,上下左右键盘,使矩形移动。一边移动,而我们的地图类里面复制像素的位移也发生相应的改变。

private function keydownhandle():void
        {
            if (KEY.isDown(KEYID.VK_UP))
            {
                map.rect.y-=5;
            }
            else if (KEY.isDown(KEYID.VK_DOWN))
            {
                map.rect.y+=5;
            }
            else if (KEY.isDown(KEYID.VK_LEFT))
            {
                map.rect.x-=5;
            }
            else if (KEY.isDown(KEYID.VK_RIGHT))
            {
                map.rect.x+=5;
            }
        }


总体的效果图:

 运行图

地图类:

package
{

    import flash.display.Sprite;
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;

    public class Map extends Sprite
    {
        private var mapWidth:Number;//地图的宽度
        private var mapHeight:Number;//地图高度
        private var mapX:Number;//地图的x坐标
        private var mapY:Number;//地图的y坐标

        private var mapArray:Array;
        private var mapdata:BitmapData;
        public var sprite:Sprite=new Sprite();//做一个容器使用
        public var rect:Rectangle;//地图的矩形外形
        public var bitmap:Bitmap;
        private var buffer:BitmapData;//缓冲区

        public function Map(mapdata:BitmapData,mapX:Number,mapY:Number)
        {
            this.mapdata=mapdata;
            //this.mapX=mapX;
            //this.mapY=mapY;
            this.mapWidth=mapdata.width;
            this.mapHeight=mapdata.height;
            bitmap=new Bitmap(mapdata);
            rect=bitmap.getRect(bitmap);//获取地图的矩形
        }
        public function get MapInfo():BitmapData
        {
            return mapdata;
        }
        public function CreateMap(bufferwidth:Number,bufferheight:Number):void
        {  
            buffer=new BitmapData(bufferwidth,bufferheight,false,0xFFFFFFFF);//设置缓冲区
            buffer.fillRect(new Rectangle(0,0,bufferwidth,bufferheight),0x0000FF00);//填充缓冲区
            trace(rect.y);
           
            if (rect.x<0 )
            {
                rect.x=0;
            }
            trace(mapWidth);
            if (rect.x+buffer.width>mapWidth)
            {
                rect.x=mapWidth-buffer.width;
            }
            if (rect.y<=0)
            {
                rect.y=0;
            }
            if (rect.y+buffer.height>mapHeight)
            {
                rect.y=mapHeight-buffer.height;
            }
            buffer.copyPixels(mapdata,new Rectangle(rect.x,rect.y,bufferwidth,bufferheight),new Point(0,0));//矩形的坐标变化,会裁剪出不同的位图数据
            FillMap(buffer);//填充位图数据

        }
        public function FillMap(data:BitmapData):void
        {  
            sprite.graphics.clear();
            sprite.graphics.beginBitmapFill(data,null,false,false);
            sprite.graphics.drawRect(0,0,data.width,data.height);
            sprite.graphics.endFill();
            addChild(sprite);
             
        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值