¸üÐÂʱ¼ä:2020Äê01ÔÂ16ÈÕ16ʱ25·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:
Ŀ¼

·É»ú´óÕ½ÊÇÎÒÃÇ´ó¼ÒËùÊìÖªµÄÒ»¿îСÓÎÏ·£¬±¾½Ì³Ì¾ÍÊǽ̴ó¼ÒÈçºÎÖÆ×÷Ò»¿î×Ô¼ºµÄ·É»ú´óÕ½¡£
Ê×ÏÈÎÒÃÇ¿´Ò»ÏÂЧ¹ûͼ

Íæ¼Ò¿ØÖÆÒ»¼ÜС·É»ú£¬È»ºó×Ô¶¯·¢Éä×Óµ¯£¬Èç¹û×Óµ¯´òµ½ÁË·ÉÏÂÀ´µÄµÐ»ú£¬ÔòÉäɱµÐ»ú£¬²¢ÇÒÓб¬Õ¨µÄÌØÐ§¡£½ÓÏÂÀ´ÔÙ˵Ã÷һϰ¸ÀýµÄÐèÇó£¬Ò²¾ÍÊÇÎÒÃÇÐèҪʵÏÖµÄÄÚÈÝ¡£
·¹ö¶¯µÄ±³¾°µØÍ¼
··É»úµÄÖÆ×÷ºÍ¿ØÖÆ
·×Óµ¯µÄÖÆ×÷ºÍÉä»÷
·µÐ»úµÄÖÆ×÷
·Åöײ¼ì²â
·±¬Õ¨Ð§¹û
·ÒôЧÌí¼Ó
´´½¨ÏîÄ¿²½ÖèÈçÏ£º
·´ò¿ªQt
·¸ú×ÅÏòµ¼´´½¨ÏîÄ¿
»ùÀàÑ¡Ôñ QWidget¿Õ´°¿Ú
µÚÒ»¸ö³¡¾°ÎªÖ÷³¡¾° MainScene
²»´øUI½çÃæ
2.1 ´ò¿ªQt
ÕÒµ½Äã°²×°µÄQt Creator£¬´ò¿ªËü¡£
Èç¹û°²×°Ê±£¬Ã»ÓÐÑ¡ÔñÔÚ×ÀÃæÉϽ¨Á¢¿ì½Ý·½Ê½£¬ÄÇôÄãµÄQtÈí¼þλÖÃÈçÏÂ
C:\qt\Qt5.x.x\Tools\QtCreator\bin
ÔÚÕâ¸ö·¾¶ÏÂÕÒµ½ qtcreator.exe Ë«»÷´ò¿ª¼´¿É
2.2 °´ÕÕÏòµ¼´´½¨ÏîÄ¿
2.2.1 н¨ÏîÄ¿
µã»÷²Ëµ¥ ÖеÄÎļþ -> н¨Îļþ»òÏîÄ¿ »òÕß ÔÚÊ×Ò³ÃæÖеã»÷New Project

2.2.2 Ñ¡ÔñÄ£°å
Ä£°åÑ¡Ôñ Application -> Qt Widget Application

2.2.3 ÏîÄ¿Ãû³ÆºÍλÖÃ
¸øÏîÄ¿Æð¸öÃû³ÆÒÔ¼°Ñ¡ÖÐÏîĿҪ±£´æµÄµØ·½

ÕâÒ»²½Ñ¡ÔñºóÔÚKits ¹¹½¨Ì×¼þÖÐÖ±½Óµã»÷ÏÂÒ»²½¼´¿É
2.2.4 ÀàÐÅÏ¢
»ùÀàÑ¡Ôñ QWidget
ÀàÃûÒ²¾ÍÊÇÎÒÃǵÚÒ»¸ö´°¿Ú³¡¾°µÄÃû³Æ£¬ÕâÀïÎÒÆðÃûΪ MainScene ´ú±íÓÎÏ·ÖеÄÖ÷³¡¾°
È¡Ïû´´½¨½çÃæÖеÄÄÚÈÝ

2.2.5 Íê³É´´½¨
ÔÚ»ã×ÜÒ³ÃæÖеã»÷Íê³É£¬ÎÒÃǾÍÂõ¿ªÁËÏîÄ¿µÄµÚÒ»²½£¡

Ö÷³¡¾°ÉèÖõIJ½ÖèÈçÏ£º
·Ìí¼ÓÅäÖÃÎļþ£¬±£´æÓÎÏ·ÖÐËùÓÐÅäÖÃÊý¾Ý
·³õʼ»¯Ö÷³¡¾°´°¿Ú´óС¡¢±êÌâ
3.1 ÅäÖÃÎļþÌí¼Ó
´´½¨ÐµÄÍ·ÎļþΪ config.h Ö÷Òª¼Ç¼³ÌÐòÖÐËùÓеÄÅäÖÃÊý¾Ý£¬·½±ãºóÆÚÐÞ¸Ä
Ìí¼Ó´°¿Ú¿í¶È¡¢¸ß¶ÈµÄÅäÖÃÐÅÏ¢£¬ÒÀ¾Ý±³¾°Í¼´óС½øÐÐÉèÖÃ
/********** ÓÎÏ·ÅäÖÃÊý¾Ý **********/
define GAME_WIDTH 512 //¿í¶È
define GAME_HEIGHT 768 //¸ß¶È
define GAME_TITLE "·É»ú´óÕ½ v1.0" //±êÌâ
3.2 Ö÷³¡¾°»ù±¾ÉèÖÃ
ÔÚmainScene.hÖÐÌí¼ÓеijÉÔ±º¯ÊýinitScene ÓÃÀ´³õʼ»¯ÓÎÏ·³¡¾°
void initScene();
ÔÚmainScene.cppÖÐʵÏÖÈçÏ´úÂë
void MainScene::initScene()
{
//³õʼ»¯´°¿Ú´óС
setFixedSize(GAMEWIDTH,GAMEHEIGHT);
//ÉèÖô°¿Ú±êÌâ
setWindowTitle(GAME_TITLE);
}
ÔÚ¹¹Ô캯ÊýMainSceneÖе÷Óøú¯Êý initScene
MainScene::MainScene(QWidget *parent)
: QWidget(parent)
{
//³õʼ»¯³¡¾°
initScene();
}
²âÊÔÔËÐÐЧ¹ûÈçͼ£º

ÔÚÖ÷³¡¾°ÖÐÆäʵ»¹ÓÐÒ»¸öÅäÖÃÏîûÓÐʵÏÖ£¬Ò²¾ÍÊÇ´°¿Ú×óÉϽǵÄÄǸöͼ±ê×ÊÔ´¡£ÄÇô½ÓÏÂÀ´ÎÒÃǽ«ÓÎÏ·ÖеÄ×ÊÔ´½øÐе¼Èë²¢ÇÒÉèÖÃÓÎϷͼ±ê¡£
×ÊÔ´µ¼Èë²½Öè
·Éú³ÉqrcÎļþ
·ÏîĿͬ¼¶Ä¿Â¼Ï´´½¨resÎļþ¼Ð²¢½«×ÊÔ´Õ³Ìù¹ýÀ´
·±à¼qrc£¬¼ÓÈëǰ׺ºÍÎļþ
·ÀûÓÃqrcÉú³É¶þ½øÖÆÎļþ rcc
·rccÎļþ·ÅÈëµ½debugͬ¼¶Ä¿Â¼ÏÂ
·×¢²á¶þ½øÖÆÎļþ
·Ìí¼Óͼ±ê×ÊÔ´
4.1 qrcÎļþÉú³É
ÓÒ¼üÏîÄ¿£¬µã»÷Ìí¼ÓÐÂÎļþ
?
Ñ¡ÔñQt -> Qt Resource File

×ÊÔ´ÎļþÆðÃû È磺res

Éú³Éres.qrcÎļþ

4.2 ´´½¨resÎļþ¼Ð
ÏîÄ¿µÄͬ¼¶Ä¿Â¼Ï´´½¨Îļþ¼Ðres£¬²¢½«×¼±¸ºÃµÄ×ÊÔ´Õ³Ìù½øÈ¥

4.3 ±à¼qrcÎļþ
ÓÒ¼üqrcÎļþ£¬Ñ¡ÖÐOpen in Editor

Ìí¼Óǰ׺Ϊ '' \ ''

Ìí¼ÓÎļþ ½«resÏÂËùÓÐÎļþÑ¡Öм´¿É

4.4 qrcÉú³É rcc¶þ½øÖÆÎļþ
ÓÉÓÚ×ÊÔ´¹ý´ó£¬»áÌáʾ´íÎó£º

Õâ¸ö´íÎóÒ²¾ÍÊÇ“±àÒëÆ÷µÄ¶Ñ¿Õ¼ä²»×㔡£
ÓÉÓÚ×ÊÔ´Îļþqrc¹ý´ó£¬³¬³ö·ÖÅäµÄÄڴ淶Χ
Òò´ËÎÒÃÇÐèÒªÀûÓöþ½øÖÆ×ÊÔ´£¬¶øÉú³É¶þ½øÖÆ×ÊÔ´¾ÍÐèÒªÎÒÃǸոյÄqrcÎļþ
ÀûÓÃcmd´ò¿ªÖÕ¶Ë£¬¶¨Î»µ½res.qrcµÄĿ¼Ï£¬ÊäÈëÃüÁî
rcc -binary .\res.qrc -o plane.rcc

4.5 ¸´ÖÆrccÎļþ
½«Éú³ÉºÃµÄrccÎļþ£¬·ÅÈëµ½debugͬ¼¶Ä¿Â¼ÖÐÒ»·Ý

4.6 ×¢²á¶þ½øÖÆÎļþ
ÔÚconfig.hÖÐ×·¼ÓÅäÖÃÊý¾Ý
#define GAMERESPATH "./plane.rcc" //rccÎļþ·¾¶
ÔÚmain.cppÖÐÐ޸ĴúÂë
#include "mainscene.h"
#include
#include
#include "config.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//×¢²áÍⲿµÄ¶þ½øÖÆ×ÊÔ´Îļþ
QResource::registerResource(GAME_RES_PATH);
MainScene w;
w.show();
return a.exec();
}
´Ëʱ£¬qrcÎļþÒѾûÓÃÁË£¬É¾³ý¼´¿É£¡
×î¼òµ¥µÄɾ³ý·½Ê½¾ÍÊÇ .pro¹¤³ÌÎļþÖÐɾ³ý´úÂë,Ó빤³ÌÎ޹ϸð
ɾ³ýÒÔÏ´úÂ룺
RESOURCES += \ res.qrc
4.7 Ìí¼Óͼ±ê×ÊÔ´
ÅäÖÃÎļþconfig.hÖÐ×·¼Ó´úÂë
ÐéÄâ×ÊԴ·¾¶Óï·¨ÈçÏ£º
" : + ǰ׺Ãû + Îļþ·¾¶ "
#define GAME_ICON ":/res/app.ico"
ÔÚmainScene.cppµÄ initSceneº¯ÊýÖÐ×·¼Ó´úÂ룺
//ÉèÖÃͼ±ê×ÊÔ´
setWindowIcon(QIcon( GAME_ICON)); //¼ÓÍ·Îļþ #include <QIcon>
ÔËÐвâÊÔ£º

²½Ö裺
·´´½¨µØÍ¼ÎļþºÍÀà
·Ìí¼Ó³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ ÊµÏÖ³ÉÔ±º¯Êý
·ÓÎÏ·ÔËÐе÷Óö¨Ê±Æ÷
·Æô¶¯¶¨Ê±Æ÷£¬¼àÌý¶¨Ê±Æ÷ÐźÅʵÏÖÓÎÏ·Ñ»·
-¼ÆËãÓÎÏ·ÄÚÔªËØ×ø±ê
-»æÖƵ½ÆÁÄ»ÖÐ
5.1 ´´½¨µØÍ¼ÎļþºÍÀà
ÓÒ¼üÏîÄ¿£¬Ìí¼ÓÐÂÎļþ

Ñ¡ÔñC++ -> C++ Class

ÐÞ¸ÄÀàÃûΪmap£¬µã»÷ÏÂÒ»²½£¬Ö±µ½´´½¨Íê±Ï

ÖÁ´Ë£¬µØÍ¼MapµÄÎļþºÍÀà´´½¨Íê±Ï
5.2 µØÍ¼µÄ³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
ÔÚmap.hÖÐÌí¼ÓÈçÏ´úÂë
#ifndef MAP_H
#define MAP_H
#include(Qpixmap)
class Map {
public:
//¹¹Ô캯Êý
Map();
//µØÍ¼¹ö¶¯×ø±ê¼ÆËã
void mapPosition();
public:
//µØÍ¼Í¼Æ¬¶ÔÏó
QPixmap m_map1;
QPixmap m_map2;
//µØÍ¼YÖá×ø±ê
int m_map1_posY;
int m_map2_posY;
//µØÍ¼¹ö¶¯·ù¶È
int m_scroll_speed;
};
endif // MAP_H
5.3 ʵÏÖ³ÉÔ±º¯Êý
ÔÚconfig.hÖÐÌí¼ÓеÄÅäÖÃÊý¾Ý
/********** µØÍ¼ÅäÖÃÊý¾Ý **********/
define MAPPATH ":/res/imgbglevel1.jpg" //µØÍ¼Í¼Æ¬Â·¾¶
define MAPSCROLLSPEED 2 //µØÍ¼¹ö¶¯ËÙ¶È
ÔÚmap.cppÖÐʵÏÖ³ÉÔ±º¯Êý
#include "map.h"
#include "config.h"
Map::Map()
{
//³õʼ»¯¼ÓÔØµØÍ¼¶ÔÏó
mmap1.load(MAPPATH);
mmap2.load(MAPPATH);
//ÉèÖõØÍ¼ÆäʵyÖá×ø±ê
m_map1_posY = -GAME_HEIGHT;
m_map2_posY = 0;
//ÉèÖõØÍ¼¹ö¶¯ËÙ¶È
m_scroll_speed = MAP_SCROLL_SPEED;
}
void Map::mapPosition()
{
//´¦ÀíµÚÒ»ÕÅͼƬ¹ö¶¯
mmap1posY += MAPSCROLLSPEED;
if(mmap1posY >= 0)
{
mmap1posY =-GAME_HEIGHT;
}
//´¦ÀíµÚ¶þÕÅͼƬ¹ö¶¯
m_map2_posY += MAP_SCROLL_SPEED;
if(m_map2_posY >= GAME_HEIGHT )
{
m_map2_posY =0;
}
}
5.4 ¶¨Ê±Æ÷Ìí¼Ó
ÔÚmainScene.hÖÐÌí¼ÓÐµĶ¨Ê±Æ÷¶ÔÏó
QTimer m_Timer;
ÔÚ config.hÖÐÌí¼Ó ÆÁĻˢмä¸ô
#define GAME_RATE 10 //ˢмä¸ô£¬Ö¡ÂÊ µ¥Î»ºÁÃë
ÔÚMainScene.cppµÄinitSceneÖÐ×·¼Ó´úÂë
//¶¨Ê±Æ÷ÉèÖÃ
m_Timer.setInterval(GAME_RATE);
5.5 Æô¶¯¶¨Ê±Æ÷ʵÏÖµØÍ¼¹ö¶¯
ÔÚMainScene.hÖÐÌí¼ÓеijÉÔ±º¯ÊýÒÔ¼°³ÉÔ±¶ÔÏó
//Æô¶¯ÓÎÏ· ÓÃÓÚÆô¶¯¶¨Ê±Æ÷¶ÔÏó
void playGame();
//¸üÐÂ×ø±ê
void updatePosition();
//»æÍ¼Ê¼þ
void paintEvent(QPaintEvent *event);
//µØÍ¼¶ÔÏó
Map m_map;
ÔÚMainScene.cppÖÐʵÏÖ³ÉÔ±º¯Êý
void MainScene::playGame()
{
//Æô¶¯¶¨Ê±Æ÷
m_Timer.start();
//¼àÌý¶¨Ê±Æ÷
connect(&m_Timer,&QTimer::timeout,[=](){
//¸üÐÂÓÎÏ·ÖÐÔªËØµÄ×ø±ê
updatePosition();
//ÖØÐ»æÖÆÍ¼Æ¬
update();
});
}
void MainScene::updatePosition()
{
//¸üеØÍ¼×ø±ê
m_map.mapPosition();
}
void MainScene::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//»æÖƵØÍ¼
painter.drawPixmap(0,m_map.m_map1_posY , m_map.m_map1);
painter.drawPixmap(0,m_map.m_map2_posY , m_map.m_map2);
}
²âÊÔÔËÐÐÓÎÏ·£¬ÊµÏÖµØÍ¼¹ö¶¯
²½ÖèÈçÏ£º
·´´½¨Ó¢ÐÛÎļþºÍÀà
·Ìí¼Ó³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
·ÊµÏÖ³ÉÔ±º¯Êý
·´´½¨·É»ú¶ÔÏó²¢ÏÔʾ
·ÍÏ×§·É»ú
6.1 ´´½¨Ó¢ÐÛÎļþºÍÀà
´´½¨HeroPlaneÀàÒÔ¼°Éú³É¶ÔÓ¦µÄÎļþ
ºÍ´´½¨µØÍ¼µÄ²½ÖèÒ»Ñù£¬ÕâÀï¾Í²»ÔÚÏêϸ½ØÍ¼ÁË
´´½¨ºÃºóÉú³ÉHeroPlane.h ºÍ HeroPlane.cppÁ½¸öÎļþ

6.2 ·É»úµÄ³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
ÔÚHeroPlane.hÖÐÌí¼Ó´úÂë
class HeroPlane
{
public: HeroPlane();
//·¢Éä×Óµ¯
void shoot();
//ÉèÖ÷ɻúλÖÃ
void setPosition(int x, int y);
public:
//·É»ú×ÊÔ´ ¶ÔÏó
QPixmap m_Plane;
//·É»ú×ø±ê
int m_X;
int m_Y;
//·É»úµÄ¾ØÐα߿ò
QRect m_Rect;
};
6.3 ³ÉÔ±º¯ÊýʵÏÖ
ÕâÀï·É»úÓиö·¢Éä×Óµ¯µÄ³ÉÔ±º¯Êý£¬ÓÉÓÚÎÒÃÇ»¹Ã»ÓÐ×ö×Óµ¯
Òò´ËÕâ¸ö³ÉÔ±º¯ÊýÏÈд³É¿ÕʵÏÖ¼´¿É
ÔÚconfig.hÖÐ×·¼Ó·É»úÅäÖòÎÊý
/********** ·É»úÅäÖÃÊý¾Ý **********/
define HERO_PATH ":/res/hero2.png"
heroPlane.cppÖÐʵÏÖ³ÉÔ±º¯Êý´úÂ룺
#include "heroplane.h"
#include "config.h"
HeroPlane::HeroPlane()
{
//³õʼ»¯¼ÓÔØ·É»úͼƬ×ÊÔ´
mPlane.load(HEROPATH);
//³õʼ»¯×ø±ê
m_X = GAME_WIDTH * 0.5 - m_Plane.width()*0.5;
m_Y = GAME_HEIGHT - m_Plane.height();
//³õʼ»¯¾ØÐοò
m_Rect.setWidth(m_Plane.width());
m_Rect.setHeight(m_Plane.height());
m_Rect.moveTo(m_X,m_Y);
}
void HeroPlane::setPosition(int x, int y)
{
mX = x;
mY = y;
m_Rect.moveTo(mX,mY);
}
void HeroPlane::shoot()
{
}
6.4 ´´½¨·É»ú¶ÔÏó²¢ÏÔʾ
ÔÚMainScene.hÖÐ×·¼ÓеijÉÔ±ÊôÐÔ
//·É»ú¶ÔÏó
HeroPlane m_hero;
ÔÚMainScene.cppµÄpaintEventÖÐ×·¼Ó´úÂë
//»æÖÆÓ¢ÐÛ
painter.drawPixmap(m_hero.m_X,m_hero.m_Y,m_hero.m_Plane);
²âÊÔ·É»úÏÔʾµ½ÆÁÄ»ÖÐ

6.5 ÍÏ×§·É»ú
ÔÚMainScene.hÖÐÌí¼ÓÊó±êÒÆ¶¯Ê¼þ
//Êó±êÒÆ¶¯Ê¼þ
void mouseMoveEvent(QMouseEvent *event);
ÖØÐ´Êó±êÒÆ¶¯Ê¼þ
void MainScene::mouseMoveEvent(QMouseEvent event)
{
int x = event->x() - mhero.mRect.width()0.5; //Êó±êλÖà - ·É»ú¾ØÐεÄÒ»°ë
int y = event->y() - mhero.mRect.height()*0.5;
//±ß½ç¼ì²â
if(x <= 0 )
{
x = 0;
}
if(x >= GAME_WIDTH - m_hero.m_Rect.width())
{
x = GAME_WIDTH - m_hero.m_Rect.width();
}
if(y <= 0)
{
y = 0;
}
if(y >= GAME_HEIGHT - m_hero.m_Rect.height())
{
y = GAME_HEIGHT - m_hero.m_Rect.height();
}
m_hero.setPosition(x,y);
}
²âÊÔ·É»ú¿ÉÒÔÍÏ×§

ÖÆ×÷²½ÖèÈçÏ£º
·´´½¨×Óµ¯ÎļþºÍÀà
·Ìí¼Ó×Óµ¯ÀàÖеijÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
·ÊµÏÖ³ÉÔ±º¯Êý
·²âÊÔ×Óµ¯
7.1 ´´½¨×Óµ¯ÎļþºÍÀà
´´½¨BulletÀàÒÔ¼°Éú³É¶ÔÓ¦µÄÎļþ
´´½¨ºÃºóÉú³Ébullet.h ºÍ bullet.cppÁ½¸öÎļþ

7.2 ×Óµ¯µÄ³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
ÔÚBullet.hÖÐÌí¼Ó´úÂë
#ifndef BULLET_H
#define BULLET_H
#include "config.h"
#include<QPixamp>
class Bullet {
public: Bullet();
//¸üÐÂ×Óµ¯×ø±ê
void updatePosition();
public:
//×Óµ¯×ÊÔ´¶ÔÏó
QPixmap mBullet;
//×Óµ¯×ø±ê
int mX;
int mY;
//×Óµ¯Òƶ¯ËÙ¶È
int mSpeed;
//×Óµ¯ÊÇ·ñÏÐÖÃ
bool mFree;
//×Óµ¯µÄ¾ØÐα߿ò£¨ÓÃÓÚÅöײ¼ì²â£©
QRect mRect;
};
#endif // BULLET_H
7.3 ×Óµ¯Àà³ÉÔ±º¯ÊýʵÏÖ
ÔÚconfig.hÖÐ×·¼Ó×Óµ¯ÅäÖÃÐÅÏ¢
/********** ×Óµ¯ÅäÖÃÊý¾Ý **********/
#define BULLETPATH ":/res/bullet11.png" //×Óµ¯Í¼Æ¬Â·¾¶
#define BULLET_SPEED 5 //×Óµ¯Òƶ¯ËÙ¶È
ÔÚbullet.cppÖÐʵÏÖ³ÉÔ±º¯Êý£¬´úÂëÈçÏ£º
#include "bullet.h"
Bullet::Bullet() {
//¼ÓÔØ×Óµ¯×ÊÔ´
mBullet.load(BULLETPATH);
//×Óµ¯×ø±ê ³õÊ¼×ø±ê¿ÉËæÒâÉèÖ㬺óÆÚ»áÖØÖÃ
m_X = GAME_WIDTH*0.5 - m_Bullet.width()*0.5;
m_Y = GAME_HEIGHT;
//×Óµ¯×´Ì¬
m_Free = true;
//×Óµ¯ËÙ¶È
m_Speed = BULLET_SPEED;
//×Óµ¯¾ØÐοò
m_Rect.setWidth(m_Bullet.width());
m_Rect.setHeight(m_Bullet.height());
m_Rect.moveTo(m_X,m_Y);
} void Bullet::updatePosition() {
//Èç¹û×Óµ¯ÊÇ¿ÕÏÐ״̬£¬²»ÐèÒª×ø±ê¼ÆËã
//Íæ¼Ò·É»ú¿ÉÒÔ¿ØÖÆ×Óµ¯µÄ¿ÕÏÐ״̬Ϊfalse
if(m_Free) {
return;
}
//×Óµ¯ÏòÉÏÒÆ¶¯
m_Y -= m_Speed;
m_Rect.moveTo(m_X,m_Y);
if(m_Y <= -m_Rect.height());
{
m_Free = true;
}
}
7.4 ²âÊÔ×Óµ¯
×Óµ¯±¾ÉíÓ¦¸ÃÓÉ·É»ú·¢É䣬²âÊÔ½×¶ÎÎÒÃÇдһ¶Î¸¨Öú´úÂ룬¿´¿´Ð§¹û¼´¿É
²âÊÔ¹ýºó£¬ÕâЩ´úÂë¿ÉÒÔɾ³ýµô
ÔÚMainScene.hÖÐÌí¼Ó²âÊÔ´úÂë
//²âÊÔ×Óµ¯´úÂë
Bullet temp_bullet;
ÔÚMainScene.cppÖеÄupdatePositionÀïÌí¼Ó²âÊÔ´úÂë
//²âÊÔ×Óµ¯´úÂë
temp_bullet.m_Free = false;
temp_bullet.updatePosition();
ÔÚMainScene.cppÖеÄpaintEventÀïÌí¼Ó²âÊÔ´úÂë
//²âÊÔ×Óµ¯´úÂë
painter.drawPixmap(temp_bullet.m_X,temp_bullet.m_Y,temp_bullet.m_Bullet);
ÔËÐгÌÐò£¬´Ëʱ»áÓÐÒ»·¢×Óµ¯´ÓÆÁÄ»ÖÐÉä³ö

²âÊÔÍê±Ïºó£¬²âÊÔ´úÂëɾ³ý»ò×¢Êͼ´¿É
Íæ¼Ò·¢Éä×Óµ¯ÖÆ×÷²½ÖèÈçÏ£º
·Ó¢ÐÛ·É»úÌí¼ÓеijÉÔ±ÊôÐÔ
·ÊµÏÖ·¢Éä³ÉÔ±º¯Êý
·Ö÷³¡¾°¿ØÖÆ×Óµ¯·¢Éä
8.1 ·É»úÌí¼ÓгÉÔ±ÊôÐÔ
ÔÚconfig.hÖÐÌí¼ÓеÄÅäÖÃÊý¾Ý
#define BULLET_NUM 30 //µ¯Ï»ÖÐ×Óµ¯×ÜÊý
#define BULLET_INTERVAL 20 //·¢Éä×Óµ¯Ê±¼ä¼ä¸ô
ÔÚHeroPlane.hÖÐÐÂÔö³ÉÔ±ÊôÐÔÈçÏ£º
//µ¯Ï»
Bullet mbullets[BULLETNUM];
//·¢Éä¼ä¸ô¼Ç¼
int m_recorder;
8.2 ³ÉÔ±º¯Êý²¹³ä
ÔÚ¹¹Ô캯Êý HeroPlane Öгõʼ»¯·¢Éú¼ä¸ô¼Ç¼
//³õʼ»¯·¢Éä¼ä¸ô¼Ç¼
m_recorder = 0;
֮ǰÔÚÓ¢ÐÛ·É»úÀàÖÐÔ¤ÁôµÄÒ»¸öshootº¯ÊýÎÒÃǽøÐÐʵÏÖ£¬´úÂëÈçÏ£º
void HeroPlane::shoot() {
//ÀÛ¼Óʱ¼ä¼ä¸ô¼Ç¼±äÁ¿
mrecorder++;
//ÅжÏÈç¹û¼Ç¼Êý×Ö£¬Î´´ïµ½·¢Éä¼ä¸ô£¬Ö±½Ó
return if(mrecorder < BULLETINTERVAL) { return; }
//µ½´ï·¢Éäʱ¼ä´¦Àí
//ÖØÖ÷¢Éäʱ¼ä¼ä¸ô¼Ç¼
mrecorder = 0;
//·¢Éä×Óµ¯
for(int i = 0 ; i < BULLET_NUM;i++)
{
//Èç¹ûÊÇ¿ÕÏеÄ×Óµ¯½øÐз¢Éä
if(m_bullets[i].m_Free)
{
//½«¸Ä×Óµ¯¿ÕÏÐ״̬¸ÄΪ¼Ù
m_bullets[i].m_Free = false;
//ÉèÖ÷¢ÉäµÄ×Óµ¯×ø±ê
m_bullets[i].m_X = m_X + m_Rect.width()*0.5 - 10;
m_bullets[i].m_Y = m_Y - 25 ;
break;
}
}
}
8.3 Ö÷³¡¾°ÖÐʵÏÖ·¢Éä×Óµ¯
ÔÚMainScene.cppµÄupdatePosition³ÉÔ±º¯ÊýÖÐ×·¼ÓÈçÏ´úÂë
//·¢Éä×Óµ¯
m_hero.shoot();
//¼ÆËã×Óµ¯×ø±ê
for(int i = 0 ;i < BULLET_NUM;i++)
{
//Èç¹û×Óµ¯×´Ì¬Îª·Ç¿ÕÏУ¬¼ÆËã·¢ÉäλÖÃ
if(!m_hero.m_bullets[i].m_Free)
{
m_hero.m_bullets[i].updatePosition();
}
}
ÔÚMainScene.cppµÄpaintEvent³ÉÔ±º¯ÊýÖÐ×·¼ÓÈçÏ´úÂ룺
//»æÖÆ×Óµ¯
for(int i = 0 ;i < BULLET_NUM;i++)
{
//Èç¹û×Óµ¯×´Ì¬Îª·Ç¿ÕÏУ¬¼ÆËã·¢ÉäλÖÃ
if(!m_hero.m_bullets[i].m_Free)
{
painter.drawPixmap(m_hero.m_bullets[i].m_X,m_hero.m_bullets[i].m_Y,m_hero.m_bullets[i].m_Bullet);
}
}
²âÊÔÔËÐУ¬Íæ¼Ò¿ÉÒÔ·¢Éä×Óµ¯

µÐ»úÖÆ×÷Óë×Óµ¯ÖÆ×÷ÔÀíÀàËÆ£¬Ò²ÊÇÿ¸ôÒ»¶¨µÄʱ¼äÈõлú³ö³¡
ÖÆ×÷²½ÖèÈçÏ£º
·´´½¨µÐ»úÎļþºÍÀà
·Ìí¼ÓµÐ»úÀàÖеijÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
·ÊµÏÖ³ÉÔ±º¯Êý
·µÐ»ú³ö³¡
·²âÊԵлú
9.1 ´´½¨µÐ»úÎļþºÍÀà
´´½¨EnemyPlaneÀàÒÔ¼°Éú³É¶ÔÓ¦µÄÎļþ
´´½¨ºÃºóÉú³ÉenemyPlane.h ºÍ enemyPlane.cppÁ½¸öÎļþ
9.2 µÐ»ú³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
ÔÚenemyPlane.hÖÐÌí¼ÓÈçÏ´úÂ룺
#ifndef ENEMYPLANE_H
#define ENEMYPLANE_H
#include<QPixmap>
class EnemyPlane {
public:
EnemyPlane();
//¸üÐÂ×ø±ê
void updatePosition();
public:
//µÐ»ú×ÊÔ´¶ÔÏó
QPixmap m_enemy;
//λÖÃ
int m_X;
int m_Y;
//µÐ»úµÄ¾ØÐα߿ò£¨Åöײ¼ì²â£©
QRect m_Rect;
//״̬
bool m_Free;
//ËÙ¶È
int m_Speed;
};
#endif // ENEMYPLANE_H
9.3 µÐ»ú³ÉÔ±º¯ÊýʵÏÖ
ÔÚconfig.hÖÐ×·¼ÓµÐ»úÅäÖÃÐÅÏ¢
/********** µÐ»úÅäÖÃÊý¾Ý **********/
#define ENEMYPATH ":/res/img-plane5.png" //µÐ»ú×ÊԴͼƬ
#define ENEMY_SPEED 5 //µÐ»úÒÆ¶¯ËÙ¶È
#define ENEMY_NUM 20 //µÐ»ú×ÜÊýÁ¿
#define ENEMY_INTERVAL 30 //µÐ»ú³ö³¡Ê±¼ä¼ä¸ô
ÔÚenemyPlane.cppÖÐʵÏÖ³ÉÔ±º¯Êý£¬´úÂëÈçÏ£º
EnemyPlane::EnemyPlane()
{
//µÐ»ú×ÊÔ´¼ÓÔØ
menemy.load(ENEMYPATH);
//µÐ»úλÖÃ
m_X = 0;
m_Y = 0;
//µÐ»ú״̬
m_Free = true;
//µÐ»úËÙ¶È
m_Speed = ENEMY_SPEED;
//µÐ»ú¾ØÐÎ
m_Rect.setWidth(m_enemy.width());
m_Rect.setHeight(m_enemy.height());
m_Rect.moveTo(m_X,m_Y);
}
void EnemyPlane::updatePosition()
{
//¿ÕÏÐ״̬£¬²»¼ÆËã×ø±ê if(m_Free) { return; }
m_Y += m_Speed;
m_Rect.moveTo(m_X,m_Y);
if(m_Y >= GAME_HEIGHT + m_Rect.height())
{
m_Free = true;
}
}
9.4 µÐ»ú³ö³¡
ÔÚMainScene.hÖÐ×·¼ÓµÐ»ú³ö³¡µÄ³ÉÔ±º¯Êý
ÔÚMainScene.hÖÐ×·¼ÓµÐ»úÊý×é ºÍ µÐ»ú³ö³¡¼ä¸ô¼Ç¼ µÄ³ÉÔ±ÊôÐÔ
//µÐ»ú³ö³¡
void enemyToScene();
//µÐ»úÊý×é
EnemyPlane m_enemys[ENEMY_NUM];
//µÐ»ú³ö³¡¼ä¸ô¼Ç¼
int m_recorder;
³õʼ»¯¼ä¸ô¼Ç¼ÊôÐÔ,ÔÚMainScene.cppµÄ initScene ³ÉÔ±º¯ÊýÖÐ×·¼Ó
#m_recorder = 0;
ʵÏÖ³ÉÔ±º¯Êý enemyToScene
void MainScene::enemyToScene()
{
mrecorder++;
if(mrecorder < ENEMY_INTERVAL)
{
return;
}
m_recorder = 0;
for(int i = 0 ; i< ENEMY_NUM;i++)
{
if(m_enemys[i].m_Free)
{
//µÐ»ú¿ÕÏÐ״̬¸ÄΪfalse
m_enemys[i].m_Free = false;
//ÉèÖÃ×ø±ê
m_enemys[i].m_X = rand() % (GAME_WIDTH - m_enemys[i].m_Rect.width());
m_enemys[i].m_Y = -m_enemys[i].m_Rect.height();
break;
}
}
}
ÔÚPlayGame³ÉÔ±º¯ÊýµÄtimeoutÐźŷ¢ËÍʱºò£¬²Ûº¯ÊýÖÐÊ×ÏÈ×·¼Ó enemyToScene
//µÐ»ú³ö³¡
enemyToScene();

¸üелú×ø±ê£¬ÔÚupdatePosition³ÉÔ±º¯ÊýÖÐ×·¼Ó´úÂë
//µÐ»ú×ø±ê¼ÆËã
for(int i = 0 ; i< ENEMY_NUM;i++)
{
//·Ç¿ÕÏелú ¸üÐÂ×ø±ê
if(m_enemys[i].m_Free == false)
{
m_enemys[i].updatePosition();
}
}
»æÖƵлú£¬ÔÚpaintEvent³ÉÔ±º¯ÊýÖÐ×·¼Ó»æÖƵлú´úÂë
//»æÖƵлú
for(int i = 0 ; i< ENEMY_NUM;i++)
{
if(m_enemys[i].m_Free == false)
{
painter.drawPixmap(m_enemys[i].m_X,m_enemys[i].m_Y,m_enemys[i].m_enemy);
}
}
Ìí¼ÓËæ»úÊýÖÖ×Ó
ÔÚMainScene.cppÖÐ initScene ³ÉÔ±º¯ÊýÀïÌí¼ÓËæ»úÊýÖÖ×Ó
//Ëæ»úÊýÖÖ×Ó
srand((unsigned int)time(NULL));
//Í·Îļþ
#include <ctime>
ÔËÐвâÊԵлú³ö³¡Ð§¹û

ʵÏÖÅöײ¼ì²â²½ÖèÈçÏ£º
·Ìí¼Ó²¢ÊµÏÖÅöײ¼ì²â³ÉÔ±º¯Êý
·µ÷Óò¢²âÊÔº¯Êý
10.1 Ìí¼Ó²¢ÊµÏÖÅöײ¼ì²âº¯Êý
ÔÚMainScene.hÖÐÌí¼ÓеijÉÔ±º¯Êý
void collisionDetection();
ÔÚMainScene.cppÖÐʵÏָóÉÔ±º¯Êý
void MainScene::collisionDetection()
{
//±éÀúËùÓзǿÕÏеĵлú
for(int i = 0 ;i < ENEMYNUM;i++)
{
if(menemys[i].m_Free)
{
//¿ÕÏзɻú Ìø×ªÏÂÒ»´ÎÑ»·
continue;
}
//±éÀúËùÓÐ ·Ç¿ÕÏеÄ×Óµ¯
for(int j = 0 ; j < BULLET_NUM;j++)
{
if(m_hero.m_bullets[j].m_Free)
{
//¿ÕÏÐ×Óµ¯ Ìø×ªÏÂÒ»´ÎÑ»·
continue;
}
//Èç¹û×Óµ¯¾ØÐοòºÍµÐ»ú¾ØÐοòÏཻ£¬·¢ÉúÅöײ£¬Í¬Ê±±äΪ¿ÕÏÐ״̬¼´¿É
if(m_enemys[i].m_Rect.intersects(m_hero.m_bullets[j].m_Rect))
{
m_enemys[i].m_Free = true;
m_hero.m_bullets[j].m_Free = true;
}
}
}
}
10.2 µ÷Óò¢²âÊÔº¯Êý
ÔÚMainScene.cppÖÐ playGame³ÉÔ±º¯ÊýÀ׷¼ÓÅöײ¼ì²â´úÂë

ÔËÐв鿴Ч¹û£¬×Óµ¯ºÍµÐ»úÅöײºó»áͬʱÏûʧ
±¬Õ¨Ð§¹û¹¦ÄÜʵÏÖ²½ÖèÈçÏ£º
·´´½¨±¬Õ¨ÎļþºÍÀà
·Ìí¼Ó±¬Õ¨ÀàÖеijÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
·ÊµÏÖ³ÉÔ±º¯Êý
·µ÷Óò¢²âÊÔЧ¹û
11.1 ´´½¨±¬Õ¨ÎļþºÍÀà
´´½¨BombÀàÒÔ¼°Éú³É¶ÔÓ¦µÄÎļþ
´´½¨ºÃºóÉú³Ébomb.h ºÍ bomb.cppÁ½¸öÎļþ

11.2 ±¬Õ¨³ÉÔ±º¯ÊýºÍ³ÉÔ±ÊôÐÔ
ÔÚconfig.hÖмÓÈ뱬ըÅäÖÃÊý¾Ý
define BOMB_PATH ":/res/bomb-%1.png" //±¬Õ¨×ÊԴͼƬ
define BOMB_NUM 20 //±¬Õ¨ÊýÁ¿
define BOMB_MAX 7 //±¬Õ¨Í¼Æ¬×î´óË÷Òý
define BOMB_INTERVAL 20 //±¬Õ¨ÇÐͼʱ¼ä¼ä¸ô
ÔÚbomb.hÖÐÌí¼ÓÈçÏ´úÂ룺
#ifndef BOMB_H
#define BOMB_H
#include "config.h"
#include <QPixmap>
#include <QVector>
class Bomb
{
public:
Bomb();
//¸üÐÂÐÅÏ¢£¨²¥·ÅͼƬϱꡢ²¥·Å¼ä¸ô£©
void updateInfo();
public:
//·Å±¬Õ¨×ÊÔ´Êý×é
QVector<QPixmap> m_pixArr;
//±¬Õ¨Î»ÖÃ
int m_X;
int m_Y;
//±¬Õ¨×´Ì¬
bool m_Free;
//±¬Õ¨ÇÐͼµÄʱ¼ä¼ä¸ô
int m_Recoder;
//±¬Õ¨Ê±¼ÓÔØµÄͼƬϱê
int m_index;
};
#endif // BOMB_H
11.3 ʵÏÖ³ÉÔ±º¯Êý
Bomb::Bomb()
{
//³õʼ»¯±¬Õ¨Í¼Æ¬Êý×é
for(int i = 1 ;i <= BOMBMAX ;i++)
{
//×Ö·û´®Æ´½Ó£¬ÀàËÆ ":/res/bomb-1.png"
QString str = QString(BOMBPATH).arg(i);
mpixArr.pushback(QPixmap(str));
}
//³õʼ»¯×ø±ê
m_X = 0;
m_Y = 0;
//³õʼ»¯¿ÕÏÐ״̬
m_Free = true;
//µ±Ç°²¥·ÅͼƬϱê
m_index = 0;
//±¬Õ¨¼ä¸ô¼Ç¼
m_Recoder = 0;
}
void Bomb::updateInfo()
{
//¿ÕÏÐ״̬
if(m_Free) { return;
}
m_Recoder++;
if(m_Recoder < BOMB_INTERVAL)
{
//¼Ç¼±¬Õ¨¼ä¸ôδµ½£¬Ö±½Óreturn£¬²»ÐèÒªÇÐͼ
return;
}
//ÖØÖüǼ
m_Recoder = 0;
//Çл»±¬Õ¨²¥·ÅͼƬ
m_index++;
//×¢£ºÊý×éÖеÄϱê´Ó0¿ªÊ¼£¬×î´óÊÇ6
//Èç¹û¼ÆËãµÄϱê´óÓÚ6£¬ÖØÖÃΪ0
if(m_index > BOMB_MAX-1)
{
m_index = 0;
m_Free = true;
}
}
11.4 ¼ÓÈ뱬ըÊý×é
ÔÚMainScene.hÖмÓÈ뱬ըÊý×é ³ÉÔ±ÊôÐÔ
//±¬Õ¨Êý×é
Bomb m_bombs[BOMB_NUM];
ÔÚÅöײ¼ì²â³ÉÔ±º¯ÊýÖУ¬µ±·¢ÉúÅöײʱ£¬ÉèÖñ¬Õ¨¶ÔÏóµÄÐÅÏ¢
//²¥·Å±¬Õ¨Ð§¹û
for(int k = 0 ; k < BOMBNUM;k++) { if(mbombs[k].m_Free) { //±¬Õ¨×´Ì¬ÉèÖÃΪ·Ç¿ÕÏÐ mbombs[k].mFree = false; //¸üÐÂ×ø±ê
m_bombs[k].m_X = m_enemys[i].m_X;
m_bombs[k].m_Y = m_enemys[i].m_Y;
break;
}
}
ÔÚ MainScene.cppµÄupdatePositionÖÐ×·¼Ó´úÂë
//¼ÆË㱬ը²¥·ÅµÄͼƬ
for(int i = 0 ; i < BOMB_NUM;i++)
{
if(m_bombs[i].m_Free == false)
{
m_bombs[i].updateInfo();
}
}
ÔÚ MainScene.cppµÄpaintEvent ÖÐ×·¼Ó»æÖƱ¬Õ¨´úÂë
//»æÖƱ¬Õ¨Í¼Æ¬
for(int i = 0 ; i < BOMB_NUM;i++)
{
if(m_bombs[i].m_Free == false)
{ painter.drawPixmap(m_bombs[i].m_X,m_bombs[i].m_Y,m_bombs[i].m_pixArr[m_bombs[i].m_index]);
}
}
²âÊÔ£¬ÊµÏÖ±¬Õ¨Ð§¹û

ÒôЧÌí¼Ó²½ÖèÈçÏ£º
·Ìí¼Ó¶àýÌåÄ£¿é
·²¥·ÅÒôЧ
12.1 Ìí¼Ó¶àýÌåÄ£¿é
ÔÚ¹¤³ÌÎļþplaneWar.pro ÖÐÐ޸ĴúÂë
QT += core gui multimedia
12.2 ²¥·ÅÒôЧ
ÔÚconfig.hÖÐ Ìí¼ÓÒôЧµÄÅäÖ÷¾¶
#define SOUND_BACKGROUND ":/res/bg.wav"
#define SOUND_BOMB ":/res/bomb.wav"
×¢£º QSoundʹÓÃʱºòÒª°üº¬Í·Îļþ #include<QSound>
ÔÚPlayGameÖÐÌí¼Ó±³¾°ÒôÀÖ
//Æô¶¯±³¾°ÒôÀÖ
QSound::play(SOUND_BACKGROUND);
ÔÚ±¬Õ¨Ê±ºòÌí¼Ó±¬Õ¨ÒôЧ
//²¥·ÅÒôЧ
QSound::play(SOUND_BOMB);
²âÊÔÒôЧ
1¡¢È·¶¨»·¾³±äÁ¿ÅäÖúà PATH: C:\Qt\Qt5.x.x\5.x.x\mingw53_32\bin
2¡¢ÔÚQTÖаÑÔËÐÐģʽÇл»³É release ģʽ£¬ ±àÒë¡£ ÔÚÍâ²ãĿ¼ÖлáÓÐ release °æ±¾µÄĿ¼.
3¡¢½«Ä¿Â¼ÖÐµÄ rcc ¶þ½øÖÆ×ÊÔ´Îļþ¡¢¿ÉÖ´ÐгÌÐòÎļþ(.exe) ¿½±´µ½ÁíÍâÒ»¸öµ¥¶ÀµÄÎļþ¼ÐÖÐ.
4¡¢½øÈë cmd ÃüÁîģʽ£¬Çл»µ½¿ÉÖ´ÐгÌÐòËùÔÚµÄĿ¼. Ö´ÐÐÒÔÏÂÃüÁ½«¿ÉÖ´ÐгÌÐòËùÐèµÄ¿âÎļþ¿½±´µ½µ±Ç°Ä¿Â¼:
windeployqt PlaneWar.exe
5¡¢¶îÍâ¿ÉÒÔ½« ico ͼ±êÒ²¿½±´µ½µ±Ç°¿ÉÖ´ÐгÌÐòËùÔÚµÄĿ¼¡£
6¡¢Æô¶¯ HM NIS EDIT Èí¼þ£¬ÔÚÈí¼þÖÐÑ¡Ôñ: Îļþ->н¨½Å±¾Ïòµ¼£¬ ½ÓÏÂÀ´¸ú×ÅÏòµ¼²Ù×÷.
7¡¢ÎªÁËÈð²×°°ü°²×°Èí¼þÒ²Óпì½Ý·½Ê½Í¼±ê£¬ÔÚÉú³ÉµÄ½Å±¾Àï¡£½øÐÐÐ޸ģº
CreateShortCut "$DESKTOP\·É»ú´óÕ½.lnk" "$INSTDIR\PlaneWar.exe"
CreateShortCut "$DESKTOP\·É»ú´óÕ½.lnk" "$INSTDIR\PlaneWar.exe" "" "$INSTDIR\app.ico"
8¡¢µã»÷²Ëµ¥À¸µÄ NSIS £¬È»ºóÑ¡Ôñ±àÒ룬ÔÚ×ÀÃæÉú³É°²×°°ü¡£
±±¾©Ð£Çø