当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > Flash AS3对单个图片进行角色动作化处理

ActionScript
Flash AS教程:图片环绕旋转动画
Flash贪吃蛇游戏AS代码翻译
Flash AS教程:旋转立方体
Flash AS3教程:ImageLoader类
Flash AS3教程:疑难杂症汇总
Flash AS3教程:类的分包处理
Flash AS3教程:Dot类
Flash游戏开发:BitmapData的使用
初学AS3的几点技巧汇总
飘雪Flash动画简单制作
Flash air制作淡入淡出窗体动画效果
Flash air制作透明雪花特效
Flash AS制作LRC歌词同步的详细教程
Flash as3:绝对坐标与相对坐标
Flash AS3用于读取LRC同步歌词的类
优化Flash Actionscript代码的三种方法
AS3的System类解决歌词中乱码问题
Flash as3嵌入中文字体的方法
Flash AS3教程:ClassLoader类
Flash AS3教程:ByteLoader类

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-16   浏览: 92 ::
收藏到网摘: n/a

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

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

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

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

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

Flash效果

GameSprite类:

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

载入外部png图片,然后使用BitmapData类非常理想,最大的问题是:从表面上看图片是透明的,但是其实图片是一个矩形,所以这个矩形区域会遮住它下面的内容,所以当你用鼠标点击这个矩形区域时,你的鼠标是在矩形区域上而不是它下面的内容(其实这就好比你把一个 movieClip的alhpa值设为0,看上去什么都没有,但是它却实实在在地存在)。所以如果你的人物是通过鼠标来操作它的行走,这个时候可能会有一些问题了。