易码技术论坛

 找回密码
 加入易码
搜索
查看: 133905|回复: 5

[转帖]有规模的RPG游戏具体过程

[复制链接]
发表于 2006-6-24 21:45:00 | 显示全部楼层
列举这个程序例子:


Winmain.cpp


Gamemain.cpp


Directaudio.cpp


Directdraw.cpp


Directinput.cpp


还有


Gamemain.h


Directaudio.h


Directdraw.h


Directinput.h





1要那些处理


Winmain.cpp


Gamemain.cpp





程序中只有声音、图形和输入输出的库函数,其他就不用列举了。下面我会一个一个文件的讲。首先是winmain.cpp








Winmain()


{


    初始化directX;


    游戏的流程;


    Gameinit();


    Gameloop();


}


Winproc()


{


  这里有处理与游戏打交道的消息处理


  


}











Winmain.cpp是总程序文件,下面的是游戏处理文件gamemain.cpp。





Gamemain()


{


Case 1:  擦新游戏卷动画面;break;


    Case 2:  显示战斗画面;break;


    Case 3:  显示游戏开始菜单;break;


}














擦新游戏卷动画面





void FleshGame()


{


     FleshMap();         //擦地图


     FleshEvent();       //擦情景


     FleshNBC();


     FleshMy();


     if(talkbar)TalkBar();      //进入谈话主程序   


     if(mainbar)MainBar();     //进入对话菜单主程序


lpDDSPriMary->Flip (NULL,DDFLIP_WAIT);


}











显示战斗画面





void FleshFightGame()


{


     static bool esc=0;


     Scanout(esc);


switch(mydi)


{


case 0:  //wofang我方


        switch(lastselect)


{


case -1:     FleshA();     break;


case 0:     Attack();     break;


case 1:    PrintText(lpDDSPriMary,10,11,RGB(255,0,0),"暂不提供该功能,原因有待明");


Delay(600);lastselect=-1;break;


case 2:     PrintText(lpDDSPriMary,10,11,RGB(255,0,0),"暂不提供该功能");            


Delay(600);lastselect=-1;break;


case 3:    mydi=1; esc=Escape(); break;


}


       break;


case 1:  EnemyAttack(); break;//敌方攻击


}


DText();


   lpDDSPriMary->Flip (NULL,DDFLIP_WAIT);


}














显示游戏开始菜单





void FleshMenu()


{


   lpDDSBackBuffer->BltFast (0,0,lpDDSback,NULL,DDBLTFAST_WAIT);


   static int sell;


   MenuInput(sell);


   char *str[]={"开始游戏","退出游戏"};


   for(int i=0;i<=1;i++)


   {


   PrintText(lpDDSBackBuffer,200,300+50*i,RGB(255,255,0),str);


   }


  PrintText(lpDDSBackBuffer,200,300+50*sell,RGB(255,255,0),str[sell],OPAQUE);


  lpDDSPriMary->Flip (NULL,DDFLIP_WAIT);//翻主页


}










 楼主| 发表于 2006-6-24 21:47:00 | 显示全部楼层
2游戏的库函数准备


Directaudio.cpp


Directdraw.cpp


Directinput.cpp


Directaudio.cpp


    typedef struct pcm_sound_typ     //WAV声音结构


{   LPDIRECTSOUNDBUFFER dsbuffer;


    int state;  


    int rate;


    int size;


    int id; } pcm_sound, *pcm_sound_ptr;





#define DSVOLUME_TO_DB(volume) ((DWORD)(-30*(100-volume)))





////////////////////////////////////////////////


//DirectSound初始化


int MyDirectSoundInit(void);


//DirectSound结束


int MyDirectSoundShut(void);


//读取WAV文件


int DSoundLoadWAV(char *filename, int control_flags);


//////////////////////////////////////////////////


//DirectSound变量


extern LPDIRECTSOUND8       lpDSound;  


extern DSBUFFERDESC          dsbd;  


extern DSCAPS            dscaps;  


extern HRESULT              dsresult;


extern DSBCAPS              dsbcaps;   


extern LPDIRECTSOUNDBUFFER  lpdsbprimary, lpdsbsecondary;  


extern WAVEFORMATEX         pcmwf;   


extern pcm_sound         sound_fx[MAX_SOUNDS];


extern HWND                 freq_hwnd,  volume_hwnd, pan_hwnd;


extern int                  sound_id;  


//////////////////////////////////////////////////


#define DM_NUM_SEGMENTS 64


#define MIDI_NULL     0  


#define MIDI_LOADED   1


#define MIDI_PLAYING  2  


#define MIDI_STOPPED  3  


#define MULTI_TO_WIDE(x,y)  MultiByteToWideChar( CP_ACP,MB_PRECOMPOSED, y,-1,x,_MAX_PATH);


#defineDD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }


//MIDI声音结构


typedef struct DMUSIC_MIDI_TYP


{IDirectMusicSegment        *dm_segment;


IDirectMusicSegmentState   *dm_segstate;


int                        id;   


int                        state;  


} DMUSIC_MIDI, *DMUSIC_MIDI_PTR;


//////////////////////////////////////////////////


//DirectMusic变量


extern IDirectMusicPerformance8    *dm_perf;


extern IDirectMusicLoader8         *dm_loader;


extern IDirectMusicSegment        *dm_segment;


extern IDirectMusicSegmentState   *dm_segstate;


extern DMUSIC_MIDI                dm_midi[DM_NUM_SEGMENTS];


extern int dm_active_id;  


//////////////////////////////////////////////////


//DirectMusic函数


int MyDirectMusicLoad(char *filename);


int MyDirectMusicPlay(int id);


int MyDirectMusicStop(int id);


int MyDirectMusicShut(void);


int MyDirectMusicDeleteMIDI(int id);


int MyDirectMusicDelete(void);


int MyDirectMusicStatus(int id);


int MyDirectMusicInit(void);





Directdraw.cpp


#include <ddraw.h>


//BMP图形结构


typedef struct BMPPIC_TAG


{


    BITMAPFILEHEADER  bitmapfileheader;    //文件头


    BITMAPINFOHEADER  bitmapinfoheader;    //头信息


    UCHAR *buffer;


}BMPPIC, *BMP_FILE;


//定义屏幕设置


#define SCREEN_WIDTH 800    //屏宽


#define SCREEN_HEIGHT    600    //屏高


#define SCREEN_BPP       16     //位数


//16位<st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">5.6.5</st1:chsdate>格式


#define _RGB16BIT565(r,g,b) ((b%32) + ((g%64) << 6) + ((r%32) << 11))


//16位5。5。5格式


//#define _RGB16BIT555(r,g,b) ((b%32) + ((g%32) << 5) + ((r%32) << 10))





#define BITMAP_ID    0x4D42        //BMP的句柄


#define MAX_COLORS_PALETTE  256


//DirectDraw 变量


extern LPDIRECTDRAW7 lpDDraw7;            //DD对象


extern LPDIRECTDRAWSURFACE7     lpDDprimary;  //DD主表面


extern LPDIRECTDRAWSURFACE7     lpDDback;     //DD后备画面


extern DDSURFACEDESC2    ddsd;                //DD表面描述界面


extern DDBLTFX           ddbltfx;             //DD图形变换变量


extern BMPPIC        bitmap;                  //DD  BMP变量


extern LPDIRECTDRAWSURFACE7     lpDDbpic;     //Directdraw备用画面


extern LPDIRECTDRAWCLIPPER      lpDDclip;     //DirectDraw剪切板   





extern LPDIRECTDRAWSURFACE7 lppic_sky;


extern LPDIRECTDRAWSURFACE7 lppic_hill;


extern LPDIRECTDRAWSURFACE7 lppic_road;


extern LPDIRECTDRAWSURFACE7 lppic_wheel;


extern LPDIRECTDRAWSURFACE7 lppic_wario;


extern LPDIRECTDRAWSURFACE7 lppic_smoke;


extern LPDIRECTDRAWSURFACE7 lppic_pig;


extern LPDIRECTDRAWSURFACE7 lppic_oldman;


extern LPDIRECTDRAWSURFACE7 lppic_knight;


extern LPDIRECTDRAWSURFACE7 lppic_stone;


extern LPDIRECTDRAWSURFACE7 lppic_girl;


extern LPDIRECTDRAWSURFACE7 lppic_cactus;


extern LPDIRECTDRAWSURFACE7 lppic_boy;


extern LPDIRECTDRAWSURFACE7 lppic_bird;


extern LPDIRECTDRAWSURFACE7 lppic_money;


extern LPDIRECTDRAWSURFACE7 lppic_number;


extern LPDIRECTDRAWSURFACE7 lppic_letter;


extern LPDIRECTDRAWSURFACE7 lppic_title;


extern LPDIRECTDRAWSURFACE7 lppic_back;


extern LPDIRECTDRAWSURFACE7 lppic_front;


extern LPDIRECTDRAWSURFACE7 lppic_princess;


extern LPDIRECTDRAWSURFACE7 lppic_princess1;


extern LPDIRECTDRAWSURFACE7 lppic_princess2;


extern LPDIRECTDRAWSURFACE7 lppic_princess3;





//DirectDraw函数


int MyDirectDrawInit(void);     //DirectDraw初始化


int MyDirectDrawShut(void);     //directDraw结束


//DirectDraw剪切板


LPDIRECTDRAWCLIPPER CreatDDClipper(LPDIRECTDRAWSURFACE7 lpDDraw,int Clipnumber,LPRECT clipsqe);


//BMP函数


int FilpBMPFile(UCHAR *image,int bytes_per_line,int height);


int LoadBMPFile(BMP_FILE bitmap,char *filename);


int UnloadBMPFile(BMP_FILE bitmap);


//创建BMP画面


LPDIRECTDRAWSURFACE7 CreatePicSurface(char *filename,int mem_flags,int colorkey);


//画面数据交换


int SurfaceToBack(LPDIRECTDRAWSURFACE7 sourcesurface,int x1,int y1,int x2,int y2,LPDIRECTDRAWSURFACE7  destsurface,int x3,int y3,int x4,int y4,int angle);








Directinput.cpp





#include <dinput.h>


//DirectInput函数


int MyDirectInputInit(void);


int MyDirectInputShut(void);


int MyDirectInputMain(void);


//DirectInput变量


extern LPDIRECTINPUT8       lpDInput;     //DirectInput对象


extern LPDIRECTINPUTDEVICE8 lpDInputkey;  //DirectInput键盘


//键盘缓冲


extern UCHAR  keyboard_state[256];

发表于 2006-6-24 22:25:00 | 显示全部楼层
directx都出来了[em06]

不是LAVA呀~
 楼主| 发表于 2006-6-24 22:43:00 | 显示全部楼层
以下是引用gameboyLV在2006-6-24 22:25:00的发言:[BR]directx都出来了[em06]

不是LAVA呀~


呵呵,可以类比的啊。

今天在网上看到的,感觉比较不错,就转过来了。

看的是文章的思路,而不是原本照搬。

若是原本照搬了,那就是抄袭了啊!!!




[em01][em01][em01][em01]
发表于 2006-6-24 22:53:00 | 显示全部楼层
Lavo的绘图相当于DirectX。效率很高哦。
 楼主| 发表于 2006-6-24 21:44:25 | 显示全部楼层 |阅读模式
有规模的RPG游戏





具体过程:





第1天:写地图编辑器。


第2天:写地图编译器,制作地图(包括各种宝物,阻挡关系,游戏特殊地点事件)。


第3天:精灵的行走(阻挡检测,宝物检测) ,及个地图的NBC连表,和各种菜单制作。


第4天:战斗和对话的编制。


第5天:物品的使用,简单的编辑修改,增增减减,以至于代码很乱。








游戏从开始制作到草草完成共用了5天时间(包括地图编辑器),或者说5天5夜。








   主流程:





while(1)                                                              {                                                                


    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))                  


       {                                                              


      if ( msg.message==WM_QUIT) break;                           


           TranslateMessage(&msg);                                 


           DispatchMessage(&msg);                                 


           Input();  //输入输出                                     }                                                                 


      else                                                         


      {                                                            


         switch (GameMessage)                                      


           {                                                      


             case 0:FleshGame();break;            //游戏主程序     


             case 1:FleshFightGame();break;       //作战           


             case 2:FleshMenu();break;            //开始菜单      


           }                                                      


       }


}                                                                  


     


第1天:写地图编辑器





第2天:写地图编译器,制作地图(包括各种宝物,阻挡关系,游戏特殊地点事件)





每个单元格 32*32;


   城堡  30*30 单元格


   森林  40*30 单元格


   废墟  30*40 单元格


   城市  60*30 单元格


   兵器铺20*15 单元格


   当铺  20*15 单元格


   药铺  20*15 单元格


   酒店  20*15 单元格


   民居  20*15 单元格


地图结构                                                                                          


ypedef struct MAP                                                                                


{                                                                                                  


  char *name;                                                                                    


  int  width;                                                                                    


  int  height;        //整张地图 高宽,名字,掉入地图用                                          


  int  landform;      //地图场景类型,                                                            


  bool cm;            //判断阻挡,TRUE :可以行走,FALSE:阻挡                                    


  int  baowu;         //宝物编号  //0 表示没有宝物箱,1表示宝物箱被打开。2,,3。。。代表宝物编号  


  NBCLIST *NBCHead;   //地图NBC连表                                                               


  int  event;         //图书地点时间编号                                                         


};


                                                         


第3天:精灵的行走(阻挡检测,宝物检测),及个地图的NBC连表,和各种菜单制作。





每次刷新检测:  


             {


                TOM。SPEED=8; 每4*SPEED检测单元个阻挡。,::


                特殊地点事件触发。


                与NBC的碰撞,矩形碰撞。


             }





  每次按KEYBOARD检测:


             {


                IF(  坐标相邻,) 检测与NBC对话,是否有宝物箱,


             }


  ESC:弹出主菜单





第4天:战斗和对话的编制


1每次打斗完,加LIFE,和MONEY点。并检测是否升级,和文字提示。


           2将死亡NBC从链中删除。


           3 B。损失血=A。攻击-B。防御


           4对话:


             查找字符;“名字+#”,找到记录位置为I,从I开始查找FIRST  “{”和第一个“}”,输出{} 间字符。














第5天:物品的使用,简单的编辑修改,增增减减,以至于代码很乱。


TOM。GETBW


               TOM。USEBW(int BW)


特殊地点的事件:  TOM的初始地点定义,地图连表。


void FleshEvent()


{


   int EMessage=map[tom.pos.y][tom.pos.x].event ;


   switch (EMessage)


   {   


case1:str="兵器铺";


InitMap();map[0][0].NBCHead=BQPnbchead;


tom.pos.x=16;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;   


case2:str="药铺";


InitMap();map[0][0].NBCHead=YPnbchead; tom.pos.x=10;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case3:str="当铺";


InitMap();map[0][0].NBCHead=DPnbchead; tom.pos.x=14;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case4:str="酒店";


InitMap();map[0][0].NBCHead=JDnbchead;


tom.pos.x=9; tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case5:str="民居";


InitMap();map[0][0].NBCHead=MJnbchead; tom.pos.x=10;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case 6:str="森林";


InitMap();map[0][0].NBCHead =SLnbchead;


tom.pos.x=8;tom.pos.y=1; tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case7:str="城市";


InitMap();map[0][0].NBCHead=CSnbchead; tom.pos.x=45;tom.pos.y=10;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case8:str="城市";


InitMap();map[0][0].NBCHead=CSnbchead;


tom.pos.x=33;tom.pos.y=11;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case9:str="城市";


InitMap();map[0][0].NBCHead=CSnbchead; tom.pos.x=32;tom.pos.y=19;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case10:str="城市";


InitMap();map[0][0].NBCHead=CSnbchead; tom.pos.x=50;tom.pos.y=19;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case 11:str="城市";


       InitMap();map[0][0].NBCHead=CSnbchead;


tom.pos.x=24;tom.pos.y=5; tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case12:str="城市";


InitMap();map[0][0].NBCHead=CSnbchead; tom.pos.x=36;tom.pos.y=28;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case13:str="废墟";


       InitMap();map[0][0].NBCHead=FXnbchead;


tom.pos.x=6;tom.pos.y=7; tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case14:str="森林";


InitMap();map[0][0].NBCHead=SLnbchead;


tom.pos.x=9; tom.pos.y=27;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case15:str="城堡";


InitMap();map[0][0].NBCHead=CBnbchead; tom.pos.x=16;tom.pos.y=28;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


case16:str="废墟";


InitMap();map[0][0].NBCHead=FXnbchead; tom.pos.x=10;tom.pos.y=36;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;


         }


}




您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 06:13 , Processed in 0.009668 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表