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);
}
}
}
上传一张: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);
}
}
}
相关文章推荐
- flash位图技术研究篇(3):移动缓冲区域
- flash位图技术研究篇(3):移动缓冲区域
- flash位图技术研究篇(1):缓冲技术
- flash位图技术研究篇(1):缓冲技术
- flash位图技术研究篇(7):像素粒子2
- flash位图技术研究篇(8):扫描像素点
- flash位图技术研究篇(8):扫描像素点
- flash位图技术研究篇(8):扫描像素点
- flash位图技术研究篇(7):像素粒子
- flash位图技术研究篇(7):像素粒子
- flash位图技术研究篇(7):像素粒子(2)
- Flash位图技术研究篇:扫描像素点
- flash位图技术研究篇(9):2D平面映射球体
- flash位图技术研究篇(7):像素粒子(2)
- flash位图技术研究篇(9):2D平面映射球体
- flash位图技术研究篇(6):黑白画
- flash位图技术研究篇(6):黑白画
- flash位图技术研究篇(1):缓冲技术
- flash位图技术研究篇(2):渲染缓冲区
- flash位图技术研究篇(2):渲染缓冲区