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
最后附上每日一画~
领取专属 10元无门槛券
私享最新 技术干货