C++(qt)ゲーム実戦種目:戦車大戦(三)


前は地図の表示を実現したが、地図は単一で、今回は地図の編集、保存、ロードを実現した.地図クラスGamemapに次のメンバー関数gamemapを追加します.h
    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;