C++游戏开发入门制作:经典游戏拳皇97

505 篇文章 13 订阅
464 篇文章 36 订阅

对于80、90后来说,拳皇97一定不会陌生,这款经典的横版格斗游戏,是一代人的回忆,许多人接触它都是在街机上,而今天,小编要教大家制作PC版的拳皇97!看黑板,表演即将开始——


这是小编准备的C++学习资料,加小编学习群:825414254,加群即可获取哦!

 

 

游戏运行效果呈现

 

好吧游戏界面和人物模型有点丑,不过这不是重点,重点是学习游戏开发的思路。

一、利用GDI绘制图形

GDI是windows与生俱来的图形设备接口(GraphicsDeviceInterface)的英文缩写,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形和图像输出。

准备一张BMP格式的背景图片,创建一个窗体,在窗体上进行绘制,然后通过GetDC函数来获取窗体的设备环境DC

 

获取设备环境后,还需要在内存中创建一个设备环境,我们在内存中画图,画好以后,直接拷贝到窗体的设备环境上

 

二、关于动画的实现

拳皇吸引玩家的一定是那酣畅淋漓的打斗动作,我们知道用游戏引擎的骨骼动画是最常见的,不过跟3D的渲染不同,2D游戏是贴图的艺术。

 

 

例如上面的两个动画,通过一个数组把它们保存起来,然后依次播放。

 

♦运行效果

 

贴图基本有两种方式,一种采用定时器,一种则是利用消息循环,目前都是采用的第二种绘制方式(消息循环),也就是说游戏中的动画都是一帧一帧的帖上去的,就像放电影一样。

 

♦添加了技能运行效果图:

 

其实像拳皇97、地下城与勇士这类2D游戏是比较适合新手小白开发的,相比于3D游戏的骨骼动画,2D横版游戏的序列帧更简便。

在开发过程中,我们会用到C/C++语言、Win32窗口创建、消息机制、GDI三缓冲绘图原理等知识点。

●学习过程中你能学会:

1.使用API函数创建好Win32窗口。

2.将准备好的游戏素材加载到程序中。

3.使用GDI图形设备接口函数绘制地图与角色。

4.利用C/C++语法结合数据结构与算法算法处理游戏数据。

5.编写游戏逻辑。

●学习成效:

1.跳出控制台,在界面编程中去锻炼自己的逻辑思维能力。

2.了解windows程序设计的基本框架。

3.可尝试去开发各种界面化的程序,例如雷霆战机,俄罗斯方块,坦克大战等等。

一句RNG牛逼,不知刷爆了多少人的朋友圈,而LOL等六项电竞正式入选亚运会,更是刷新了我们对游戏的认知,在眼下全民娱乐的时代,游戏早已成为我们生活的一部分,游戏开发也是当下和未来绝对热门的行业。

怎么样?是不是也想尝试着自己做一款小游戏了呢?

#include #include #include #include #include #define N 100 int n=0; int Checktoseek(char name[]);//查找 void mainmenu();//菜单 void Register();//登记注册 void Showplayer();//显示当前人物数据 void Showallplayer();//显示所有人物数据 void Chooseopponent();//选择对手 void Chooseplayer(int i);//选择角色 void vs(int i,int j);//PK void Attack(int i,int j);//攻击 void recovery(int i,int j);//防御 void Energy(int i,int j);//能量 struct Kof { char name[20]; int Hp; int AP; int Dp; int Rp; }player[N]; void main() { srand(unsigned(time(NULL))); mainmenu(); } void login() { } void mainmenu() { while(1) { int x; printf("\n"); printf("\n"); printf(" ***************************************************************\n"); printf(" *** ***\n"); printf(" *** ***\n"); printf(" *** 欢迎进入Kof ***\n"); printf(" *** ***\n"); printf(" *** ***\n"); printf(" ***************************************************************\n"); printf("\t\t\t\t\t1----请先注册\n"); printf("\t\t\t\t\t2----查看玩家信息\n"); printf("\t\t\t\t\t3----查看自己信息\n"); printf("\t\t\t\t\t4----选择对手\n"); printf("\t\t\t\t\t5----结束\n"); printf("\n\n请选择菜单:"); scanf("%d",&x); if(x==5) break; switch(x) { case 1:Register();break; case 2:Showallplayer();break; case 3:Showplayer();break; case 4:Chooseopponent();break; } printf("\n\n\n\n\n按任意键继续:"); getch(); system("cls"); } } void Register() { char name[20]; printf("输入名称:"); fflush(stdin); gets(name); if(Checktoseek(name)==-1) { strcpy(player[n].name,name); player[n].Hp=rand()%1000; player[n].AP=rand()%(100+1)+50; player[n].Dp=rand()%(10-5+2)+5; player[n].Rp=rand()%(60+2)+60; n++; printf("人物创建成功\n"); } else { Register(); } } void Showplayer() { char name[20]; printf("角色名:"); fflush(stdin); gets(name); int i=Checktoseek(name); if(i!=-1) { printf("人物名称:%s\n",player[i].name); printf("Hp:%d\n",player[i].Hp); printf("Ap:%d\n",player[i].AP); printf("Dp:%d\n",player[i].Dp); printf("Rp:%d\n",player[i].Rp); } else { printf("请重新输入角色名"); Showplayer(); } } void Showallplayer() { printf("%-10s%-10s%-10s%-10s%-10s\n","Name","Hp","Ap","Dp","Rp"); for(int i=0;i<n;i++) { printf("%-10s%-10d%-10d%-10d%-10d\n",player[i].name,player[i].Hp,player[i].AP,player[i].Dp,player[i].Rp); } } void Chooseopponent() { char name[20]; int i; Showallplayer(); printf("你选择PK谁:"); fflush(stdin); gets(name); i=Checktoseek(name); if(i!=-1) { Chooseplayer(i); } else { printf("你选择PK的人物找不到?\n"); Chooseopponent(); } } int Checktoseek(char name[]) { for(int i=0;i0 && player[j].Hp>0) { printf("第%d局***************\n",count); if(count%2==0) { Attack(i,j); recovery(i,j); Energy(i,j); } else { Attack(j,i); recovery(i,j); Energy(i,j); } count++; _sleep(3344); } if(player[i].Hp>0) { printf("%s Victory \n",player[i].name); } else { printf("%s Winner \n",player[j].name); } printf("******************************\n"); } void Attack(int i,int j) { int x; int s; x=rand()%5; switch(x) { case 0: printf("\n%s发出波动伤害%s\n",player[i].name,player[j].name); s=rand()%100; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; case 1: printf("\n%s使用连招攻击%s\n",player[i].name,player[j].name); s=rand()%100*2; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; case 2: printf("\n%s释放超杀技\n",player[i].name); s=(rand()%100)*4; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; } } void recovery(int i,int j) { int s; int x; s=rand()%3; switch(s) { case 0: printf("\n%s防御%s的攻击\n",player[i].name,player[j].name); x=rand()%(10-5+2)+5; player[i].Dp==x; printf("%s抵挡%d点伤害\n\n",player[i].name,x); break; case 1: printf("\n%s防御%s的攻击\n",player[j].name,player[i].name); x=rand()%(10-5+2)+5; player[j].Dp==x; printf("%s抵挡%d点伤害\n\n",player[j].name,x); break; } } void Energy(int i,int j) { int x; int s; x=rand()%6; switch(x) { case 0: printf("\n%s大怒,使用超必杀技\n",player[i].name); s=(rand()%100)*6; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; case 1: printf("\n%s大怒,使用超必杀技\n",player[j].name); s=(rand()%100)*6; player[i].Hp-=s; printf("%s受到%d点伤害\n\n",player[i].name,s); break; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值