c语言推箱子代码_C语言快速入门——创建推箱子游戏场景

学习指针之前

在进入指针学习之前,让我们把前面的内容结合起来,一起编写一个有趣的例子。你也看到了,我们构建了一个推箱子游戏。事实上它还不能与你交互,也就是说还不能玩。不过,单是构造这样一个游戏场景,看起来已经相当有趣了。

a4efd7f54241cb0fd3f2b3a3dadf812a.png

文件组织分析

  • common.h:提供整个程序使用的常量
  • scene.h:提供场景绘制接口
  • scene.c:场景绘制实现
  • main.c:应用程序框架

开发过程中,一个项目总会有一些公用的数据供多个模块使用,这里我们使用common.h用于提供此类服务。现阶段的程序的目的是构建场景,因此我们提供了scene.h/与scene.c,对应提供场景相关功能。main.c中负责将整个程序装配起来。

Common.h

我们固定窗口大小为512x576,地面每个贴片的大小为64x64,因此场景有9行8列。

2e37c60dbf4b3ea54a6cd3b2aebce59e.png

Scene.h

Scene.h负责提供场景与主程序之间的装配接口,为此提供了三个接口声明(函数声明)。

12135ac4a51328d070f35b7f0514cb93.png

Scene.c

Scene.c是程序的核心实现,因此我们分为多步讲解。首先看一下需要的常量声明。

af9fed05ec34101f980446026ef642ee.png
968db663725c2d1efcf4d480d93dadca.png

场景共需要6种不同的图像资源,因此我们为每种资源分配了一个索引,这样做是为了便于我们在数组中访问。另一方面这可以使程序有更好的可读性。想想看,当要使用路面图像时,images[WAY]明显比images[2]更友好。接下来是程序的数据部分。

13657ed6563167096220d2d21d1a3a9a.png

需要讲解的是地图部分。地图中的数字与贴图索引一致,如1代表的就是墙面,绘制时将会使用images[WALL]索引的图像wall.png来对地面进行贴图。地图数组类型是char[],而不是int[]。一方面因为地面贴片不会超过127个;另一方面,我们知道存储一个int要占用4字节的内存空间,而char只需要1字节,这样下来会节省不少内存。

接下来是一组内部函数声明,之所以要重点突出内部二字,是因为它们与Scene.h中的函数作用不一样。它们仅为Scene.c内部使用而服务,而Scene.h中声明是为外部模块服务的,因此被称为接口。

9daa9357007d5e3894d83bb59af3994c.png

最后一个重点就是从地图中加载箱子、目标点、玩家的初始位置信息了。在得到位置信息后,我们把对应的贴片替换为WAY。如果不做替换,想像一下当人物离开初始位置时,地图上就会同时出现两个人物。

b133f56b31494f2afcb785e98a54fffe.png

场景绘制部分前面已经学习过,就不再讲解了。程序中对于玩家与目标点的绘制稍微加工了一下,这是因为这两张图片的大小小于一个Tile(64x64),因此把它们绘制到了当前Tile的中间。最后有一个练习,Scene.c中最后三个绘制函数的代码很相似,可以尝试把它们重构为一个。Scene2.c中提供了一个版本,但对drawMan没作用。你可以通过把man变量声明为man[1]来解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值