一个拼图游戏 (Actionscript 3.0)

这段代码转自blueidea 的youxiazhu,拿到这里学习一下。

package {
 import flash.display.Sprite;
 import flash.display.Loader;
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.net.URLRequest;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.geom.Rectangle;
 import flash.geom.Matrix;
    
    
 public class main extends Sprite {
      
      
 private var loadPic:Loader;
 private var num:uint;
 private var subArr:Array;
 private var offsetX:Number;
 private var offsetY:Number;
 private var draggedPic:Sprite;
        
        
 public function main() {
 num = 4;
 subArr = new Array(num*num);
            
 loadPic = new Loader();
 var picPath:String = "image.jpg";
 var url:URLRequest = new URLRequest(picPath);
 loadPic.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded);
 loadPic.load(url);
 }
        
        
 private function loaded(e:Event) {
 loadPic.width = stage.stageWidth;
 loadPic.height = stage.stageHeight;
 stage.addChild(e.target.loader);//loadPic
 stage.addEventListener(MouseEvent.CLICK,clicked);
 }
        
        
 private function clicked(e:MouseEvent) {
 stage.removeEventListener(MouseEvent.CLICK,clicked);
 loadPic.visible = false;
 var w:Number = loadPic.width/num;
 var h:Number = loadPic.height/num;
            
 for (var i:uint; i<num; i++) {
 for (var j:uint=0; j<num; j++) {
 var bitmapSprite:Sprite = new Sprite();
 var picData:BitmapData = new BitmapData(w,h);
 var subPic:Bitmap = new Bitmap(picData);
 var matrix:Matrix = new Matrix(1,0,0,1,-i*w,-j*h);
 picData.draw(loadPic,matrix,null,null);
                    
                    
 bitmapSprite.addChild(subPic);
 subArr[j*num+i]=bitmapSprite;
 bitmapSprite.x = (stage.stageWidth-w)*Math.random();
 bitmapSprite.y = (stage.stageHeight-h)*Math.random();
 bitmapSprite.addEventListener(MouseEvent.MOUSE_DOWN,downSubPic);
 bitmapSprite.addEventListener(MouseEvent.MOUSE_UP,upSubPic);
 stage.addChild(bitmapSprite);
 }
 }
 }//end of function clicked
        
        
 private function downSubPic(e:MouseEvent) {
 draggedPic = Sprite(e.target);
 offsetX = e.stageX - draggedPic.x;
 offsetY = e.stageY - draggedPic.y;
 stage.addChild(draggedPic);
 stage.addEventListener(MouseEvent.MOUSE_MOVE, moveSubPic);
 }
        
        
 private function upSubPic(e:MouseEvent) {
 stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveSubPic);
 }
        
        
 private function moveSubPic(e:MouseEvent) {
 draggedPic.x = e.stageX - offsetX;
 draggedPic.y = e.stageY - offsetY;
 }
        
        
 }
}

其实这段代码还没有做成游戏,只是把图拆了,然后可以拖放。

num = 4;
subArr = new Array(num*num);
这个很好理解,把图片要拆成的横竖的数量, 这里是4*4=16块小图片。

loadPic = new Loader();
这里的 new Loader 我容易把它当成是一种服务,而不是一种可显示对象,其实我想的服务是var url:URLRequest = new URLRequest(picPath) 这部分.在Cookbook中这样说:要在播放.swf的执行期间载入无不影像获影片时,就必须使用Loader类别。Loader和 flash.net.URLLoader很相似,都是用于载入,但是 Loader实体可以载入外部影像和影片将其显示在荧幕上,而URLLoader是用于传输资料。

var bitmapSprite:Sprite = new Sprite();
var picData:BitmapData = new BitmapData(w,h);
var subPic:Bitmap = new Bitmap(picData);
var matrix:Matrix = new Matrix(1,0,0,1,-i*w,-j*h);
picData.draw(loadPic,matrix,null,null);
这段代码比较感兴趣,因为之前都没有进行Bitmap方面的练习,所以有些陌生。
首先,要明白BitmapData是当Bitmap进行图像处理时需要的一个东西。
Martix也很陌生,什么东西呢?
Matrix 类表示一个转换矩阵,它确定如何将点从一个坐标空间映射到另一个坐标空间。 您可以对一个显示对象执行不同的图形转换,方法是设置 Matrix 对象的属性,将该 Matrix 对象应用于 Transform 对象的 matrix 属性,然后应用该 Transform 对象作为显示对象的 transform 属性。 这些转换函数包括平移(x 和 y 重新定位)、旋转、缩放和倾斜。
明白了吗?呵呵,我也不明白,什么右移的下移的,不明白。等待高手!

 private function downSubPic(e:MouseEvent) {
 draggedPic = Sprite(e.target);
 offsetX = e.stageX - draggedPic.x;
 offsetY = e.stageY - draggedPic.y;
 stage.addChild(draggedPic);
 stage.addEventListener(MouseEvent.MOUSE_MOVE, moveSubPic);
 }
 private function moveSubPic(e:MouseEvent) {
 draggedPic.x = e.stageX - offsetX;
 draggedPic.y = e.stageY - offsetY;
 }
这一句是用来拖放图片的,为什么没用startDrog()呢?难道是效率执行的问题?
不过这的确是一种方法,看清楚这里的 e.stageX,习惯了2.0 xmouse ,一打眼怎么都不明白stageX(以为是stage的x坐标了)为什么会变化。

我把拖放那一部分改写了
package {
 import flash.display.Sprite;
 import flash.display.Loader;
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.net.URLRequest;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.geom.Rectangle;
 import flash.geom.Matrix;
    
    
 public class main extends Sprite {
      
      
 private var loadPic:Loader;
 private var num:uint;
 private var subArr:Array;
 private var offsetX:Number;
 private var offsetY:Number;
 private var draggedPic:Sprite;
        
        
 public function main() {
 num = 4;
 subArr = new Array(num*num);
            
 loadPic = new Loader();
 var picPath:String = "image.jpg";
 var url:URLRequest = new URLRequest(picPath);
 loadPic.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded);
 loadPic.load(url);
 }
        
        
 private function loaded(e:Event) {
 loadPic.width = stage.stageWidth;
 loadPic.height = stage.stageHeight;
 stage.addChild(e.target.loader);//loadPic
 stage.addEventListener(MouseEvent.CLICK,clicked);
 }
        
        
 private function clicked(e:MouseEvent) {
 stage.removeEventListener(MouseEvent.CLICK,clicked);
 loadPic.visible = false;
 var w:Number = loadPic.width/num;
 var h:Number = loadPic.height/num;
            
 for (var i:uint; i<num; i++) {
 for (var j:uint=0; j<num; j++) {
 var bitmapSprite:Sprite = new Sprite();
 var picData:BitmapData = new BitmapData(w,h);
 var subPic:Bitmap = new Bitmap(picData);
                    
 var matrix:Matrix = new Matrix(1,0,0,1,-i*w,-j*h);
                    
 picData.draw(loadPic,matrix,null,null);
                    
                    
 bitmapSprite.addChild(subPic);
                    
 subArr[j*num+i]=bitmapSprite;
                    
 bitmapSprite.x = (stage.stageWidth-w)*Math.random();
 bitmapSprite.y = (stage.stageHeight-h)*Math.random();
 bitmapSprite.addEventListener(MouseEvent.MOUSE_DOWN,downSubPic);
 bitmapSprite.addEventListener(MouseEvent.MOUSE_UP,upSubPic);
 stage.addChild(bitmapSprite);
 }
 }
 }//end of function clicked
        
        
 private function downSubPic(e:MouseEvent) {
 draggedPic = Sprite(e.target);
 stage.addChild(draggedPic);
            draggedPic.startDrag();
 }
        
        
 private function upSubPic(e:MouseEvent) {
            e.target.stopDrag();
 }
        
        
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值