还记得flashmath 网站制作了一个例子,在里面有一个翻牌的效果。在那个时候,还没来得及时去看他们的原理,经过同事讲解之后,里面发现一些小细节的地方其实可以应用到目前很多游戏当中。但是我没有参照他的案例去写,反而写了一个比较原始,只能出效果的小实验。
这个实验,需要使用两张的位图,翻转的时候切换另外一张牌进行切换,至于什么时候切换是比较好?其实就是在 90 ,270 度这两个地方让人视角产生差异的地方进行切换是比较好的。
因为当rotationY =90的时候,是很难看到图片的全貌,所以这个时候进行你切换位图是很难让人看得出你在干啥,在flashmath案例当中使用了这个小技巧,真是很值得去学习。
下面做一个小实验:
var data:Array = [new bitmapDataA(0,0),new bitmapDataB(0,0)];//准备两张位图
//建立容器
var container:Sprite=new Sprite();
addChild(container);
container.x = 250;
container.y = 200;
//将位图移动到注册点位置
var bitmap:Bitmap=new Bitmap();
bitmap.bitmapData = data[0];
bitmap.x = - bitmap.width / 2;
bitmap.y = - bitmap.height / 2;
container.addChild(bitmap);
var key:Boolean = true;
var max:int = 85;
addEventListener(Event.ENTER_FRAME,Run);
var n:int = 5;
var isflip:Boolean = true;//是否翻转
function Run(event:Event):void
{
n += 5;
container.rotationY = n % 360;
if ( isflip && n > max )
{
isflip = false;
if (key)
{
bitmap.bitmapData = data[1];
key = false;
max = 265;
}
else
{
bitmap.bitmapData = data[0];
key = true;
max = 85;
}
}
if (! key && n > 265)
{
isflip = true;
}
if (n%360==0)
{
n = 5;
isflip = true;
}
}
其中var data:Array = [new bitmapDataA(0,0),new bitmapDataB(0,0)];//准备两张位图
一张是背面 一张是正面
正面和反面 两张位图。
下面再做一个小实验:
封装一个类,要求是点击牌就能够进行翻转,只是进行一个没有什么速度的效果。
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.display.BitmapData;
import flash.display.Bitmap;
public class FilpEffect extends Sprite
{
private var data:Array = [];
public var speed:int=5;
private var isFilp:Boolean = false;
private var bitmap:Bitmap;
private var count:int;
private var isComplete:Boolean=false;
public function FilpEffect()
{
bitmap=new Bitmap();
addChild(bitmap);
}
//填充两个面的位图
public function fill(topBmpData:BitmapData,bottomBmpData:BitmapData):void
{
data.push(topBmpData,bottomBmpData);
bitmap.bitmapData = data[0];
bitmap.x = - bitmap.width / 2;
bitmap.y = - bitmap.height / 2;
}
//播放特效
public function doEffect():void
{
if (! isFilp)
{
addEventListener(Event.ENTER_FRAME,onFilp);
isFilp = true;
}
}
private function onFilp(event:Event):void
{
count+=speed;
this.rotationY=count%360;
if( !isComplete && count>85)
{
bitmap.bitmapData = data[1];
this.scaleX=-1;
isComplete=true;
}
if(count>=180)
{
removeEventListener(Event.ENTER_FRAME,onFilp);
isFilp=false;
isComplete=false
count=0;
}
}
//重设默认
public function rest():void
{ if(data[0])
bitmap.bitmapData = data[0];
this.scaleX=1;
}
}
}