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

  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函数中使用。

[C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义的更多相关文章

  1. [C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义

    每个游戏都有一个很明确的目的或者说游戏主题,贪吃蛇的目的很明确:蛇找到并吃掉食物.只有目的是很无聊的,算不上一个好游戏.所以设计者增加了创意:1. 吃掉食物后蛇会增长:2. 吃掉食物后分数会增加.有些 ...

  2. [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现

    由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是 ...

  3. [C入门 - 游戏编程系列] 贪吃蛇篇(六) - 蛇实现

    这一篇是关于设置蛇的属性的,接上一篇(五). 设置蛇的速度,很简单,只要不是负数就行了. void SNK_SetSnakeSpeed(Snake *snake, int speed) { ) sna ...

  4. [C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义

    蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结, ...

  5. [C入门 - 游戏编程系列] 贪吃蛇篇(五) - 蛇实现

    因为已经写了食物的实现,所以我不知道到底是该先写世界的实现还是蛇的实现.因为世界就是一个窗口,可以立刻在世界中看到食物的样子,对于大多数人来说,如果写完代码立刻就能看到效果,那就再好不过了.可是,我最 ...

  6. [C入门 - 游戏编程系列] 序言篇

    记得学习C语言的时候,看着别人能写各种各样的小游戏和小软件,甚是羡慕.而自己,虽然说语法都会,但是真正上手写个几百行的代码,就显得力不从心.曾经一度很是郁闷,看过一些书,大都处于教语法的层面,有些涉及 ...

  7. [C入门 - 游戏编程系列] 环境篇

    这一系列笔记的代码都是在Ubuntu 14.04下编码并测试的,原因无他,因为我笔记本电脑只装了一个Ubuntu系统,其中唯一使用的第三方库SDL也是开源并且跨平台的.所以即使你用的是Windows或 ...

  8. Love2D游戏引擎制作贪吃蛇游戏

    代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...

  9. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

随机推荐

  1. /dev/socket/vold exploit 本地提权漏洞

    EXPLOIT "0 asec create ../../../../../../../../xxxxx/xx/xx/xx 1 ext4 98235792350852308254872354 ...

  2. Lintcode--004(最小子串覆盖)

    给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"",如果有多个 ...

  3. 批处理SQL语句

    作用:想发送多条SQL,又要降低与数据库系统的交互,这时使用批处理        一]Statement对象——适合对不同结构的SQL语句进行批处理操作        步骤:            1 ...

  4. JVM试用G1的垃圾收集器

    因为以前用默认的GC,,老年代经常在占比超过99%才发生一个GC行为,感觉不爽...尽管每次FULL GC只要0.5S. 结合上次听中华构架师大会,一哥们分享的G1 GC...试试.. 就在TOMCA ...

  5. SQL使用单引号

    SQL> select 'xxxx'oooo' from dual; ERROR: ORA-01756: quoted string not properly terminated SQL> ...

  6. 【转】 ubuntu12.04更新源

    原文网址:http://blog.chinaunix.net/uid-26404477-id-3382633.html 摘 要:本文列出ubuntu 12.04 LTS更新源列表,内容为网友整理,此处 ...

  7. .net常考面试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  8. Activity小结

    Log日志类的五种级别 1.由高到低分别是:v.i.d.w.e 2.生命周期有七种状态: onCreate:创建 onStart:启动 onResume:显示(可以与用户交互) onPause:暂停 ...

  9. Django架设blog步骤

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  10. table表格边框样式

    ; border-left:1px solid #aaa; border-top:1px solid #aaa; } td{border-right:1px solid #aaa; border-bo ...