AnimationState

package engine
{
import flash.display.*;
import flash.geom.*;

public class AnimationState
{
public static var DIR_NULL:int = 0;
public static var DIR_LEFT:int = 1;
public static var DIR_RIGHT:int = 2;
public static var DIR_UP:int = 4;
public static var DIR_DN:int = 8;
public static var DIR_LEFT_UP:int = DIR_LEFT | DIR_UP;
public static var DIR_LEFT_DN:int = DIR_LEFT | DIR_DN;
public static var DIR_RIGHT_UP:int = DIR_RIGHT | DIR_UP;
public static var DIR_RIGHT_DN:int = DIR_RIGHT | DIR_DN;

public static var MOTION_WALK:int = 0; //行走
public static var MOTION_WAIT:int = 1; //普通待机
public static var MOTION_FIGHT_WAIT:int = 2; //战斗待机
public static var MOTION_SKILL:int = 3; //施法


private var m_nFrameNum:int = 0; //动作总帧数
private var m_nAnimTotalTime:int = 0; //动作时间长度(单位毫秒)
private var m_nCurrDuration:int = 0; //当时动作已持续了多少时间
private var m_nCurrMotionFrame:int = 0; //当时动作插入到哪一帧了
private var m_currMotion:int = 0; //当时动作是编号
private var m_Entity:Entity = null; //动作的主人
private var m_bLoop:Boolean = false; //动作是否循环
private var m_bMotionEnd:Boolean = false; //是否播完了

public function AnimationState(nMotion:int, nFrameNum:int, nTotalTime:int, et:Entity, loop:Boolean)
{
this.m_currMotion = nMotion;
this.m_nFrameNum = nFrameNum;
this.m_nAnimTotalTime = nTotalTime;
this.m_Entity = et;
this.m_nCurrDuration = 0;
this.m_bLoop = loop;
}

public function ResetMotion():void
{
this.m_nCurrDuration = 0;
this.m_bMotionEnd = false;
}

public function MotionIsEnd():Boolean
{
return this.m_bMotionEnd;
}

public function AddTime():void
{
var nFrameTime:int = Engine.GetInstance().GetCurrFrameTime();
this.m_nCurrDuration += nFrameTime;

if (m_bMotionEnd) return;

//算出每一帧插入的时间长度
var nSingleFrameTime:int = this.m_nAnimTotalTime / this.m_nFrameNum;
var nFrameNum:int = this.m_nCurrDuration/nSingleFrameTime;
if (nFrameNum > this.m_nFrameNum)
{
m_nCurrDuration = this.m_nCurrDuration % nSingleFrameTime;
if (this.m_bLoop)
{
nFrameNum = 0;
}
else
{
m_bMotionEnd = true;
return;
}
}

//算出来的帧和当前帧相同就什么也不做
if (nFrameNum == this.m_nCurrMotionFrame) return;

//设置为当前帧
this.m_nCurrMotionFrame = nFrameNum;

//单帧的象素宽度和高度
var nFramePixelWidth:int = this.m_Entity.GetSurface().width;
var nFramePixelHeight:int = this.m_Entity.GetSurface().height;

//画
var bmpArr:Array = this.m_Entity.GetBmpArr();
var nLen:int = bmpArr.length;
var nY:int = this.m_Entity.GetTopPosByDir();
for (var i:int=0; i<nLen; i++)
{
var bmd:BitmapData = bmpArr[i] as BitmapData;
if (bmd)
{
var rect:Rectangle = new Rectangle(m_nCurrMotionFrame*nFramePixelWidth,
nY, nFramePixelWidth, nFramePixelHeight);
this.m_Entity.GetSurface().copyPixels(bmd, rect, new Point(), null, null, true);
}
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您需要在 TimeScale 为0时播放Spine动画,您可以使用 Spine 的 AnimationState.TrackEntry 的时间计算方法,而不是依赖于 Unity 的 TimeScale。AnimationState.TrackEntry 是 Spine 动画的播放单元,它包含了动画的时间、速度、循环方式等信息。 您可以通过 AnimationState.SetAnimation 方法创建一个新的 TrackEntry,并在其中设置 Spine 动画的时间、速度、循环方式等信息。然后,您可以使用 AnimationState.TrackEntry 的时间计算方法来手动更新 Spine 动画的播放时间。例如,您可以使用 AnimationState.TrackEntry 的 AnimationTime 属性来手动更新 Spine 动画的时间。 下面是一个示例代码片段,可以在 TimeScale 为0 时播放 Spine 动画: ```csharp using UnityEngine; using Spine.Unity; public class SpineTimeScale : MonoBehaviour { public SkeletonAnimation skeletonAnimation; private AnimationState.TrackEntry trackEntry; private float lastTime; private void Start() { trackEntry = skeletonAnimation.state.SetAnimation(0, "animationName", true); trackEntry.timeScale = 1.0f; lastTime = Time.realtimeSinceStartup; } private void Update() { float deltaTime = Time.realtimeSinceStartup - lastTime; trackEntry.AnimationTime = trackEntry.AnimationTime + deltaTime * trackEntry.timeScale; skeletonAnimation.state.Apply(skeletonAnimation.skeleton); skeletonAnimation.skeleton.UpdateWorldTransform(); lastTime = Time.realtimeSinceStartup; } } ``` 在上面的示例中,我们创建了一个新的 TrackEntry,并在其中设置了 Spine 动画的时间、速度、循环方式等信息。然后,我们使用 AnimationState.TrackEntry 的 AnimationTime 属性来手动更新 Spine 动画的时间。 请注意,这种方法可能会导致一些性能问题,因为我们需要频繁地手动更新 Spine 动画。因此,如果您需要在 TimeScale 为0时播放Spine动画,最好使用其他的时间计算方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值