[C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义

时间:2024-08-27 15:06:29

  游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单:

  1. 它必须属于世界,才能出现在世界。不可能一个不属于世界的食物,出现在世界中;但是可能存在着一个食物,它属于世界,但是却没有出现在世界中(即食物的颜色和世界的颜色相同,因此看不见食物)。这就像鬼一样,它可能存在于这个世界上,但我们看不到它。

  2. 一个属于世界的食物,具有在这个世界中的位置。

  3. 它有颜色和大小。

  因此,食物的结构体定义就显而易见了!

typedef struct Food
{
World *world;
int x, y, size;
SDL_Color color;
} Food;

  有了食物,我要在世界中把它创造出来,就得提供两个基本函数来操控它:

extern Food * SNK_CreateFood(World *world, int size);
extern void SNK_DestroyFood(Food *food);

此时,食物就可以在世界中被创造出来了,世界开始变得缤纷多彩。

  但是,问题来了,创建食物时,只知道要创建多大的食物,在哪儿创建,创建什么颜色,一开始都是不知道的,那么,在食物创建出来后,我们就必须想办法改进它,让食物变得与众不同。所以,我设置了以下两个函数用于改变食物的属性,前提是,食物必须存在:

extern void SNK_SetFoodPosition(Food *food, int x, int y);
extern void SNK_SetFoodColor(Food *food, Uint8 r, Uint8 g, Uint8 b, Uint8 a);

  一开始的设想要的是一个具有颜色、具有大小的食物能在世界中存在,而具有上面的方法后,我足够创建这样的食物了。因此,我现在要让符合我设想的食物显示在世界中:

extern void SNK_DrawFood(Food *food);

  到此,食物的所有方法就定义完了。虽然,只有几个函数,但是在贪吃蛇的世界中够用了。

以下是我的snk-food.h文件中的完整食物定义:

#ifndef SNAKE_FOOD_H_HEADER
#define SNAKE_FOOD_H_HEADER #define FOOD_INIT_COLOR 0, 0xff, 0, 0xff #include "snk-world.h" typedef struct Food
{
World *world;
int x, y, size;
SDL_Color color;
} Food; extern Food * SNK_CreateFood(World *world, int size);
extern void SNK_DestroyFood(Food *food); extern void SNK_DrawFood(Food *food); extern void SNK_SetFoodPosition(Food *food, int x, int y);
extern void SNK_SetFoodColor(Food *food, Uint8 r, Uint8 g, Uint8 b, Uint8 a); #endif

宏FOOD_INIT_COLOR只是为了提供方便,仅为SNK_SetFoodColor函数中使用。