首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编程小游戏(四)封装玩家属性

01

前情提要

说明:

此小游戏使用c++;

此图文更新版本到180223(没错就是日期);

此小游戏未正式命名,如果有什么好名字可以留言,也许会采用;

"方块"指组成游戏地图的元素,目前的几种方块:空地、墙、门 、水、树、触发器;

“玩家”指可以通过键盘操控位置的方块;

“触发”:按下方向键后,玩家“触发”将要走到的方块;

“方块动作”指玩家触发方块后执行的语句;

前面的内容:编程脑洞:游戏地图显示、编程小游戏(二)更复杂的地图、编程小游戏(三)简单交互方块

02

封装

首先,有两个和玩家有关的全局变量row和col,用于表示玩家的坐标,可以加入玩家类中。创建一个玩家对象p1然后用查找替换把row改成p1.row,col改成p1.col(后来发现这俩是私有成员,于是又写了getRow()和getCol(),再把需要改变坐标的移动玩家函数放进玩家类当中)

接着是玩家类的方法。把之前的“移动玩家”函数加入类中,再将碰撞检测函数改为“检测方块”函数加入玩家类中(检测玩家周围的方块)

为了避免麻烦,规定地图的(0,0)点是出生点,一定是空地。

class C_Player

{

int row,col;

public:

C_Player(int r=0,int c=0)

{

row=r;

col=c;

}

int getRow()

int getCol()

void movePlayer(char direction);

int judgeBlock(char direction,int map[MAP_LEN][MAP_LEN]);

}p1;

03

简化主函数

接着再封装一个全局函数用于实现方块的触发后的反应:

void blockReact(int blockID)

{

switch(mapBlockVar)

{

case B_BLANK:

//可通行

p1.movePlayer(command);

break;

case B_DOOR:

system("cls");

displayMap(test_map);

cout

system("pause");

break;

case B_TRIGGER:

p1.movePlayer(command);

system("cls");

displayMap(test_map);

cout

system("pause");

break;

}

}

简化之后的主函数:

while(1)

{

/**< 显示地图 */

system("cls");

displayMap(test_map);

/**< 接受指令 */

command=getch();

/**< 方块触发 */

mapBlockVar=p1.judgeBlock(command,test_map);

blockReact(mapBlockVar);

}

04

做一个新方块

做新方块的步骤:

在枚举enum MAP_BLOCK中加入新方块的英文ID;

定义一个前缀TEXTURE_的全局字符数组常量作为新方块材质;

在blockReact()中定义方块触发动作;

我们试着做一个钥匙方块来打开之前的门方块;

在玩家类中新增一个int成员变量keyNum;

获取值:

int getKeyNum()

改变值:

void change(int addition,int var=-1)

{

if(var==-1)

{

keyNum += addition;

}

else

{

keyNum=var;

}

}

改变值这里我用了两个参数,第一个是增量不解释,第二个是直接赋给它的值,默认-1,如果传入了这个参数就赋值。

修改门和增加钥匙的动作:

case B_DOOR:

displayMap(test_map);

if(p1.getKeyNum())

{

p1.movePlayer(command);

p1.change(-1);

cout

}

else

{

cout

}

system("pause");

break;

case B_KEY:

p1.movePlayer(command);

displayMap(test_map);

cout

p1.change(1);

system("pause");

break;

05

下一次更新

由于没有传入地图作为参数,方块反应这个函数无法改变地图的方块,所以玩家可以无限拿取钥匙,并且门开了之后还会锁上。

为了解决这个问题,以及进一步简化函数的参数,打算设置一个“当前地图”,这样一经指定就不需要再传入地图作为参数了。

欢迎大家加入尘世编程交流群哦!

虽然群主水平不高,但是希望可以和你们一起进步!群文件里面有这个小游戏的源代码。

群号:466810006

最后附上每日一画~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180223G13VMQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券