作者:龙飞
1.1:简单动画
游戏离不开动画。我们考虑最简单的情况:将一个角色从一个位置移动到另外一个位置。这个行为表述给电脑就是,将一个surface不断的blit(),从起始位置的坐标,移动到结束位置的坐标。移动速度取决于每次blit()的坐标差和blit()的时间间隔(v = ds/dt )。
我们来设计一个函数实现这个简单的动画。我们需要的数据有:起始坐标(int beginX, int beginY),结束坐标(int endX, int endY),以及作为SDL基础的ScreenSurface窗口(const ScreenSurface& screen)。一般的考虑是,将这5个数据以参数的方式传入函数;但是一种更加通用一点的方式是,将这5种数据合并成一个结构,这样函数的参数形式会更加的统一,这正是触发多线程的函数所需要的。在SDL中,我们通过函数:
SDL_Thread
*
SDL_CreateThread(
int
(
*
fn)(
void
*
),
void
*
data);
触发多线程,其中所需要的函数指针形式为:
typedef
int
(
*
fn)(
void
*
);
而void*类型的data就是函数(*fn)()需要的的数据。我们可以将任意的结构体指针,转化为void*,作为这个函数的第二个参数需要。
因此,我们可以为我们需要的动画函数定义一个结构作为传递所有数据的载体:
struct
AmnArg
{
int beginX;
int beginY;
int endX;
int endY;
const ScreenSurface & screen;
AmnArg( int begin_x,
{
int beginX;
int beginY;
int endX;
int endY;
const ScreenSurface & screen;
AmnArg( int begin_x,