游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单:
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函数中使用。
时间: 2024-10-07 22:59:49