华容道游戏,继续用我的游戏框架开发,直接修改卡牌游戏源码,有关华容道的代码在home.c内
开发过程
以3x3的华容道为例,需要创建3x3个obj,排成9宫格,为了方便后期控制,生成以后存在一个数组内。
保存数据
宫格内的数字,我们用obj->data[0]保存,这个会变化。
另外为了快速知道obj所在九宫格位置,我们用obj->data[1]来保存,这个是不会变化的。
for(int j = 0;j<NUM;j++)
for(int i = 0;i<NUM;i++)
{
dxy = (SW-NUM*WW)/2+WW/2;
obj = newObj(dxy+i*WW,
dxy+j*WW,spr);
roomAddObj(room,obj);
obj->data[0] =
(1+i+j*NUM)%(NUM*NUM);
obj->data[1] = i+j*NUM;
obj->draw = drawCard;
cardArr[i+j*NUM] = obj;
}
重写绘制事件
默认的obj只会绘制精灵,我们重写他的绘制事件绘制出数字,如果数字是0就不绘制
Cam是房间的相机,虽然这里没用到但是万一以后用到呢,所以这里加上相机。
//绘制卡片
void drawCard(void*ob)
{
Obj*obj = ob;
char data[100];
Cam*cam = &(_room->cam);
drawObjCam(obj,&(_room->cam));
if(obj->data[0]!=0)
{
sprintf(data,"%d",obj->data[0]);
fnt_drawline(GM.fnt,
data,obj->x+cam->x-15,
obj->y+cam->y-20);
}
}
移动数字
到了游戏互动这一步了,先打开虚拟键盘,做个按键移动。
以用户按了上键为例,我们需要检测0下面是不是有数字,如果有就和0互换。
这里的obj是0
//上,看下面有没有卡
case _UP:
index = obj->data[1]+NUM;
if(index<NUM*NUM)
{
data = obj->data[0];
obj->data[0] =
cardArr[index]->data[0];
cardArr[index]->data[0] = data;
}
break;
在玩家玩的过程中,数字0的obj已经不知道是哪一个了,怎么办??写个方法获取它!
下面是个通用方法,你也可以获取数字为1的obj
//获取卡片
Obj*getCard(int num)
{
for(int j = 0;j<NUM;j++)
for(int i = 0;i<NUM;i++)
{
if(cardArr[i+j*NUM]->data[0]==num)
{
printf("getCard%d:%d\n",
num,i+j*NUM);
return cardArr[i+j*NUM];
}
}
return NULL;
}
其余几个方向同理,到这里框架就完成了,修bug完善就行了。