C++(qt)ゲーム実戦種目:戦車大戦(三)
前は地図の表示を実現したが、地図は単一で、今回は地図の編集、保存、ロードを実現した.地図クラスGamemapに次のメンバー関数gamemapを追加します.h
gamemap.cpp
関数の準備ができました.インタラクションを完了します.
mainwindow.h
mainwindow.cpp
グローバル変数の管理を容易にするためにmain.hに追加
メールでcppに追加
int switchstyle(int i,int j);// cells[i][j]
void setstyle(int i,int j,int style);// cells[i][j]
void deletecell(int i,int j);// cells[i][j]
//save map
void savemap(const char *str);//
//load map
void loadmap(const char *str);//
void cal(int x,int y,int &i,int &j);//
gamemap.cpp
#include "gamemap.h"
GameMap::GameMap()
{
for(int i=0;ifor(int j=0;j//for(int i=0;i
// for(int j=0;j
//cells[i][j]=new Mapcell(i,j,0);
loadmap("1.dat");
}
GameMap::~GameMap(){
for(int i=0;ifor (int j=0;jif(cells[i][j])
{delete cells[i][j] ;cells[i][j]=NULL;}
}
void GameMap::Display(QPainter &paint){
paint.drawImage(QRect(0,0,WIDTH,HEIGHT),QImage(":/images/background.bmp"));
for(int i=0;ifor(int j=0;jif(cells[i][j]!=NULL)
cells[i][j]->Display(paint);
}
}
int GameMap::switchstyle(int i,int j){
int tmpstyle=0;
if(i>=INUM||j>=JNUM)
{qDebug(" ");return 0;}
if(cells[i][j])
tmpstyle=cells[i][j]->switchstyle();
else{
cells[i][j]=new Mapcell(i,j,0);
tmpstyle=0;
}
return tmpstyle;
}
void GameMap::cal(int x,int y,int &i,int &j){//
j=x/CELLWIDTH;
i=y/CELLHEIGHT;
}
void GameMap::setstyle(int i, int j, int style){
if(i>=INUM||j>=JNUM)
{qDebug(" ");return ;}
if(cells[i][j])
cells[i][j]->setstyle(style);
else{
cells[i][j]=new Mapcell(i,j,style);
}
}
void GameMap::deletecell(int i, int j){
if(i>=INUM||j>=JNUM)
{qDebug(" ");return;}
delete cells[i][j];
cells[i][j]=NULL;
}
void GameMap::savemap(const char *str){
//erjinzhi
std::ofstream ou(str);
for(int i=0;ifor(int j=0;jif(cells[i][j])
ou.write((char*)cells[i][j],sizeof(Mapcell));
ou.close();
}
void GameMap::loadmap(const char *str){
for(int i=0;ifor(int j=0;jif(cells[i][j])
{delete cells[i][j] ;cells[i][j]=NULL;}
//
Mapcell cellst;
std::ifstream in(str);
int i=0,j=0;
while(in.read((char*)&cellst,sizeof(Mapcell)))
{ j=cellst.getpos().x()/CELLWIDTH;
i=cellst.getpos().y()/CELLHEIGHT;
if(cells[i][j])
*cells[i][j]=cellst;
else
{
cells[i][j]=new Mapcell(i,j);
*cells[i][j]=cellst;//moren de gou zao hanshu
}
}
in.close();
}
関数の準備ができました.インタラクションを完了します.
mainwindow.h
//
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include"main.h"
#include "gamemap.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
enum Gamestatus{mapedit=520,gameing,pause};//
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void timefun();
private:
int leftorright;//
int laststyle;//
void setgame(Gamestatus status){gamestatus=status;}//
Gamestatus gamestatus;
QPainter paint;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include"QRect"
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{ //
setWindowTitle("by phoenix");
//
glo.framei=0;
glo.blockimage=new QImage(":/images/map_block.png");
gamestatus=gameing;
laststyle=0;
leftorright=1;
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
setFixedSize(WIDTH,HEIGHT);
paint.begin(this);
glo.gamemap->Display(paint);
paint.end();
}
void MainWindow::keyPressEvent(QKeyEvent *event){
qDebug("key:--------------------------%d ",event->key());
// M mapedit
if(event->key()==Qt::Key_M)
{
gamestatus=mapedit;
}else if(event->key()==Qt::Key_G){
gamestatus=gameing;
}
if(gamestatus==mapedit){
if(event->key()==Qt::Key_S)
{
glo.gamemap->savemap("1.dat");
}
else if(event->key()==Qt::Key_L)
{
glo.gamemap->loadmap("1.dat");
}
}else if(gamestatus==gameing){
}
update();
}
void MainWindow::keyReleaseEvent(QKeyEvent *event){
}
// , , 。 :setMouseTracking(true);
void MainWindow::mouseMoveEvent(QMouseEvent *event){
if(gamestatus==mapedit){
int i,j;//
glo.gamemap->cal(event->x(),event->y(),i,j);
if(leftorright==1){//
glo.gamemap->setstyle(i,j,laststyle);
}
else{
glo.gamemap->deletecell(i,j);
}
}//if(gamestatus==mapedit) end
update();
}
void MainWindow::mousePressEvent(QMouseEvent *event){
int i,j;//
if(gamestatus==mapedit){
glo.gamemap->cal(event->x(),event->y(),i,j);
if(event->button()==Qt::LeftButton){
//qDebug("i %d",i);
//qDebug("j %d",j);
leftorright=1;
laststyle=glo.gamemap->switchstyle(i,j);
}
else{
glo.gamemap->deletecell(i,j);
leftorright=2;
}
}//if(gamestatus==mapedit) end
update();
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event){
//update();
}
グローバル変数の管理を容易にするためにmain.hに追加
class QImage;
class GameMap;
typedef struct{
unsigned int framei;
QImage *blockimage;
GameMap *gamemap;
}Glo;// Glo , , daxiao 。
extern Glo glo;//
メールでcppに追加
Glo glo;