影子论坛

发新帖

【CAPP源码】数字华容道 教程 源码 图文 作品

wuhuisai 2020-1-28 1014

吴会赛/数字华容道


华容道游戏,继续用我的游戏框架开发,直接修改卡牌游戏源码,有关华容道的代码在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完善就行了。

附件列表(2)

登陆可见附件内容.

最新回复 (0)
返回
发新帖
wuhuisai
主题数
29
帖子数
37
注册排名
2

Processed Time:0.22835302352905