前记:
记得Donald Knuth说过:「不管现在流行什麽语言你都可以肯定十年 2十年的後它不再风光我总是在自己书中写些不时髦东西但这些东西却值得後代子孙记取」正当我们为微软轮轮技术革新而强迫自己努力学习时候我们可曾花时间去考虑些深层次东西?在游戏可视化背后到底是怎样设计模式和事件引擎来带动整个游戏?BSCH这篇文章正是试图从这方面入手向大家讲述如何编写个飞机游戏毕竟DirectX不等于游戏希望这篇文章对于掌握了DirectX朋友们能起个抛砖引玉作用全文如下:
个“飞机”小游戏实现起来比较简单比较适合初学者学习下面我将按照自顶而下思路方法来介绍说明如何实现个“飞机”游戏首先看个:
=keyword> GameStart{ =keyword>while(GameOver){ clear; control; dirver; show; =keyword>(key[ESC]) GameOver = 0; } =keyword> 1;}
这个功能应该不难理解在此用while语句是用来控制游戏退出看看while中最后个语句 (key[ESC])GameOver=0;这个语句就应当理解while语句功能所以在游戏过程中只要想叫退出千万不能忘记加GameOver = 0 ;这个语句clear这个语句看名字就知道是清屏control这个是游戏核心控制整个游戏比如说控制飞机子弹如何飞……后面再说这些现在说是游戏整体思路枝节方面后面再说dirver这个是控制着敌人出现show是显示图形
所以整个游戏思路很简单清屏——游戏控制——敌机出现——显示:
1.clear;
清屏很容易实现直接把MemBuf全部赋值成0
2.control;
首先定义物体结构
struct TOBJ{
mode; //类型0:空闲1:敌机;2自己发射子弹3敌人子弹类型1;
x, y;
type;
index;
} Objs[MAXOBJ];
要控制整个游戏进程必须每个飞机子弹都在动所以用
for(i=0; i
对单个物体来说首先要确定每个物体类型类型不样执行操作也就不样
=keyword>switch(Obj[i].mode){ =keyword> 1: =comment>//如果是敌机执行敌机操作; ......; =keyword>; =keyword> 2: =comment>//如果是自己发射子弹执行自己子弹操作; ......; =keyword>; =keyword> 3: =comment>//如果是敌人子弹类型1执行子弹类型1操作; ......; =keyword>; =keyword> 4: =comment>//执行敌人子弹类型2操作 ......; =keyword>; ...... =comment>//执行子弹类型N操作;}
1.1敌机操作:
首先判断敌机是不是已经死亡如果死亡则显示死亡效果比如说爆炸这是最常见飞机游戏中敌机死亡效果还比如说敌机出现闪烁效果这种方式倒是也有不过效果自然没有爆炸效果华丽在此我用闪烁效果如果敌机没有死亡则要往我机上撞以期消灭我机——显然不能任何时候都跟着咱们跑所以要有定几率性这样不会时时刻刻跟着咱们
=keyword>switch (Objs[i].type) { =keyword> 0: =keyword>(!random(20)) Objs[i].type=1; =keyword>; =keyword> 1: =keyword>(Objs[i].x
用介绍说明比较方便这段是执行敌机飞行擦作Objs[i].type0是1/20几率让敌机跟着自己飞此时执行
1然后1/40几率使敌机加速此时执行 2:default:;
敌机飞行任务完成还必须能发射子弹样用随机比方说:
(!random(30){ // 1/30几率发射子弹
j=AllocObj;// 从Objs中选择个也就是空闲
(!random(5)) Objs[j].mode=2; // 1/5几率是子弹类型2;
Objs[j].mode=3;
Objs[j].x=Objs[i].x;
Objs[j].y=Objs[i].y;
}
最后这两句很容易理解子弹发射坐标自然要从发射它敌机那里发射所以坐标样然后是判断敌机和我机相撞没有(CheckHit(x,y,fly_x,fly_y,15)) fly_flag=0;CheckHit是碰撞和上面AllocObj起在后面给出实现过程这只是敌机未死亡所执行操作如果敌机死亡则要出现死亡效果
(Objs[i].index){
((Objs[i].index&3)0) 画敌机图片
(Objs[i].index>50) Objs[i].mode=0;
}
这段很容易理解也就是过段时间显示次敌机图片如果是不显示话在前面主循环中已经被clear给清屏了敌机操作还有最后步(Objs[i].y>MAXY) Objs[i].mode=0;如果敌机飞到屏幕下方则释放AllocObj实现
AllocObj
{
i = 0;
while(i
(i>=MAXOBJ) i = MAXOBJ - 1;
i;
} CheckHit实现这个通过矩形判断
CheckHit( x1, y1, x2, y2, r)
{
(abs(x1-x2)<=r&&abs(y1-y2)<=r) 1;
0;
}
1.2我方子弹
先让子弹往上飞Objs[i].y-=3;然后判断是否射中敌人
for (j=0;j
(Objs[j].mode1&&CheckHit(x,y,Objs[j].x,Objs[j].y,15)&&!Objs[j].index){
Objs[j].index=1;
Objs[i].mode=0;
}
显然要判断是否射中敌人要首先扫描所有敌人看看是否射中
Objs[i].mode = 0 回收此子弹
Objs[j].index = 0; 代表敌机存活
Objs[j].index!=0;代表敌机死亡的所以不用Objs[j].mode=0代表敌人死亡是还要出现死亡后效果你完全可以用Objs[j].mode=0代表敌机死亡不过这样子就没有死亡后效果了射中敌人敌人就消失我想你不会要这样游戏吧:)
1.3敌方子弹
Objs[i].y3;
Objs[i].xrandom(10)-5;
(CheckHit(x,y,fly_x,fly_y,10))
//敌机子弹射中我机
fly_flag=0;
这段最精妙出是xrandom(10)-5;这个语句它在原横坐标位置往左右5幅度概率相等随机因此造成这个子弹很阴险(很难躲避不信你自己玩玩看反正我所见过人中打此游戏很少超过5分钟主要就是这种子弹根本没有规律性:))
1.4地方别子弹你自己设计
我再给种子弹设计思路x -Objs[i].k;ABS(Objs[i].k)<=1 ? (y 4) : (y2) ;putimage(x, y, 5);(CheckHit(x,y,fly_x,fly_y,8)) fly_flag=0;(y > MAXM) Objs[i].mode = 0;这种子弹是最常见Objs[i].k代表斜率......所有物体操作完毕了剩下该是我机操作了
(key[KEY_UP]) (--fly_y<0) fly_y=0;
(key[KEY_DOWN]) (fly_y>MAXM-16) fly_y=MAXM-16;
(key[KEY_LEFT]) (--fly_x<0) fly_x=0;
(key[KEY_RIGHT]) (fly_x>MAXX-16) fly_x=MAXX-16;
(key[KEY_CONTROL]){
i=AllocObj;
Objs[i].x=fly_x,
Objs[i].y=fly_y-10;
Objs[i].mode=2;
}
画出我机图片(!fly_flag) GameOver = 1;在此整个思路应该很清晰了
2.0下面设计dirver
void drivers
{
(!random(20)){
i=AllocObj;
Objs[i].x=random(MAXX);
Objs[i].y=-random(60);
Objs[i].mode=1;
Objs[i].type=Objs[i].index=0;
(!random(120)) Objs[i].type=2;
//直接出现敌机速度就很快
}
}
好了在此整个游戏核心就已经设计完了下面我把所有组合在起给出
=comment>//////////////////////////////核心//////////////////////////////////# MAXOBJ 物体最大数量# MAXX 屏幕宽度# MAXY 屏幕高=keyword>struct TOBJ{ =keyword> mode; =keyword> x, y; =keyword> index; =keyword> type;}Objs[MAXOBJ];=keyword> AllocObj{ =keyword> i=0; =keyword>while(i
最新评论