在前面一个镰刀手登场的基础下我再加入了另一个角色——四巨手炮。与镰刀手不同,四巨炮手已经写成类了,因为这次的目标就是学写类。其中有的成员只在本小结有用,有的则是适合长远发展目标。写成类最方便的莫过于个体(对象)再造了,所以一口气让八个四巨炮手出场。

 

                          

四巨炮手要实现的效果:
    自动围着镰刀手沿着一个圆角矩形移动。在圆角处转弯。并且在适当的时机向镰刀手发弹。不过因为碰撞函数还无从下手,所以镰刀的血也先没写出来了。因此此小结还称不上游戏。

游戏设计:
    短暂设计:第一关会出现较少的小四,而且发弹频率不高,小四的速度也不快,随着关数增加,则小四越来越多,小四和它发弹速度都更快,弹的力量也更强。长远设计:四巨炮手的前后均能发弹。而且能自动寻找适当位置去攻击镰刀。当四巨炮手的生命值为0时,会自动爆炸并不再场上出现(爆炸后就消失了)。

具体实现:
    (与之前相同的效果这里就不再多说了)
    1、类设计。
    本来是想将Badguy类设计成父类的,然后跟据不同的"badguy"再添加不同的子类以实现不同的效果。但是目前编程还没有达到继承的水平,只好先直接把Badguy设计成专门针对小四的类了。类的成员函数有move()、 spin()(供矩形角里的旋转用的)、 fire()(开火用的!!)、 hit()(判断边界与碰撞)、 myaction()(这个只是简单地包含前面四个成员函数,方便类成员的调用而已)。成员变量太多就不一一列举了。另一个是bullet类,是控制子弹的类,成员函数有move()、 borderline()(判断边界)、 hit()(判断是否命中目标)、 myaction()。

    2、声明类数组。
    当时只在声名处写了句Badguy[] fourhands = new Badguy[fourhandnum];就以为能够轻松实现了,然而我却总遇到系统错误“未将对象引用设置到对象的实例”。苦思良久兼网上查了不少资料,才知道原来上面的等于没正式声明。还要再声明一次:
for (int i = 0; i < fourhandnum ; i++)
{
    fourhands[i] = new Badguy();
}。

    3、逐个出场。
    场景中最后会出现8个小四,但是一开始时8个小四是逐个登场的。实现代码不难:(GameTime gameTime)
if (showtime < 1000)
    showtime++;
for (int i = 0; i < fourhandnum; i++)
{
     if (showtime > 97 * i)
         fourhands[i].myaction(strongpos.X + liandaowidth, strongpos.Y + liandaohight);
}

    4、发弹效果。
    当小四移动时会有个位置判断,当小四的中心与镰刀的中心的x坐标或y坐标在一定范围内,则小四把firebool的值改变,在场景中(main game)则将firebool转为炮弹类的order,然后跟据不同的order,炮弹的发射方向会不同。具体代码:
if (myrotation == rot.left)
{
    if ((py + wid - centery) * (py + wid - centery) < 25)
    {
        firebool = 2;
        fireballpx = px+4 ;
        fireballpy = py -4;
        fireballpx2 = px+4;
        fireballpy2 = py + 50;
    }
}
if (fourhands[i].firebool > 0)
{
     for (int j = 0; j < fireballnum; j++)
     {
          if (fireballs[j].lifebool == 0)
          {
                fireballs[j].order = fourhands[i].firebool;
                fireballs[j].lifebool = 1;
                fireballs[j].px = fourhands[i].fireballpx;
                fireballs[j].py = fourhands[i].fireballpy;
                break;
          }
     }
     for (int m = 0; m < fireballnum; m++)
     {
          if (fireballs[m].lifebool == 0)
          {
               fireballs[m].order = fourhands[i].firebool;
               fireballs[m].lifebool = 1;
               fireballs[m].px = fourhands[i].fireballpx2;
               fireballs[m].py = fourhands[i].fireballpy2;
               break;
          }
     }
fourhands[i].firebool = 0;
fourhands[i].firetime = 0;
}
其中px、py、px2、py2是两颗弹的位置; firetime控制着发弹的频率。

编程心得:
上面效果的心得在上面已经提了,现在说一下其它心得。首先一提的是看了师兄的程序学会了用#region/#endgion,只要用这两句括起一段代码,单击代码左边的+/-就能达到代码的展开和折叠效果(本例里的是乱用……)。第二个是画图……我比较善长编程,但是画图就差多了。像四巨炮手与镰刀手,只不过是用简单的图形凑起来的。如果要达到其它效果(如爆炸),我那点美“功”就真的应付不来了。但是最近又新创了(也许有前人创过但我不知道)一种画图法——圆切法(还是用Flash画的,我习惯用Flash画图形然后再用photoshop简单处理一下),能很简单地画出边界光滑的图形,而且也很规矩。简单说明一下,就是先画好大概的轮廓(用圆或其它简单的图形拼成),然后再用圆去切相交但交点不光滑的两点。然后Flash会自动把图形割断,再去掉多余的线条就行了。

                         

/Files/sysudm/fourhands.rar

posted on 2009-04-08 21:28  中大信息中心数媒部  阅读(295)  评论(1)    收藏  举报