概述
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
文章目录
前言
一、游戏开发思路
二、使用步骤
1.绘制边框
2.加载模型
3.加载音乐
4.按键检测【实现自由移动和攻击】
5.【火箭】越界检测
6.【UFO】越界检测
7.【UFO】坐标随机
7.碰撞检测
7.积分机制
7.记分牌显示
8.总代码
总结
前言
于2022年6月22日首次完成实训编写一款小游戏的项目,留以纪念。
提示:以下是本篇文章正文内容,下面案例可供参考
一、游戏开发思路
(1)绘制边框【绘制好边框后,就可以用加载的图片设置为背景】;
(2)加载火箭,UFO等所需要的模型【因为游戏模型不好找,便用了老师提供的火箭和UFO作为此次游戏模型】;
(3)加载音乐;
(4)这里我用了switch函数来操控飞行方向和攻击【火箭模型加载了肯定要能操控攻击和飞行才好玩】;
(5)给火箭和UFO一个飞行的范围;【若越界则坐标重置】;
(6)UFO随机刷新【每次出现的坐标和速度都是随机的】;
(7)碰撞检测【如果火箭的攻击击中UFO则积分+1,若火箭与UFO相撞则积分清零,火箭坐标重置】;
二、使用步骤
1.绘制边框
需要头文件【#include<graphics.h>】;
代码如下(示例):
#include<iostream>
#include<graphics.h>
float win_width = 1080;//定义长;
float win_height = 580;//定义宽;
initgraph(win_width, win_height);//绘制边框;
2.加载模型
需要添加外部头文件【#include"EasyXPng.h"】;
IMAGE background;//【定义】
loadimage(&background,_T("图片存放地址"));【注:要先在编译器资源里添加图片】
代码如下(示例):
#inlcude<iostream>
#include"EasyXPng.h"
IMAGE backg_bullet;//子弹模型;
IMAGE backg_rocket;//火箭模型;
IMAGE backg_ufo;//UFO模型;
//======================//
IMAGE backg_girl;//【背景图】因为当时时间快截止了就没有添加;
IMAGE backg_blowup;//【爆炸】击中目标后爆照模型替代UFO,UFO坐标刷新;【也是因为时间问题没有编写】
loadimage(&backg_rocket, _T("C:\Users\kekek\Desktop\小球运动测试v.20\rocket.png"));//加载火箭图片;
putimagePng(rocket_x, rocket_y, &backg_rocket);//打开火箭图片;
loadimage(&backg_ufo, _T("C:\Users\kekek\Desktop\小球运动测试v.20\ufo.png"));//加载UFO图片;
putimagePng(ufo_x, ufo_y, &backg_ufo);//打开UFO图片;
loadimage(&backg_bullet, _T("C:\Users\kekek\Desktop\小球运动测试v.20\bullet.png"));//加载子弹图片;
putimagePng(bullet_x, bullet_y, &backg_bullet);//打开子弹图片;
3.加载音乐
需要头文件【#pragma comment(lib,"winmm.lib") 】;
第一段的mciSendString(_T("音乐存放地址"),NULL,0,NULL);【open是打开指令】
第二段的mciSendString(_T("音乐存放地址"),NULL,0,NULL);【play是播放指令】
代码如下(示例):
#include<iostream>
#pragma comment(lib,"winmm.lib")
mciSendString(_T("open C:\Users\kekek\Desktop\小球运动测试v.20\unstoppable.mp3"), NULL, 0, NULL);//打开音乐;
mciSendString(_T("play C:\Users\kekek\Desktop\小球运动测试v.20\unstoppable.mp3"), NULL, 0, NULL);//播放音乐;
4.按键检测【实现自由移动和攻击】
需要头文件【#include<conio.h> 】;
通过_getch()函数实现按键监控;
而实现通过键盘控制火箭移动有两种方法;
其一如下(试例):
#include<iostream>
#include<conio.h>
if (_kbhit())
{
char input = _getch(); //get char(ch)
if (input == ' ' )
{
bullet_vy = -20;
}
}
其二如下(实例):
Bug:子弹的初始位置和重置后的位置都没有与火箭对齐,而是在左上角;
#include<iostream>
#include<conio.h>
char userkey = _getch();//通过按键监控,使玩家可控制火箭运动方向;
{
switch (userkey)
{
case 'a':
rocket_x -= 20;//左移;
break;
case 'd':
rocket_x += 20;//右移;
break;
case 'w':
rocket_y -= 20;//上移;
break;
case 's':
rocket_y += 20;//下移;
break;
case ' ':
bullet_y -= 150;//攻击键;
if (bullet_y < 0)//如果子弹越界;
{
bullet_y = rocket_y;//横坐标重置【重置为火箭横坐标】;
bullet_x = rocket_x;//纵坐标重置【重置为火箭纵坐标】;
}
break;//bug:子弹和火箭没有对齐;
}
}
5.【火箭】越界检测
#include<iostream>
//越出下边界;
if (rocket_y +69>= win_height)
{
rocket_y = win_height-69;//不得超出最大宽度;
score = 0;
}
//越出上边界;
if (rocket_y < 0)
{
rocket_y = 0;//不得超出最小宽度;
score = 0;
}
//越出有边界;
if (rocket_x +50>=win_width)
{
rocket_x = win_width-50;//不得超出最大长度;
score = 0;
}
//越出左边界;
if (rocket_x < 0)
{
rocket_x = 0;//不得超出最小长度;
score = 0;
6.【UFO】越界检测
编写UFO坐标随机刷新时就加入了限制;
7.【UFO】坐标随机
需要头文件【#include<time.h>】
通过时间函数和随机函数实现坐标随机;
#include<iostream>
#include<time.h>
srand((unsigned)time(0));
ufo_x = rand() % 540 + 1;
ufo_y = (rand() % 290) / float(2) + 1;
ufo_v=rand()%6;//速度随变定义的;//当然我并没有定义速度这个参数【可以自行添加】;
7.碰撞检测
检测火箭与UFO的周围是否发生碰撞;
#include<iostream>
if ((rocket_x + 50 >= ufo_x) && (rocket_x <= ufo_x + 60) && (rocket_y <= ufo_y + 45)&&(rocket_y+69>=ufo_y))
{
rocket_x = win_width / 2;//碰撞后横坐标重置为边框长的一半;
rocket_y = win_height - 70;//碰撞后纵坐标重置为边框宽-70(火箭自身长度为69凑个整数);
score = 0;//积分清零;
}
7.积分机制
和第四步【按键检测】一样有个bug:就是子弹坐标重置后没有与火箭对齐;
#include<iostream>
if ((bullet_x +20>= ufo_x) && (bullet_x <= ufo_x+60) && (bullet_y <= ufo_y+45))
{
bullet_x = rocket_x;//和上面一样的bug;
bullet_y = rocket_y;//和上面一样的bug;
score++;
}
7.记分牌显示
#include<iostream>
TCHAR s[20];
swprintf_s(s, _T("当前得分:%d"), score);
settextstyle(20, 0, _T("宋体"));//(字的大小,字的高,字体);
settextcolor(0x00FFFF);//设置字体颜色;
outtextxy(100, 50, s);//(横坐标,纵坐标,&参数);
8.总代码
#include<stdio.h> //标准输入输出库,支持printf()/getch()等函数
#include<conio.h> //con--console控制台输入输出,_getch()
#include<graphics.h>
#include<time.h>
#pragma comment(lib,"winmm.lib")
#include"EasyXPng.h"
int main()
{
//======定义边框参数======//
float win_width = 1080;
float win_height = 580;
//======绘制边框======//
initgraph(win_width, win_height);
//======定义火箭参数======//
float rocket_x = win_width / 2, rocket_y = win_height / 2;//定义长宽;
//======定义UFO参数======//
float ufo_x=400, ufo_y=400;
//======定义积分参数======//
int score = 0;
//======定义子弹参数======//
float bullet_x = rocket_x;
float bullet_y = rocket_y;
//======加载图片======//
IMAGE backg_girl;//鸡哥背景图;
IMAGE backg_bullet;//子弹;
IMAGE backg_rocket;//火箭;
IMAGE backg_blowup;//爆炸;
IMAGE backg_ufo;//UFO;
//======程序运行======//
while (1)
{
// 输出字符串(自适应字符集)
TCHAR s[20];
swprintf_s(s, _T("当前得分:%d"), score);
settextstyle(20, 0, _T("宋体"));
settextcolor(0x00FFFF);
outtextxy(100, 50, s);
loadimage(&backg_rocket, _T("C:\Users\kekek\Desktop\小球运动测试v.20\rocket.png"));//加载火箭图片;
putimagePng(rocket_x, rocket_y, &backg_rocket);//打开火箭图片;
loadimage(&backg_ufo, _T("C:\Users\kekek\Desktop\小球运动测试v.20\ufo.png"));//加载UFO图片;
putimagePng(ufo_x, ufo_y, &backg_ufo);//打开UFO图片;
loadimage(&backg_bullet, _T("C:\Users\kekek\Desktop\小球运动测试v.20\bullet.png"));//加载子弹图片;
putimagePng(bullet_x, bullet_y, &backg_bullet);//打开子弹图片;
//======加载音乐======//
mciSendString(_T("open C:\Users\kekek\Desktop\小球运动测试v.20\unstoppable.mp3"), NULL, 0, NULL);//打开音乐;
mciSendString(_T("play C:\Users\kekek\Desktop\小球运动测试v.20\unstoppable.mp3"), NULL, 0, NULL);//播放音乐;
//按键测试;
char userkey = _getch();//通过按键监控,使玩家可控制火箭运动方向;
{
switch (userkey)
{
case 'a':
rocket_x -= 20;
break;
case 'd':
rocket_x += 20;
break;
case 'w':
rocket_y -= 20;
break;
case 's':
rocket_y += 20;
break;
case ' ':
bullet_y -= 150;
if (bullet_y < 0)
{
bullet_y = rocket_y;
bullet_x = rocket_x;
}
break;
}
}
//攻击得分机制//
if ((bullet_x +20>= ufo_x) && (bullet_x <= ufo_x+60) && (bullet_y <= ufo_y+45))
{
bullet_x = rocket_x;
bullet_y = rocket_y;
score++;
}
//======越界检测======//
if (rocket_y +69>= win_height)
{
rocket_y = win_height-69;
score = 0;
}
if (rocket_y < 0)
{
rocket_y = 0;
score = 0;
}
if (rocket_x +50>=win_width)
{
rocket_x = win_width-50;
score = 0;
}
if (rocket_x < 0)
{
rocket_x = 0;
score = 0;
}
//======子弹越界检测======//子弹飞出界外则返回火箭
if ((bullet_y >= win_height)||(bullet_y < 0))
{
bullet_y = rocket_y;
}
if( (bullet_x >= win_width)||(bullet_x < 0))
{
bullet_x = rocket_x;
}
//======碰撞检测=======//
if ((rocket_x + 50 >= ufo_x) && (rocket_x <= ufo_x + 60) && (rocket_y <= ufo_y + 45)&&(rocket_y+69>=ufo_y))
{
rocket_x = win_width / 2;
rocket_y = win_width - 70;
score = 0;
}
// //怪物随机生成
srand((unsigned)time(0));
ufo_x = rand() % 540 + 1;
ufo_y = (rand() % 290) / float(2) + 1;
//==============//
Sleep(100);
cleardevice();
}
//======收尾======//
closegraph();
return 0;
}
总结
初次编写,技术有限,还勿见笑,望大佬们斧正。
最后
以上就是眼睛大康乃馨为你收集整理的大一实训之火箭大战前言一、游戏开发思路二、使用步骤总结的全部内容,希望文章能够帮你解决大一实训之火箭大战前言一、游戏开发思路二、使用步骤总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复