C++(qt)遊戲實戰專案:坦克大戰(四)
螢幕上光有地圖也不行,還需要我們的坦克加入其中
新建tank.h和tank.cpp
tank.h里加入
#ifndef TANK_H
#define TANK_H
#include"wanwu.h"
#include"main.h"
#include"gamemap.h"
class Tank : public Wanwu
{
protected:
int steps[8]={4,8,8,16,16,32,32,64};
float lifes[8]={200,400,600,800,900,1100,1300,1500};
float wulis[8]={20,40,80,160,160,320,320,640 };
float fashus[8]={20,40,80,160,160,320,320,640};
float hujias[8]={50,70,90,110,130,150,170,190};
float mokangs[8]={50,70,90,110,130,150,170,190};
int gongjijianges[8]={8,7,6,5,4,3,2,2};
int group;//坦克所在組,同一組不能相互傷害
public:
Tank();
Tank(int iIndex,int jIndex,Dir dir=UP,int style=0,int group=1);
// 計算勢力範圍
virtual void CalculateSphere();
// 繪圖
void Display(QPainter &paint);
// 移動
void Move();
//設定移動狀態為開
void startmove(){ismove=true;}
//設定移動狀態為關
void stopmove(){ismove=false;}
//
// void fire();
//void startfire();
//void stopfire();
//設定方向
void setdir(Dir dir){m_dir=dir;}
private :
int style;
bool ismove;
// bool isfire;
int gongjijiange;
};
#endif // TANK_H
tank.cpp
#include "tank.h"
Tank::Tank()
{
this->m_pos.setX(10*CELLWIDTH+CELLWIDTH/2);
this->m_pos.setY(8*CELLHEIGHT+CELLHEIGHT/2);
this->wuli=200;
this->group=0;//0玩家組,1敵人組
m_step=16;
gongjijiange=3;
this->style=0;
ismove=false;
m_dir=UP;
//isfire=false;
m_bDisappear=false;
life=1000;
CalculateSphere();//計算實力範圍
}
Tank::Tank(int iIndex,int jIndex,Dir dir,int style,int group){
this->m_pos.setX(jIndex*CELLWIDTH+CELLWIDTH/2);
this->m_pos.setY(iIndex*CELLHEIGHT+CELLHEIGHT/2);
this->m_dir=dir;z
this->style=style;
this->group=group;
//isfire=false;
wuli=wulis[style];
fashu=fashus[style];
hujia=hujias[style];
mokang=mokangs[style];
m_step=steps[style];
gongjijiange=gongjijianges[style];
m_bDisappear=false;
life=lifes[style];
CalculateSphere();
}
void Tank::Display(QPainter &paint){
QRect xm_rectSphere=m_rectSphere;
if(m_bDisappear)return;//消失的不畫
switch(m_dir){
case UP:
paint.drawImage(m_rectSphere,*glo.tankimage,QRect(2*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身體
paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(2*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
break;
case DOWN:
paint.drawImage(m_rectSphere,*glo.tankimage,QRect(0*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身體
paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(0*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
break;
case LEFT:
paint.drawImage(m_rectSphere,*glo.tankimage,QRect(1*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身體
paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(1*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
break;
case RIGHT:
paint.drawImage(m_rectSphere,*glo.tankimage,QRect(3*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身體
paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(3*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
break;
}
}//此段程式碼可以優化簡潔
void Tank::Move()
{
if(ismove==true){
switch(m_dir){
case UP:
m_pos.setY(m_pos.y()-m_step);
break;
case DOWN:
m_pos.setY(m_pos.y()+m_step);
break;
case LEFT:
m_pos.setX(m_pos.x()-m_step);
break;
case RIGHT:
m_pos.setX(m_pos.x()+m_step);
break;
}
CalculateSphere();
qDebug("move on");
}
qDebug("move off");
}
void Tank::CalculateSphere(){
this->m_rectSphere.setRect(m_pos.x()-TANKWIDTH/2,m_pos.y()-TANKHEIGHT/2,TANKWIDTH,TANKHEIGHT);
}
main.h結構體Glo中加入選項Tank *player.
class QImage;
class GameMap;
class Tank;
typedef struct{
unsigned int framei;
QImage *blockimage;
GameMap *gamemap;
Tank *player;
}Glo;//實列化Glo型別變數,能實列化出來,所有的指標變數所佔空間daxiao一樣。
mainwindow.h里加入
#include"tank.h"
mainwindow.cpp建構函式里加入
glo.player=new Tank();
mainwindow.cpp paintEvent函式變更如下
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
setFixedSize(WIDTH,HEIGHT);
paint.begin(this);
glo.gamemap->Display(paint);
glo.player->Display(paint);
paint.end();
}
mainwindow.cpp keyPressEvent變更如下
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){
if(event->key()==Qt::Key_S)
{
glo.player->setdir(DOWN);glo.player->startmove();
}
else if(event->key()==Qt::Key_A)
{
glo.player->setdir(LEFT);glo.player->startmove();
}
else if(event->key()==Qt::Key_W)
{
glo.player->setdir(UP);glo.player->startmove();
}
else if(event->key()==Qt::Key_D)
{
glo.player->setdir(RIGHT);glo.player->startmove();
}else if(event->key()==Qt::Key_J){
glo.player->startfire();
}
}
update();
}
到此你將有了一個可以移動穿牆的tank,還可以移動到遊戲外界
相關推薦
C++(qt)遊戲實戰專案:坦克大戰(四)
螢幕上光有地圖也不行,還需要我們的坦克加入其中 新建tank.h和tank.cpp tank.h里加入 #ifndef TANK_H #define TANK_H #include"wanwu.h" #include"main.h" #include"
JAVA練手專案(三):坦克大戰遊戲原始碼
經過幾天的練習和研究終於自己能寫出坦克大戰遊戲了,寫完這個程式後感覺收穫了很多東西,對JAVA的知識又有了一定的增長,接下來還準備繼續寫幾個小專案來練習J2SE 由於程式碼太長就不發在部落格裡了,我上傳到了資源下載裡,有需要的朋友大家可以去下載
C++練習例項———控制檯程式碼實現坦克大戰小遊戲
坦克大戰是一款經典的遊戲,今天我來介紹一個在vs中僅用控制檯程式碼實現的坦克大戰小遊戲,在很多學校裡作為一個面對物件程式設計的大作業,對於學習C++的多型性很有幫助。程式的架構思路由老師提供,遊戲中用到了EasyX圖形庫,這個庫非常小巧輕便,下載地址:https://
HTML5遊戲開發(五):飛機大戰之讓所有元素動起來
《HTML5遊戲開發》系列文章的目的有:一、以最小的成本去入門egret小專案開發,官方的教程一直都是面向中重型;二、egret可以非常輕量;三、egret相比PIXI.js和spritejs文件更成熟、友好;四、學習從0打造高效的開發工作流。 HTML5遊戲開發(一):3分鐘建立一個hello wo
cocos2d x遊戲開發系列教程 坦克大戰遊戲之子彈的碰撞檢測處理
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
cocos2d x遊戲開發系列教程 坦克大戰遊戲之虛擬手柄控制坦克移動
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
cocos2d x遊戲開發系列教程 坦克大戰遊戲之坦克和地圖碰撞的檢測上
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
cocos2d x遊戲開發系列教程 坦克大戰遊戲之敵方坦克AI的編寫
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++網路程式設計實戰專案--Sinetlib網路庫(3)——事件迴圈與跨執行緒呼叫
上一篇文章講了Reactor模式的關鍵結構I/O複用和事件分發,現在我們來關注一下它們的使用。 事件迴圈 我們已經實現了一個Epoller類來實現I/O複用,具體的使用方法就是Epoller::Poll()函式等待事件的發生,該函式有一個超時時間,超過這個時間即
Unity遊戲開發教程:飛機大戰(一)
Unity版本:Unity 2018.2.14f1 新建專案 File -> New project -> 輸入Project name -> Preate project 匯入飛
Node.js+MySQL+Vue 的全棧實戰專案:星辰筆記
本場 Chat 是一個基於 Node.js 的全棧是實戰專案,目標就是帶領讀者朋友上手實戰。眾所周知全棧工程師是要比純前端有發展前景的,非常希望本篇文章能給朋友們帶來一些收穫。 該實戰專案主要有首頁、登陸、註冊、筆記分類,筆記列表,筆記詳情,釋出筆記和個人主頁八個部分。專案雖小,五臟俱全,設計的知
Android快樂貪吃蛇遊戲實戰專案開發教程-01專案概述與目錄
一、專案簡介 貪吃蛇是一個很經典的遊戲,也很適合用來學習。本教程將和大家一起做一個Android版的貪吃蛇遊戲。 這裡上兩張截圖有個大概的瞭解:怎麼玩大家應該都知道,不過我還是想多提一下。通過螢幕上的方向鍵控制蛇的前進方向。蛇每吃到一個食物身體會增長一個點,同時前進的速度也會加快。當蛇的頭部撞到四
Android快樂貪吃蛇遊戲實戰專案開發教程-05虛擬方向鍵(四)四個三角形按鈕
package net.chengyujia.happysnake; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.gr
Android快樂貪吃蛇遊戲實戰專案開發教程-02虛擬方向鍵(一)自定義控制元件概述
一、自定義控制元件簡介 在本專案中,無論是遊戲主區域還是虛擬方向鍵都是通過自定義控制元件來實現的,我們有必要先對自定義控制元件有個簡單的瞭解。而且通過自定義控制元件的學習能更好的理解系統自帶控制元件的內部機制。 什麼是自定義控制元件呢? 我們平時用的控制元件(比如Button、TextVie
Android快樂貪吃蛇遊戲實戰專案開發教程-04虛擬方向鍵(三)三角形按鈕效果
一、知識點講解 當我們點選系統自帶的按鈕時,按鈕的外觀會發生變化。上篇博文中我們畫了一個三角形按鈕,但點選還不能變色,下面我們就來實現點選變色功能。從知識體系上我們需要了解以下兩個知識點 1.如何知道手指點選了我們的控制元件? 辦法是重寫View中的onTouchEvent方
Android快樂貪吃蛇遊戲實戰專案開發教程-06虛擬方向鍵(五)繪製方向鍵箭頭
package net.chengyujia.happysnake; import android.content.Context; import android.graphics.Canvas; import android.graphics.Matrix; import android.g
Android快樂貪吃蛇遊戲實戰專案開發教程-03虛擬方向鍵(二)繪製一個三角形
一、繪製三角形 在上一篇文章中,我們已經新建了虛擬方向鍵的自定義控制元件DirectionKeys類,下面我們繼續。 本專案中的虛擬方向鍵的背景是4個三角形組成的矩形,其實是4個三角形的按鈕。 系統自帶的按鈕是矩形的,怎麼做一個三角形按鈕呢? 首先我需要了解,所有控制元件的外觀都是畫出來的,當然不
成為C++高手之實戰專案
在記憶體中模擬出一副牌,然後模擬洗牌,發牌等動作。 流程是這樣的:構建一副牌儲存到一個數組中—洗牌—建立玩家—向玩家發牌–輸出每個玩家的牌。 #include <stdio.h> #include <stdlib.h> #includ
Python實戰專案:詳解銀行使用者流失預測
專案介紹 這次我們要學習的是銀行使用者流失預測專案,首先先來看看資料,資料分別存放在兩個檔案中,’Churn-Modelling.csv’裡面是訓練資料,’Churn-Modelling-Test-Data.csv’裡面是測試資料。下面是資料內容: 資料來源於國外匿名化處理後的真實
Hadoop實戰專案:小檔案合併
public class MergeSmallFilesToHDFS { private static FileSystem hdfs = null; //定義HDFS上的檔案系統物件 private static FileSystem local = null; //定義本地檔案系統物件