游戏概述
此2D游戏是自己一行一行代码码出来的(参考的游戏也是自己以前做过或者实现的2D游戏),使用的easyx.h的库。资源大多是网上找来自己加工的(人物借鉴别人的模型,Al是自己换的颜色),掩码图大多也是自己使用PS,ae等工具制作的,完整的制作2D游戏素材教程在我前面的博客会有提到(持续更新中),希望对你们有所帮助
编译环境Visual studio 2017
资源加载
单独使用了一个头文件进行资源的加载resources.h,人物也封装成了一个类。
游戏概述
本程序是一个对战的仙侠类游戏,其中
表示移动
J,K,U分别表示跳跃,砍,放大招。对手采取的是一个手写的电脑人机。可以追着角色移动。目前阶段只给敌人添加了左右移动的特性,智能Al敌人会逐渐完善。
开始界面:
战斗界面:
战斗胜利界面:
战斗失败界面:
主要功能函数说明
int main(int argv, char*argc[])
{
int HP = role.NowHP();
int opp_HP = opponent.NowHP();
//随机数种子
srand((unsigned)time(NULL));
//创建窗口
initgraph(WIDTH, HEIGHT); //NOCLOSE不能关闭窗口
loadResources();
//敌方人物初始化
opponent.init(600,role.Y(),0,100,0,100);
//开始界面
startUI();
while (1) {
//1 显示背景和人物
ShowUI();
//2 按键按下改变人物位置信息
keyDown();
killRelease();
AI();
opp_Follow();
//3 重新显示场景信息
Win();
}
closegraph();
return 0;
}
角色类:
#pragma once
#include"loadResources.h"
#define LBorder -120
#define RBorder 1024
#define UpBorder 150
#define DownBorder 450
class Role
{
int x; //x坐标
int y; //y坐标
int postion; //当前位置
int fullHP; //血量
int myself; //1表示自己 0表示敌人
int HP; //现有血量
public:
//构造函数
Role() {
x = 50;
y = 300;
postion = 1;
fullHP = 100;
myself = 1;
HP = 100;
}
~Role() {};
//初始化
void init(int X, int Y, int pos, int fullBlood, int Myself, int blood);
//边界判定与位置改变
void XMove();
void YMove();
//位置右移动移动
void moveRight()
{
x += 30;
}
//位置左移动
void moveLeft()
{
x -= 30;
}
//位置
int Pos()
{
return postion;
}
//位置上移
void Up() {
y -= 30;
}
//位置下移
void Down() {
y += 30;
}
//返回X坐标
int X() {
return x;
}
int Y() {
return y;
}
//改变x的值
void ChangeX(int value)
{
x = value;
}
//改变y的值
void ChangeY(int value)
{
y = value;
}
//改变位置
void ChangePos(int pos) {
postion = pos;
}
//返回对象
int Object()
{
return myself;
}
//现有血量
void changeHP(int peopleHP)
{
HP -= peopleHP;
}
//返回血量
int NowHP()
{
return HP;
}
//人物血量
//血量图
void showHP(int X, int Y, int xx, int yy, int dir) {
if (dir == 1)
{
char HPtext[100]; //MPtext[20];
sprintf(HPtext, "角色 %d/%d", HP, fullHP);
//sprintf(MPtext, "MP %d/%d", MP, fullMP);
rectangle(X, 1 + Y, 110 + xx, 20 + yy);
//rectangle(20, 22, 116, 42);
setfillcolor(RED);
solidrectangle(1 + X, 2 + Y,10+HP + xx, 19 + yy);
setbkmode(TRANSPARENT);
outtextxy(0,3,HPtext);
//setfillcolor(BLUE);
//solidrectangle(21, 23, 15 + MP, 41);
//outtextxy(0, 3, HPtext);
//outtextxy(0, 25, MPtext);
}
if (dir == 0)
{
char HPtext_opp[100];
sprintf(HPtext_opp, "敌人 %d/%d", HP, fullHP);
rectangle(X, 30 + Y, 110 + xx, 50 + yy);
setfillcolor(RED);
solidrectangle(1 + X, 31 + Y, 10+HP + xx, 49 + yy);
setbkmode(TRANSPARENT);
outtextxy(0, 32, HPtext_opp);
}
}
};
//边界判断与人物移动位置改变
//x
void Role::XMove() {
switch (postion) {
case 0:
if (x < LBorder) {
x = LBorder;
break;
}
moveLeft();
break;
case 1:
if (x > RBorder-230) {
x = RBorder - 230;
break;
}
moveRight();
break;
}
}
//y
void Role::YMove() {
switch (postion) {
case 0:
if (y > DownBorder) {
y = DownBorder;
break;
}
Down();
break;
case 1:
if (y < UpBorder) {
y = UpBorder;
break;
}
Up();
break;
}
}
//初始化
void Role::init(int X, int Y, int pos, int fullBlood,int Myself,int blood) {
x = X;
y = Y;
postion = pos;
fullHP = fullBlood;
myself = Myself;
HP = blood;
}
前期Al的简单实现:
//AI对手
void AI()
{
if ((role.X() - opponent.X()) >= 30 || (role.X() - opponent.X()) <= -30)
{
state_opp = 1;
opponent.XMove();
}
else
{
state_opp = 3 + rand() % 6;
role.changeHP(5);
}
}
代码还会继续优化,Al也会不断的完善。现阶段只是实现了一些简单的打斗和场景特效,代码逻辑进行了详细的标注,很容易看懂。
源代码下载:
链接: github地址