flash位图技术研究篇(1):缓冲技术 收藏
今天终于对位图这个东西有点新一点认识,自从位图类引进后,感觉到位图是应用得比较多的一个类,当中其实还有一些奥秘值得去研究。
看看网上搜索的概念:
一 双重缓冲区绘图技术概念
双重缓冲区技术能够使程序的绘图更加快速和平滑,有效减少绘制时的图像闪烁。该技术的基本原理是先将图像绘制到内存中的一块画布上,一旦所有的绘制操作都完成了,再将内存中的画布推到窗体的或者控件的表面将其显示出来。通过这种操作后的程序能使用户感觉其更加快速和美观。
很久之前,我曾经玩过c++关于贴图的一些应用。例如,我要在窗口外加载一张图片,首先我需要一些加载外部的文件,其次我要知道怎样才能将这张图贴到窗口去,做法是使用c++一些位图操作类进行操作如 BitBlt类这个类可以操作一些像素
BitBlt (hdc, x, y, cxSource, cySource, hdcMem, 0, 0, SRCCOPY) ;
这个做法是通过操作内存的位图数据来进行。
同样在操作内存位图,flash已经提供了两个有用的类,一个BitmapData,一个是Bitmap类。其中BitmapData类提供了很多关于操作位图的方法,这样为我们实现缓冲技术有了很大的帮助。
开始之前,我们做几个小实验,这样我们会发觉日后会有很多有趣的事情发生。
二、小实验
第一件事情,我们填充颜色,研究一下怎样填充颜色。
2.1 填充颜色
首先我们建立一个继承Sprite的子类:
view plaincopy to clipboardprint?
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
public function Example2()
{
init();
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
var iamge:Bitmap=new Bitmap(backBuffer);//建立一个位图
addChild(iamge);//显示位图
}
}
}
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
public function Example2()
{
init();
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
var iamge:Bitmap=new Bitmap(backBuffer);//建立一个位图
addChild(iamge);//显示位图
}
}
}
看看这样的效果,是不是达到我们想要的效果?已经填充一个区域了。呵呵是不是很酷呢?如果还不觉得好玩,请继续看下去
接下来,我们继续修改一下代码:这次我们改用建立一个Sprite类来做一张画稿。
view plaincopy to clipboardprint?
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
public function Example2()
{
init();
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
}
}
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
public function Example2()
{
init();
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
}
}
这一次,改变显示方法,采用Graphics类为我们提供的绘画Api函数。同时进行填充位图,同样可以得到上面图的效果。
2.2 复制位图到缓冲区域
现在我们进行第二个小实验;复制图片到缓冲区,然后再显示出来
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
backBuffer是我们建立一个位图缓冲区,用于存放位图数据信息。当我们希望在这个区域复制像素到这个缓冲区里面去,看看是怎样做呢?
view plaincopy to clipboardprint?
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
import flash.geom.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
private var myplane:plane=new plane(59,43);//我们在flash 库里面的资源,是bitmapdata的一个子类
private var position:Point=new Point(250,200);// 指定像素位置
public function Example2()
{
init();
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
backBuffer.copyPixels(myplane,myplane.rect, position, myplane.bitmapAlpha, new Point(0, 0), true);
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
}
}
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
import flash.geom.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
private var myplane:plane=new plane(59,43);//我们在flash 库里面的资源,是bitmapdata的一个子类
private var position:Point=new Point(250,200);// 指定像素位置
public function Example2()
{
init();
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
backBuffer.copyPixels(myplane,myplane.rect, position, myplane.bitmapAlpha, new Point(0, 0), true);
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
}
}
图中的飞机已经被复制到缓冲区里面去了。
缓冲区里面复制这飞机的像素,并进行了显示copyPixels。如果还不觉得酷的话,我们再引入一些让飞机进行运动,并每一帧进行绘制。
2.3飞机运行
首先:addEventListener(Event.ENTER_FRAME,Run);进行监听。
private function Run(e:Event):void
{
}
注意到我们private var position:Point=new Point(250,200);// 指定像素位置这个属性,我们每一帧改变他的贴图位置,这样我们需要每一帧进行重写绘制,场景的飞机就好像会一样。
view plaincopy to clipboardprint?
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
import flash.geom.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
private var myplane:plane=new plane(59,43);//我们在flash 库里面的资源,是bitmapdata的一个子类
private var position:Point=new Point(250,200);// 指定像素位置
public function Example2()
{
addEventListener(Event.ENTER_FRAME,Run);
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
backBuffer.copyPixels(myplane,myplane.rect, position, myplane.bitmapAlpha, new Point(0, 0), true);
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
private function Run(e:Event):void
{
init();
position.x+=5;//修改贴图x轴位置
position.y+=3;//修改贴图y轴位置
}
}
}
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
import flash.geom.*;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
private var myplane:plane=new plane(59,43);//我们在flash 库里面的资源,是bitmapdata的一个子类
private var position:Point=new Point(250,200);// 指定像素位置
public function Example2()
{
addEventListener(Event.ENTER_FRAME,Run);
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
backBuffer.copyPixels(myplane,myplane.rect, position, myplane.bitmapAlpha, new Point(0, 0), true);
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
private function Run(e:Event):void
{
init();
position.x+=5;//修改贴图x轴位置
position.y+=3;//修改贴图y轴位置
}
}
}
2.4控制飞机运行
曾经有一个广告讲一群小朋友的未来梦想,有一个人说到,希望将来可以开飞机。我们也像他们一样,让位图跟随我们控制移动
导入 import flash.ui.Keyboard;包
监听按键事件:
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
private function keyDown(e:KeyboardEvent):void
{
}
但是通过这种方式来控制我们的飞机,并不让我们觉得开心,因为响应按键事件的时候,我们觉得一点也不流畅。这需要我们对程序进行改进,加以修改方式。而这里主要讲的是这个怎样建立缓冲位图区和绘制图形到窗口去。
代码如下:
view plaincopy to clipboardprint?
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
import flash.geom.*;
import flash.ui.Keyboard;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
private var myplane:plane=new plane(59,43);//我们在flash 库里面的资源,是bitmapdata的一个子类
private var position:Point=new Point(250,200);// 指定像素位置
public function Example2()
{
addEventListener(Event.ENTER_FRAME,Run);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
backBuffer.copyPixels(myplane,myplane.rect, position, myplane.bitmapAlpha, new Point(0, 0), true);
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
private function Run(e:Event):void
{
init();
}
private function keyDown(e:KeyboardEvent):void
{
if (e.keyCode==Keyboard.UP)
{
position.y-=5;
}
else if (e.keyCode==Keyboard.DOWN)
{
position.y+=5;
}
else if (e.keyCode==Keyboard.LEFT)
{
position.x-=5;
}
else if (e.keyCode==Keyboard.RIGHT)
{
position.x+=5;
}
}
}
}
package
{
import flash.display.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
import flash.geom.*;
import flash.ui.Keyboard;
public class Example2 extends Sprite
{
private var backBuffer:BitmapData=new BitmapData(550,400,false);//建立一个缓冲区
private var clearColor:uint=0x0000FF;//指定填充的颜色
private var myplane:plane=new plane(59,43);//我们在flash 库里面的资源,是bitmapdata的一个子类
private var position:Point=new Point(250,200);// 指定像素位置
public function Example2()
{
addEventListener(Event.ENTER_FRAME,Run);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
}
private function init():void
{
backBuffer.fillRect(backBuffer.rect, clearColor);//填充
backBuffer.copyPixels(myplane,myplane.rect, position, myplane.bitmapAlpha, new Point(0, 0), true);
var iamge:Sprite=new Sprite();//建立一个位图
addChild(iamge);//显示位图
iamge.graphics.clear();
iamge.graphics.beginBitmapFill(backBuffer, null, false, false);//使用 填充位图的方法 填充缓冲区
iamge.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);//画出矩形
iamge.graphics.endFill();//结束填充
}
private function Run(e:Event):void
{
init();
}
private function keyDown(e:KeyboardEvent):void
{
if (e.keyCode==Keyboard.UP)
{
position.y-=5;
}
else if (e.keyCode==Keyboard.DOWN)
{
position.y+=5;
}
else if (e.keyCode==Keyboard.LEFT)
{
position.x-=5;
}
else if (e.keyCode==Keyboard.RIGHT)
{
position.x+=5;
}
}
}
}
好,暂时写到这里,明天再修改
语法参考:
beginBitmapFill(bitmap:BitmapData, matrix:Matrix = null, repeat:Boolean = true, smooth:Boolean = false):void
用位图图像填充绘图区。
clear():void
清除绘制到此 Graphics 对象的图形,并重置填充和线条样式设置。
drawRect(x:Number, y:Number, width:Number, height:Number):void
绘制一个矩形。
copyPixels(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, alphaBitmapData:BitmapData = null, alphaPoint:Point = null, mergeAlpha:Boolean = false):void
为没有拉伸、旋转或色彩效果的图像之间的像素处理提供一个快速例程。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hero82748274/archive/2009/02/28/3942156.aspx
flash位图技术研究篇(2):渲染缓冲区 收藏
有一段时间没有理会过自己的博客,今天突然很想写一些日志。回想最近的事情,找工作的郁闷事情。毕业后,遇到一个人面兽心的主管。虽然工作了两个月,但是找工作依然是严峻。没有工作,何来经验,企业要求是经验,而大学毕业何来经验?十分的矛盾。不管什么事情了,还是坚持我们的所爱的,只要坚持下去,我想一定会有所成绩。只要时机来临了,一定会变得好起来了。回归到主题。
渲染缓冲区,今天很想探讨一些缓冲填充的技术。其实也不算什么技术,我们可以理解为画画。我们打开一张纸,然后在画面上填充我们想要的东西。首先让我了解一下,as3.0提供了BitmapData和Graphics类,这两种类为我们提供了一些操作位图的数据。
好,看看如何去实现我们的位图填充。
新建一个类,名为Map类,地图类继承Sprite类,作为它的子类。
view plaincopy to clipboardprint?
package
{
import flash.display.Sprite;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class Map extends Sprite
{
}
}
package
{
import flash.display.Sprite;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class Map extends Sprite
{
}
}
接下来,加入构造函数:
view plaincopy to clipboardprint?
package
{
import flash.display.Sprite;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class Map extends Sprite
{
public function Map(mapdata:BitmapData,mapX:Number,mapY:Number)
{
}
}
}
package
{
import flash.display.Sprite;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class Map extends Sprite
{
public function Map(mapdata:BitmapData,mapX:Number,mapY:Number)
{
}
}
}
我们简单分析一下,这个地图类,地图类包括的属性有地图数据,图的数据,有地图的坐标,宽度等等。
这个类中,我们引入一个创建图的方法。
public function CreateMap(bufferwidth:Number,bufferheight:Number):void
这个方法带三个参数,bufferwidth是指缓冲区的宽度,
bufferheight指缓冲区的高度
然后,我们所做的事情,包括,创建一个渲染的缓冲区,指定他的大小
如:
buffer=new BitmapData(bufferwidth,bufferheight,false,0xFFFFFFFF);//设置缓冲区
这样就可以指定了一个填充的缓冲区。
复制像素到缓冲区:
由于缓冲区 上面的域并没有什么信息数据,为了能让这个缓冲区有内容,我们使用复制像素的做法,复制我们所需要的像素。他就像一个“回”上面的口字可以看作我们的视框,而下面就是一张底图,每次我们移动图形的时候,复制的仅仅是我们所看到区域,填充的区域仅仅是我们规定的缓冲区大小。这样做法,有利于我们的内存使用。
如:
buffer.copyPixels(mapdata,new Rectangle(rect.x,rect.y,bufferwidth,bufferheight),new Point(0,0));//矩形的坐标变化,会裁剪出不同的位图数据
看一下完整的代码:
view plaincopy to clipboardprint?
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 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);//填充位图数据
}
当中还有个判断区域,这个移动区域不能超出我们最大底图的宽度和高度。
填充位图
对于缓冲区并不能显示到我们的窗口里面,为了显示到我们的窗口,我们还要将其数据填充到窗口里面。我们所使用的是Graphics 类包提供给我们的一些简单的方法。如
view plaincopy to clipboardprint?
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);
}
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);
}
完整代码:
view plaincopy to clipboardprint?
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);
}
}
}
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);
}
}
}
copyPixels(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, alphaBitmapData:BitmapData = null, alphaPoint:Point = null, mergeAlpha:Boolean = false):void
为没有拉伸、旋转或色彩效果的图像之间的像素处理提供一个快速例程。
clear():
填充完后,加加入显示列表里面,我们就能看到我们所需要的位图。
beginBitmapFill
drawRect
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hero82748274/archive/2009/04/03/4002473.aspx
flash位图技术研究篇(3):移动缓冲区域 收藏
地图类,我们已经初步写了一下,功能还需要扩展完善,而我们现在尝试移动我们所在的缓冲区域。
上传一张:640x480的位图:我们把这张图作为地图
我们使用这种素材作为我们地图,尝试一些移动我们的地图,如果让整张的地图移动,效率自然会低,我们采用的方式,仅仅移动矩形的方式,动态切割位图的方式。
键盘控制的方法:(这个方法类是网上一个人提供的,借用一下)
这个类写在package com.hero.ImageManager文件夹下:
view plaincopy to clipboardprint?
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
{
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];
}
}
}
键值:说明一下键值,指定这些键值。上下左右,对于的一些键值。
view plaincopy to clipboardprint?
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 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;
}
}
文档类:
导入上面的两个类:
view plaincopy to clipboardprint?
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;
}
}
}
}
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();
}
通过控制,上下左右键盘,使矩形移动。一边移动,而我们的地图类里面复制像素的位移也发生相应的改变。
view plaincopy to clipboardprint?
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 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;
}
}
总体的效果图:
地图类:
view plaincopy to clipboardprint?
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);
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hero82748274/archive/2009/03/18/4002607.aspx