游戲講解
- 游戲概述
- 資源加載
- 游戲概述
- 主要功能函式說明
- 角色類:
- 前期Al的簡單實作:
- 源代碼下載:
游戲概述
此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地址
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338201.html
標籤:其他
