opencv+c++写的小游戏,泡泡堂超级基础版
2018.7.3--2018.7.14,這是這幾天的成果,從安裝編譯器,到配置環(huán)境,到學(xué)習(xí)新的編譯器使用,到學(xué)習(xí)C++,學(xué)習(xí)opencv,再到寫(xiě)出整個(gè)游戲,經(jīng)歷了很多,也學(xué)會(huì)了很多,不怕軟件崩,不怕電腦崩,更要不怕心態(tài)崩,要真正的靜下心來(lái)面對(duì)自己的代碼,面對(duì)自己的人物,希望以后真正成為一名程序媛的時(shí)候,這些經(jīng)歷會(huì)成為我美好的回憶
1:主函數(shù)控制整個(gè)程序的運(yùn)行
#include "stdafx.h"
#include"Game.h"
#include"BackMusic.h"
int main()
{
?? ?CBackMusic music;
?? ?music.PlayMusic();
?? ?CGame game;
?? ?game.Run();
?? ?return 0;
}
2:接下來(lái)分別寫(xiě)人物地圖爆炸背景音樂(lè)以及控制游戲各種界面跳轉(zhuǎn)的游戲類(lèi)
人物類(lèi):
#include "stdafx.h"
#include "Player.h"
CPlayer::CPlayer()
{
?? ?m_ori = 0;
?? ?char name[100];
?? ?for (int i = 0; i < 4; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\player%d.jpg", i);
?? ??? ?m_img[i] = cvLoadImage(name);
?? ?}
?? ?m_pos.x = 40;
?? ?m_pos.y = 40;
?? ?m_speed = 40;
}
CPlayer::~CPlayer()
{
?? ?for (int i = 0; i < 4; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_img[i]);
?? ?}
}
void CPlayer::Move(char key, CGameMap * map)
{
?? ?int x = m_pos.x;
?? ?int y = m_pos.y;
?? ?switch (key)
?? ?{
?? ?case 'W':
?? ?case 'w':
?? ??? ?if (y > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 0;
?? ??? ??? ?y -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'S':
?? ?case 's':
?? ??? ?if (y < 600)
?? ??? ?{
?? ??? ??? ?m_ori = 3;
?? ??? ??? ?y += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'A':
?? ?case 'a':
?? ??? ?if (x > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 2;
?? ??? ??? ?x -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'D':
?? ?case 'd':
?? ??? ?if (x <660)
?? ??? ?{
?? ??? ??? ?m_ori = 1;
?? ??? ??? ?x += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?}
?? ?if (map->Judge(x, y))
?? ?{
?? ??? ?m_pos.x = x;
?? ??? ?m_pos.y = y;
?? ?}
}
void CPlayer::Move(char key, CLevelTwoMap * map)
{
?? ?int x = m_pos.x;
?? ?int y = m_pos.y;
?? ?switch (key)
?? ?{
?? ?case 'W':
?? ?case 'w':
?? ??? ?if (y > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 0;
?? ??? ??? ?y -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'S':
?? ?case 's':
?? ??? ?if (y < 600)
?? ??? ?{
?? ??? ??? ?m_ori = 3;
?? ??? ??? ?y += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'A':
?? ?case 'a':
?? ??? ?if (x > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 2;
?? ??? ??? ?x -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'D':
?? ?case 'd':
?? ??? ?if (x <660)
?? ??? ?{
?? ??? ??? ?m_ori = 1;
?? ??? ??? ?x += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?}
?? ?if (map->Judge(x, y))
?? ?{
?? ??? ?m_pos.x = x;
?? ??? ?m_pos.y = y;
?? ?}
}
void CPlayer::DrawtoBack(IplImage * back)
{
?? ?CTools::DrawtoBack(back, m_img[m_ori], m_pos.x, m_pos.y, 225, 225, 225);
}
地圖類(lèi):
#include "stdafx.h"
#include "GameMap.h"
CGameMap::CGameMap()
{
?? ?m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_ShowImg = cvCloneImage(m_StaticBack);
?? ?char name[100];
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\stone%d.jpg", i);
?? ??? ?m_Stone[i] = cvLoadImage(name);
?? ?}
}
CGameMap::~CGameMap()
{
?? ?cvReleaseImage(&m_StaticBack);
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_Stone[i]);
?? ?}
}
void CGameMap::ReadMap()
{
?? ?ifstream inf;
?? ?inf.open("image\\map_lever2.txt");
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?inf >> m_Map[i][j];
?? ??? ?}
?? ?}
}
void CGameMap::CreateMap()
{
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j <16; j++)
?? ??? ?{
?? ??? ??? ?int x = i * 40;
?? ??? ??? ?int y = j * 40;
?? ??? ??? ?int k = m_Map[i][j];
?? ??? ??? ?if (k != -1)
?? ??? ??? ??? ?CTools::DrawtoBack(m_StaticBack, m_Stone[k], x, y, 235, 235, 235);//不同圖片貼上去
?? ??? ?}
?? ?}
}
IplImage *CGameMap::GetShowMap()
{
?? ?CreateMap();
?? ?return m_StaticBack;
}
int CGameMap::Judge(int x, int y)
{
?? ?int px = x / 40;
?? ?int py = y / 40;
?? ?if (m_Map[px][py] == -1)
?? ??? ?return 1;
?? ?else
?? ??? ?return 0;
}
爆炸類(lèi):
#include "stdafx.h"
#include "Bomb.h"
CBomb::CBomb()
{
?? ?m = 0;
?? ?m_flag = false;
?? ?m_timecount = 40;
?? ?char name[100];
?? ?for (int i = 0; i < 2; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\crump%d.bmp", i);
?? ??? ?m_bombing[i] = cvLoadImage(name, 1);
?? ?}
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\shockwave-00%d.bmp", i);
?? ??? ?m_bombed[i] = cvLoadImage(name, 1);
?? ?}
}
CBomb::~CBomb()
{
?? ?for (int i = 0; i < 2; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_bombing[i]);
?? ?}
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_bombed[i]);
?? ?}
}
int CBomb::JudgeMap(CGameMap *giftmap)
{
?? ?m = 0;
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?if (giftmap->m_Map[i][j] >= 6)
?? ??? ??? ?{
?? ??? ??? ??? ?m = 1;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return m;
}
int CBomb::JudgeMap2(CLevelTwoMap *giftmap)
{
?? ?m = 0;
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?if (giftmap->m_Map[i][j] >= 6)
?? ??? ??? ?{
?? ??? ??? ??? ?m = 1;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return m;
}
void CBomb::BombState(IplImage * imgback)
{
?? ?m_timecount--;
?? ?if (m_timecount >= 35)
?? ?{
?? ??? ?m_bombstate = 0;
?? ?}
?? ?else
?? ??? ?if (m_timecount >= 30)
?? ??? ?{
?? ??? ??? ?m_bombstate = 1;
?? ??? ?}
?? ??? ?else
?? ??? ??? ?if (m_timecount <28)
?? ??? ??? ?{
?? ??? ??? ??? ?m_bombstate = 2;
?? ??? ??? ?}
}
void CBomb::BombChange(IplImage * imgback, CGameMap * map, CGameMap *bombmap)
{
?? ?switch (m_bombstate)
?? ?{
?? ?case 0:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[0], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 1:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[1], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 2:
?? ??? ?CTools::DrawBomb(imgback, m_bombed[004], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[001], m_pos.x, m_pos.y - 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[002], m_pos.x + 40, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[003], m_pos.x, m_pos.y + 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[000], m_pos.x - 40, m_pos.y, 0, 0, 255);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x - 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x + 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y - 40);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y + 40);
?? ??? ?m_flag = false;
?? ??? ?m_timecount = 40;
?? ??? ?break;
?? ?}
}
void CBomb::BombChange2(IplImage * imgback, CLevelTwoMap * map, CLevelTwoMap *bombmap)
{
?? ?switch (m_bombstate)
?? ?{
?? ?case 0:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[0], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 1:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[1], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 2:
?? ??? ?CTools::DrawBomb(imgback, m_bombed[004], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[001], m_pos.x, m_pos.y - 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[002], m_pos.x + 40, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[003], m_pos.x, m_pos.y + 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[000], m_pos.x - 40, m_pos.y, 0, 0, 255);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x - 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x + 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y - 40);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y + 40);
?? ??? ?m_flag = false;
?? ??? ?m_timecount = 40;
?? ??? ?break;
?? ?}
}
int CBomb::Bombed(int x, int y)
{
?? ?if ((x == m_pos.x&&y == m_pos.y) || (y == m_pos.y - 40 && x == m_pos.x) || (y == m_pos.y + 40 && x == m_pos.x) || (y == m_pos.y&&x == m_pos.x - 40) || (y == m_pos.y&&x == m_pos.x + 40))
?? ??? ?return 1;
?? ?else
?? ??? ?return 0;
}
void CBomb::ClearBomb(CGameMap *bombmap, int x, int y)//清除炸彈,
{
?? ?if (bombmap->m_Map[x / 40][y / 40] != 5)//墻無(wú)法被炸掉
?? ?{
?? ??? ?if (bombmap->m_Map[x / 40][y / 40] != -1)
?? ??? ?{
?? ??? ??? ?bombmap->m_Map[x / 40][y / 40] = -1;
?? ??? ?}
?? ?}
}
void CBomb::ClearBomb(CLevelTwoMap *bombmap, int x, int y)
{
?? ?if (bombmap->m_Map[x / 40][y / 40] != 5)
?? ?{
?? ??? ?if (bombmap->m_Map[x / 40][y / 40] != -1)
?? ??? ?{
?? ??? ??? ?bombmap->m_Map[x / 40][y / 40] = -1;
?? ??? ?}
?? ?}
}
以及貼圖時(shí)所用的工具類(lèi),調(diào)用工具類(lèi)里里面的函數(shù)來(lái)對(duì)圖片進(jìn)行處理,這里用到了像素宏的處理方法
#include "stdafx.h"
#include "Tools.h"
CTools::CTools()
{
}
CTools::~CTools()
{
}
void CTools::DrawtoBack(IplImage * back, IplImage * img, int x, int y, int blue, int green, int red)
{
?? ?for (int i = 0; i < img->height; i++)
?? ?{
?? ??? ?for (int j = 0; j < img->width; j++)
?? ??? ?{
?? ??? ??? ?int b = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 0);
?? ??? ??? ?int g = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 1);
?? ??? ??? ?int r = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 2);
?? ??? ??? ?if (!((b > blue) && (g > green) && (r > red)))
?? ??? ??? ?{
?? ??? ??? ??? ?CV_IMAGE_ELEM(back, uchar, i + y, (j + x) * 3 + 0) = b;
?? ??? ??? ??? ?CV_IMAGE_ELEM(back, uchar, i + y, (j + x) * 3 + 1) = g;
?? ??? ??? ??? ?CV_IMAGE_ELEM(back, uchar, i + y, (j + x) * 3 + 2) = r;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
void CTools::DrawBomb(IplImage * imgback, IplImage * img, int x, int y, int blue, int green, int red)
{
?? ?if (img != NULL) {
?? ??? ?for (int i = 0; i < img->height; i++)
?? ??? ?{
?? ??? ??? ?for (int j = 0; j < img->width; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?int b = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 0);
?? ??? ??? ??? ?int g = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 1);
?? ??? ??? ??? ?int r = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 2);
?? ??? ??? ??? ?if (CV_IMAGE_ELEM(img, uchar, i, j * 3 + 2) < 255)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?CV_IMAGE_ELEM(imgback, uchar, y + i, (j + x) * 3) = b;
?? ??? ??? ??? ??? ?CV_IMAGE_ELEM(imgback, uchar, y + i, (j + x) * 3 + 1) = g;
?? ??? ??? ??? ??? ?CV_IMAGE_ELEM(imgback, uchar, y + i, (j + x) * 3 + 2) = r;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
背景音樂(lè)類(lèi):可以專(zhuān)門(mén)播放背景音樂(lè),其實(shí)可以設(shè)置不同的關(guān)卡或者爆炸呀什么不同的音樂(lè),但是這里初學(xué)的時(shí)候不知道怎么弄,因此整個(gè)游戲就一個(gè)音樂(lè)
#include "stdafx.h"
#include "BackMusic.h"
CBackMusic::CBackMusic()
{
}
CBackMusic::~CBackMusic()
{
}
void CBackMusic::PlayMusic()
{
?? ?PlaySound(TEXT("image\\back.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
}
如果需要設(shè)置另外的關(guān)卡,只需要將你需要變換的地圖呀人物呀以及輸贏方式變換一下重新寫(xiě)一個(gè)類(lèi)或者直接繼承就行了,這里初學(xué)的時(shí)候,加上時(shí)間緊迫,設(shè)置關(guān)卡就設(shè)置了兩關(guān),并且只是修改了相關(guān)的地圖,其他的都沒(méi)有變,以后有時(shí)間有想法再來(lái)改進(jìn)
#include "stdafx.h"
#include "LevelTwoMap.h"
CLevelTwoMap::CLevelTwoMap()
{
?? ?m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_ShowImg = cvCloneImage(m_StaticBack);
?? ?char name[100];
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\obstacle%d.jpg", i);
?? ??? ?m_obstacle[i] = cvLoadImage(name);
?? ?}
}
CLevelTwoMap::~CLevelTwoMap()
{
?? ?cvReleaseImage(&m_StaticBack);
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_obstacle[i]);
?? ?}
}
void CLevelTwoMap::ReadMap()
{
?? ?ifstream inf;
?? ?inf.open("image\\map_lever1.txt");
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?inf >> m_Map[i][j];
?? ??? ?}
?? ?}
}
void CLevelTwoMap::CreateMap()
{
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j <16; j++)
?? ??? ?{
?? ??? ??? ?int x = i * 40;
?? ??? ??? ?int y = j * 40;
?? ??? ??? ?int k = m_Map[i][j];
?? ??? ??? ?if (k != -1)
?? ??? ??? ??? ?CTools::DrawtoBack(m_StaticBack, m_obstacle[k], x, y, 235, 235, 235);//不同圖片貼上去
?? ??? ?}
?? ?}
}
IplImage * CLevelTwoMap::GetShowMap()
{
?? ?CreateMap();
?? ?return m_StaticBack;
}
int CLevelTwoMap::Judge(int x, int y)
{
?? ?int px = x / 40;
?? ?int py = y / 40;
?? ?if (m_Map[px][py] == -1)
?? ??? ?return 1;
?? ?else
?? ??? ?return 0;
}
最后就是最重要的Game類(lèi),控制整個(gè)游戲的運(yùn)行,其中穿插了時(shí)間的計(jì)算,但是沒(méi)有想到辦法把時(shí)間顯示在游戲界面上,以后想到了再說(shuō),其實(shí)核心控制游戲進(jìn)行,想法還是挺簡(jiǎn)單的,遺憾的是鼠標(biāo)事件沒(méi)有加上去,其實(shí)學(xué)歷,但是加上去的時(shí)候始終有錯(cuò),所以就放棄了,等以后能熟練運(yùn)用鼠標(biāo)事件函數(shù)再來(lái)解決這個(gè)問(wèn)題,畢竟游戲都離不開(kāi)鼠標(biāo),GAme類(lèi)看起來(lái)還是很簡(jiǎn)單的,小衛(wèi)星那個(gè)一下就可以想通,整個(gè)游戲也是比較簡(jiǎn)單的,比較適合真的那種新手看
#include "stdafx.h"
#include "Game.h"
CGame::CGame()
{
?? ?m_state = 0;
?? ?m_mapob.ReadMap ();
?? ?m_mapob.GetShowMap();
?? ?cvNamedWindow("QQ candy", 1);
}
CGame::~CGame()
{
?? ?cvDestroyWindow("QQ candy");
?? ?cvReleaseImage(&m_showimg);
}
void CGame::Run()
{
?? ?Welcome();
?? ?while (1)
?? ?{
?? ??? ?switch (m_state)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?Help();
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?Choice();
?? ??? ??? ?break;
?? ??? ?case 3:
?? ??? ??? ?Win();
?? ??? ??? ?break;
?? ??? ?case 4:
?? ??? ??? ?Lose();
?? ??? ??? ?break;
?? ??? ?case 5:
?? ??? ??? ?Level1();
?? ??? ??? ?break;
?? ??? ?case 6:
?? ??? ??? ?Level2();
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}
void CGame::Welcome()
{
?? ?m_mapob.GetShowMap();
?? ?m_showimg = cvLoadImage("image\\welcome.jpg");
?? ?cvNamedWindow("QQ candy");
?? ?cvShowImage("QQ candy", m_showimg);
?? ?char key = cvWaitKey(0);
?? ?if (key == ' ')
?? ?{
?? ??? ?m_state = 2;
?? ?}
?? ?if (key == 'H' || key == 'h')
?? ?{
?? ??? ?m_state = 1;
?? ?}
?? ?if (key == 'Q' || key == 'q')
?? ?{
?? ??? ?m_state = 8;
?? ?}
?? ?cvReleaseImage(&m_showimg);
?? ?cvDestroyWindow("QQ candy");
}
void CGame::Choice()
{
?? ?m_choice = cvLoadImage("image\\choice.jpg", 1);
?? ?cvShowImage("QQ candy", m_choice);
?? ?char key = cvWaitKey(0);
?? ?if (key == 'F' || key == 'f')
?? ?{
?? ??? ?m_state = 5;
?? ?}
?? ?if (key == 'S' || key == 's')
?? ?{
?? ??? ?m_state = 6;
?? ?}
}
void CGame::Help()
{
?? ?m_helpimg = cvLoadImage("image\\help.jpg", 1);
?? ?cvShowImage("QQ candy", m_helpimg);
?? ?char key = cvWaitKey(0);
?? ?if (key == ' ')
?? ?{
?? ??? ?m_state = 2;
?? ?}
}
void CGame::Level1()
{
?? ?time_t start, end;
?? ?double cost;
?? ?time(&start);
?? ?m_mapob.ReadMap();
?? ?m_mapob.GetShowMap();
?? ?m_player.m_pos.x = 40;
?? ?m_player.m_pos.y = 40;
?? ?while (1)
?? ?{
?? ??? ?time(&end);
?? ??? ?cost = difftime(end, start);
?? ??? ?printf("%f\n", cost);
?? ??? ?if (cost > 60)
?? ??? ?{
?? ??? ??? ?m_state = 4;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?UpdateMap();
?? ??? ?m_bomb.m = m_bomb.JudgeMap(&m_mapob);
?? ??? ?if (m_bomb.m == 0)
?? ??? ?{
?? ??? ??? ?m_state = 3;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?cvCopy(m_mapob.m_StaticBack, m_mapob.m_ShowImg);
?? ??? ?char key = cvWaitKey(50);
?? ??? ?if (key == ' ' && !m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.m_pos.y = m_player.m_pos.y;
?? ??? ??? ?m_bomb.m_pos.x = m_player.m_pos.x;
?? ??? ??? ?m_bomb.m_flag = true;
?? ??? ?}
?? ??? ?if (m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.BombState(m_mapob.m_ShowImg);
?? ??? ??? ?m_bomb.BombChange(m_mapob.m_ShowImg, &m_mapob, &m_mapob);
?? ??? ??? ?if (!m_bomb.m_flag)
?? ??? ??? ?{
?? ??? ??? ??? ?if (m_bomb.Bombed(m_player.m_pos.x, m_player.m_pos.y))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?m_state = 4;
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?m_player.Move(key, &m_mapob);
?? ??? ?m_player.DrawtoBack(m_mapob.m_ShowImg);
?? ??? ?cvShowImage("QQ candy", m_mapob.m_ShowImg);
?? ?}
}
void CGame::Level2()
{
?? ?time_t start, end;
?? ?double cost;
?? ?time(&start);
?? ?m_mapob2.ReadMap();
?? ?m_mapob2.GetShowMap();
?? ?m_player.m_pos.x = 40;
?? ?m_player.m_pos.y = 40;
?? ?while (1)
?? ?{
?? ??? ?time(&end);
?? ??? ?cost = difftime(end, start);
?? ??? ?if (cost > 60)
?? ??? ?{
?? ??? ??? ?m_state = 4;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?UpdateMap2();
?? ??? ?m_bomb.m = m_bomb.JudgeMap2(&m_mapob2);
?? ??? ?if (m_bomb.m == 0)
?? ??? ?{
?? ??? ??? ?m_state = 3;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?cvCopy(m_mapob2.m_StaticBack, m_mapob2.m_ShowImg);
?? ??? ?char key = cvWaitKey(50);
?? ??? ?if (key == ' ' && !m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.m_pos.y = m_player.m_pos.y;
?? ??? ??? ?m_bomb.m_pos.x = m_player.m_pos.x;
?? ??? ??? ?m_bomb.m_flag = true;
?? ??? ?}
?? ??? ?if (m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.BombState(m_mapob2.m_ShowImg);
?? ??? ??? ?m_bomb.BombChange2(m_mapob2.m_ShowImg, &m_mapob2, &m_mapob2);
?? ??? ??? ?if (!m_bomb.m_flag)
?? ??? ??? ?{
?? ??? ??? ??? ?if (m_bomb.Bombed(m_player.m_pos.x, m_player.m_pos.y))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?m_state = 4;
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?m_player.Move(key, &m_mapob2);
?? ??? ?m_player.DrawtoBack(m_mapob2.m_ShowImg);
?? ??? ?cvShowImage("QQ candy", m_mapob2.m_ShowImg);
?? ?}
}
void CGame::Win()
{
?? ?m_win = cvLoadImage("image\\win.jpg", 1);
?? ?cvShowImage("QQ candy", m_win);
?? ?cvWaitKey(0);
?? ?Welcome();
}
void CGame::Lose()
{
?? ?m_lost = cvLoadImage("image\\lost.jpg", 1);
?? ?cvShowImage("QQ candy", m_lost);
?? ?cvWaitKey(0);
?? ?Welcome();
}
void CGame::UpdateMap()
{
?? ?m_mapob.m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_mapob.m_StaticBack = m_mapob.GetShowMap();
}
void CGame::UpdateMap2()
{
?? ?m_mapob2.m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_mapob2.m_StaticBack = m_mapob2.GetShowMap();
}
真正的適合新手的,這是我寫(xiě)的第一個(gè)比較成型的游戲,雖然很簡(jiǎn)單,過(guò)程也很艱難,感謝朋友的陪伴以及幫助和鼓勵(lì),10天的成果,對(duì)于一個(gè)沒(méi)有學(xué)過(guò)C++和opencv的人而言,已經(jīng)足夠了,希望以后能好好改進(jìn),做出更好的游戲來(lái)。
?
總結(jié)
以上是生活随笔為你收集整理的opencv+c++写的小游戏,泡泡堂超级基础版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中国电商物流行业专项规划与发展机遇研究报
- 下一篇: 基于经纬度的拜访轨迹问题