您的位置:首页 > 其它

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

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

上传一张: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);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: