快速业务通道

Flash AS3对单个图片进行角色动作化处理

作者 凌众技术 来源 网页制作 浏览 发布时间 2012-03-11

大家肯定看过大型游戏一张各个人物动作图片继承在一张位图上的程序吧~现在看看这个!

    我今天在蓝色论坛里看到一个有关"BitmapData类"的问题,我觉得用BitmapData类是可以实现里说的C++处理图片功能,再加我好久没写AS3的程序,都快生锈了!就当练练手吧!我查了一下Flash帮助文件,整理一下思路花了中午时间写出下面document类文件;这个功能比较适合做Flash游戏开发了。我加了键盘事件,用来控制角色移动方向。如果在对类代码中使用的类对象不清楚的话,请看Flash帮助文件吧!

    提问者提供一个角色动作图片,我也就在就直接用这图片了!

 Flash AS3对单个图片进行角色动作化处理

演示处理运行效果(如果看不到,请更新你的Flash Player播放器吧!你可以使用方向键,改变角色移动方向)

Flash效果

GameSprite类:

  1.  package {   
  2.     import flash.display.*;   
  3.     import flash.net.*;   
  4.     import flash.utils.Timer;   
  5.     import flash.events.*;   
  6.     import flash.geom.*;   
  7.   
  8.     public class GameSprite extends Sprite {   
  9.         private var timer:Timer;   
  10.         private var sWidth:uint;   
  11.         private var sHeight:uint;   
  12.         private var sStep:uint;   
  13.         private var sDirection:uint;   
  14.         private var loader:Loader;   
  15.         private var maps:Array;   
  16.         private var pointer:uint;   
  17.         private var map:Bitmap;   
  18.         function GameSprite() {   
  19.             //角色大小;   
  20.             sWidth = 100;   
  21.             sHeight = 100;   
  22.             //角色移动方向;   
  23.             sDirection = 0;   
  24.             //角色步数;   
  25.             sStep = 1;   
  26.             //角色动作数组;   
  27.             maps = new Array();   
  28.             //初始化角色动作运行指针;   
  29.             pointer = 0;   
  30.             //初始化time;   
  31.             timer = new Timer(100);   
  32.             timer.addEventListener(TimerEvent.TIMER, timerHandler);   
  33.             //图片加载对象;   
  34.             loader = new Loader();   
  35.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);   
  36.             loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);   
  37.             loader.load(new URLRequest("/download/sprite.png"));   
  38.   
  39.             stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);   
  40.         }   
  41.         //错误处理事件;   
  42.         private function errorHandler(event:IOErrorEvent):void {   
  43.             trace("IOErrorEvent");   
  44.   
  45.         }   
  46.         //键盘事件,通过方向键更改角色移动方向;   
  47.         private function keyDownHandler(event:KeyboardEvent):void {   
  48.             switch (event.keyCode) {   
  49.                 case 40 :   
  50.                     sDirection = 0;   
  51.                     break;   
  52.                 case 38 :   
  53.                     sDirection = 3;   
  54.                     break;   
  55.                 case 37 :   
  56.                     sDirection = 1;   
  57.                     break;   
  58.                 case 39 :   
  59.                     sDirection = 2;   
  60.                     break;   
  61.             }   
  62.   
  63.         }   
  64.         //定时器运行事件;   
  65.         private function timerHandler(event:Event):void {   
  66.             //删除旧的角色动作图像;   
  67.             if (map != null) {   
  68.                 removeChild(map);   
  69.             }   
  70.             //显示新的角色动作图像;   
  71.             map = new Bitmap(maps[sDirection][pointer]);   
  72.             addChild(map);   
  73.             //角色动作循环处理;   
  74.             if (pointer < sStep-1) {   
  75.                 pointer ++;   
  76.             } else {   
  77.                 pointer = 0;   
  78.             }   
  79.         }   
  80.         //加载图片完成处理事件;   
  81.         private function completeHandler(event:Event):void {   
  82.             //根据图片的大小初始化BitmapData;   
  83.             /*  
  84.              * 注意如果你要保留原来的图片的透明度的话,必将transparent设置为true,同时设置填充色值的前两位为00;  
  85.              */  
  86.             var sBmd:BitmapData = new BitmapData(loader.width,loader.height,true,0x00FFFFFF);   
  87.             sBmd.draw(loader);   
  88.             //计算移动步数;   
  89.             sStep = Math.floor(loader.width/sWidth);   
  90.             for (var j:uint = 0; j<Math.floor(loader.height/sHeight); j++) {   
  91.                 var arr:Array = new Array();   
  92.                 for (var i:uint = 0; i<sStep; i++) {   
  93.                     var bmd:BitmapData = new BitmapData(sWidth,sHeight,true,0x00FFFFFF);   
  94.                     //获取单个角色的BitmapData对象;   
  95.                     bmd.copyPixels(sBmd,new Rectangle(sWidth*i, sHeight*j, sWidth, sHeight),new Point(0,0));   
  96.                     arr.push(bmd);   
  97.                 }   
  98.                 //放入角色数组里;   
  99.                 maps.push(arr);   
  100.             }   
  101.             //释放sBmd资源;   
  102.             sBmd.dispose();   
  103.             //开始运行角色动作;   
  104.             timer.start();   
  105.         }   
  106.     }   
  107. }  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号