算法、数据结构、与设计模式等在游戏开发中的运用 (三):插值(Interpolation) (2)

假设你的精灵表单(Spritesheet)中有n个精灵(Sprite)是用于某一个动画中的,那么你可以将时间作为参数,用插值的方法来获得[0, n]之间的精灵索引值(Index)来控制精灵图片的切换速率,实现精灵动画(Sprite Animation)效果

泡泡爆炸spritesheet

泡泡爆炸精灵表单(Spritesheet)

泡泡爆炸精灵动画播放效果


以下为Unity中的范例代码

public class SpriteSheetAnimator : MonoBehaviour { // spritesheet中所有的sprites public Sprite[] sprites; // 动画播放一遍所需要的时间(周期) public float period; // 当前动画播放时间 private float t; private SpriteRenderer spriteRenderer; // Start is called before the first frame update void Start() { t = period; spriteRenderer = GetComponent<SpriteRenderer>(); } // Update is called once per frame void Update() { // 按下空格键重制时间,从头播放 if(Input.GetKeyDown(KeyCode.Space)){ t = 0; Debug.Log("Start"); } // 更新 当前时间t 和 当前精灵图片 if(t < period){ t += Time.deltaTime; // 利用获得以0为起点,(sprites总数-1)为终点的插值来计算当前精灵图片的index // 由于插值默认时间t在0..1之间(period = 1),这里需要用 t/period 来转化成动画播放的实际周期 int curIndex = Mathf.FloorToInt(interpolate(t / period, 0, sprites.Length - 1)); spriteRenderer.sprite = sprites[curIndex]; } } public float interpolate(float startVal, float endVal, float t){ return startVal + t * (endVal - startVal); } }

除了上述两个被详细介绍的方面以外,插值也可以用于碰撞检测(实际上是通过使用参数方程来计算碰撞点是否存在,以后开单章介绍)以及曲线运动(基本和连接函数图像一样,这里就不赘述了)。同时,插值在图形学中也有很多妙用。不过对于游戏开发来说,图形学涉及的部分已经非常底层,这里也同样略过了。

4. 总结

总体而言,插值在实现简单的动态效果上是非常实用的,更何况他的实现方式也并不复杂,而且大部分游戏开发工具都会自带插值函数。不过要学习更多有趣的插值函数和运用方法,不是短短一篇博客可以解决的,这篇文章也旨在帮助大家了解插值在游戏开发中最常用到的地方,所以如果有兴趣进一步了解的话还是需要自己去学习。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzpzg.html