我首先想到的是深蓝色右手。右手大侠的思维习惯,我可能跟不上。
所以down了本Learning.XNA.3.0,以前看过点,觉得比较亲切。翻了下似乎也没耐心看具体的文字。
不过我很乐意把书中的gameloop的图放上来。
另外书中的关于sprite的目录还是值得一列
1.添加一个sprite到项目中 “qs就是一张图片或者一组图片”
2.加载和显示sprite “”
3.透明化等 “”
4.显示层次 “”
5.如何移动sprite “修改图片的位置,然后再新的位置显示出来”
6.精灵动画 “多张图片的显示”
7.调整帧率 “整个游戏的循环速度,注意是整个游戏的。”
8.动画速度 “单个sprite的动画速度。”
综合考虑上面8点,结合右手等人的资料。sprite的概念算是比较清晰起来。
sprite=“有一个canvas,显示外观,有一段logic决定自己的外观和行为,有一个listener接受外部信号”
sprite应该继承自canvas,这样显示就不是问题。只要在自己的canvas上重画就好了。
如果继承自object,则要考虑把sprite的内容在某一个canvas中画出来。可能不方便。
考虑下面一个命令“1。移动到坐标 40,100处,2。向左转 3。跑起来 4。我玩完了。”
sprite的关键问题1是如何接受信号。其实是整个游戏怎么处理用户输入的问题。如果每个精灵都能正确的接受到自己的信号。剩下的就是刷新问题了。
思路是1“统一接收外部信号,然后根据状态,决定信号的目标”,2“每个sprite自己能接收信号”
游戏循环要处理每个sprite,所以得有一个spriteManager管理所有的sprite,这样用一个for循环就可以出来所有的sprite了。
sprite的动作完成需要一段时间,如何合理的分配时间呢?总不能等一个sprite做完杀人的动作,另一个sprite才“啊的一身,然后慢慢倒地” 这个显然就是帧率要处理的,每个循环,每个sprite只能处理一个帧的内容。如何做到呢?简单的来考虑。命令spriteA和B从不同的位置移动到C点,不能是A移动到C,然后B移动到C,
因此sprite需要记录当前的动作,以及是否完成。然后给每个sprite一个时间片做自己的事情。现在的问题是sprite的时间片如何实现?
显然应该给每个sprite一个线程,按照我们的程序基础,只有这样才能控制时间片。让这个线程开启,执行一个帧的时间,结束它,刷新结果。
综上所诉,一个sprite应该是这个样子
sprite:canvas
{
property1。。n
state1。。n
animationSpeed
execute :thread(lasttime=50ms),lasttime根据framerate决定,framerate可以根据sprite和画质来决定。
update:redraw the canvas
command[] may push more than one action.
commandIndex :current action。
appearance[] :is a set of images
load appearance[]: can be called when a sprite is created or dynamicaly such as used in backgroudSprite.
}
到这里为止,我们还没有写过代码。下面是时候把这些东西做起来了。当然还得验证下上面的思路是否正确。