C++ 學習之旅三 我和超級瑪麗有個約會

來源:互聯網
上載者:User

首先,我說說對C++的最直觀的感受吧!熟悉了.net 智能提示,開始一開始發現C++根本沒有提示了。後來google了一下,下載了一個visual assist 這個外掛程式,比vs自動提示強多了。 然後,就是習慣了在.net中,把所有的聲明和方法實現寫在同一檔案中。可是C++不是這麼回事。 他一個聲明在標頭檔中,實現 在源檔案中,說實在話,一開始並怎麼習慣。後來漸漸就習慣了。然後,寫C++的檔案就是真他媽的痛苦,他不比.net,微軟已經比你封裝好了,在C++中,好多東西需要自己寫。 首先,一個解構函式,需要自己釋放資源。而.net有一個gc自動進行記憶體回收,資源釋不釋放,關你鳥事。沒辦法,只有自己釋放.做一個遵守規則的好程式員。這是我對C++最直觀感受。
言歸正卷,說一說這個超級瑪麗的遊戲。 先看看,我對遊戲的類結構的分類,如果有不妥的地方,懇請大家指正。

從階層來看,分成這幾個層①映像層,②邏輯層,③結構和表。

映像層包括①映像基類MYBITMAP,②遊戲背景MYBKSKYàMYBITMAP,③遊戲圖片MYANIOBJàMYBITMAP,④魔法攻擊MYANIMAGICàMYBITMA.
邏輯層包括①遊戲邏輯GAMEMAP,②時鐘處理MYCLOCK,③字型處理MYFONT,④跟蹤列印FILEREPORT,⑥玩家控制MYROLEàMYBITMAP。
結構和表包括①精靈結構ROLE,②物品結構MapObject,③地圖資訊表MAPINFO。
那每個類的結構又是那麼樣子的,是騾子還是馬拉出來溜溜。我們在往下看一看。
映像層的結構就這樣簡單,邏輯層只需要確定“哪個映像,哪一幀”這兩個參數,就能在螢幕上繪製出所有圖片。
說一說一個圖片的基類。他的原始碼的架構又是這個樣子的。
今天先講最基礎的映像類 MYBITMAP:
成員函數功能列表:

複製代碼 代碼如下://功能 根據一個位元影像檔案,初始化映像
//入參 應用程式執行個體控制代碼 資源ID 橫向位元影像個數 縱向位元影像個數
void Init(HINSTANCE hInstance,int iResource,int row,int col);
//功能 設定環境資訊
//入參 目的DC(要繪製映像的DC),臨時DC,要繪製地區的寬 高
void SetDevice(HDC hdest,HDC hsrc,int wwin,int hwin);--媽的,C++中畫圖需要一個hdc,裝置上下文需要是一種包含有關某個裝置(如顯示器或印表機)的繪製屬性資訊的 Windows 資料結構。所有繪製調用都通過裝置上下文對象進行,這些對象封裝了用於繪製線條、形狀和文本的 Windows API。裝置上下文允許在 Windows 中進行與裝置無關的繪製。裝置上下文可用於繪製到螢幕、印表機或者圖元檔案。.net不需要了這個 內容物件,他有了一個.netframework 就不需要這個屁玩意了。
//功能 設定圖片位置1
//入參 設定方法 橫縱座標
void SetPos(int istyle,int x,int y);
//功能 圖片顯示
//入參 圖片顯示方式
void Draw(DWORD dwRop);
//功能 圖片縮放顯示
//入參 橫縱方向縮放比例
void Stretch(int x,int y);
//功能 圖片縮放顯示
//入參 橫縱方向縮放比例 縮放映像ID(縱向第幾個)
void Stretch(int x,int y,int id);
//功能 在指定位置顯示圖片
//入參 橫縱座標
void Show(int x,int y);
//功能 橫向置中顯示圖片
//入參 縱座標
void ShowCenter(int y);
//功能 將某個圖片平鋪在一個地區內
//入參 左上右下邊界的座標 圖片ID(橫向第幾個)
void ShowLoop(int left,int top,int right,int bottom,int iframe);
//功能 不規則圖片顯示
//入參 橫縱座標 圖片ID(橫向第幾個)
void ShowNoBack(int x,int y,int iFrame);
//功能 不規則圖片橫向平鋪
//入參 橫縱座標 圖片ID(橫向第幾個) 平鋪個數
void ShowNoBackLoop(int x,int y,int iFrame,int iNum);
//動畫播放
//功能 自動播放該圖片的所有幀,函數沒有實現,但以後肯定要用:)
//入參 無
void ShowAni();
//功能 設定動畫座標
//入參 橫縱座標
void SetAni(int x,int y);
成員資料
//跟蹤列印類
// FILEREPORT f;
//映像控制代碼
HBITMAP hBm;
//按照行列平均分成幾個
int inum;
int jnum;
//按行列分割後,每個圖片的寬高(顯然各個圖片大小一致,派生後,這裡的寬高已沒有使用意義)
int width;
int height;
//螢幕寬高
int screenwidth;
int screenheight;
//要繪製圖片的dc
HDC hdcdest;
//用來選擇圖片的臨時dc
HDC hdcsrc;
//當前位置
int xpos;
int ypos;
//是否處於動畫播放中(功能沒有實現)
int iStartAni;

這個基類的部分函數和變數,在這個遊戲中沒有使用,是從前幾個遊戲中保留下來的,所以看起來有些零亂.這個遊戲的主要映像功能,由它的衍生類別完成.由於基類封裝了物理層資訊(dc和控制代碼),衍生類別的編寫就容易一些,可以讓我專註於邏輯含義.
基類的函數實現上,很簡單,主要是以下幾點:
1.圖片初始化:複製代碼 代碼如下://根據程式執行個體控制代碼,位元影像檔案的資源ID,匯入該位元影像,得到位元影像控制代碼
hBm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResource));
//擷取該位元影像檔案的相關資訊
GetObject(hBm,sizeof(BITMAP),&bm);
//根據橫縱方向的圖片個數,計算出每個圖片的寬高(對於超級瑪麗,寬高資訊由衍生類別處理)
width=bm.bmWidth/inum;
height=bm.bmHeight/jnum;

下面再來說一說 遊戲背景 類MYBKSKY
類說明:這是一個專門處理遊戲背景的類。在橫版遊戲或射擊遊戲中,都有一個背景畫面,如山、天空、雲、星空等等。這些圖片一般只有1到2倍螢幕寬度,然後像一個捲軸一樣迴圈移動,連成一片,感覺上像一張很長的圖片。這個類就是專門處理這個背景的。在超級瑪麗增強版中,主要關卡是3關,各有一張背景圖片;從水管進去,有兩關,都用一張全黑圖片。共四張圖。這四張圖大小一致,縱向排列在一個位元影像檔案中。MYBKSKY這個類,派生於MYBITMAP。由於背景圖片只需要完成迴圈移動的效果,只需要實現一個功能,而無需關心其他任何問題(例如控制代碼、dc)。編碼起來很簡單,再次反映出物件導向的好處。
實現的原理:
怎樣讓一張圖片像捲軸一樣不停移動呢?很簡單,假設有一條垂直分割線,把圖片分成左右兩部分。先顯示右邊部分,再把左邊部分接到圖片末尾。不停移動向右移動分割線,圖片就會迴圈地顯示。
成員函數功能列表:複製代碼 代碼如下:class MYBKSKY:public MYBITMAP
{
public:
MYBKSKY();
~MYBKSKY();--解構函式,怎麼樣 C++中,你有了資源 自己釋放。我們.net 有一個終結者函數也有點解構函式的味道,但不一定自己釋放資源嗎。
//show
//功能 顯示一個背景.
//入參 無
void DrawRoll(); //迴圈補空
//功能 顯示一個背景,並縮放圖片
//入參 橫縱方向縮放比例
void DrawRollStretch(int x,int y);
//功能 指定顯示某一個背景,並縮放圖片,遊戲中用的就是這個函數
//入參 橫縱方向縮放比例 背景圖片ID(縱向第幾個)
void DrawRollStretch(int x,int y,int id);--進行中橫座標的操作
//功能 設定圖片位置
//入參 新的橫縱座標
void MoveTo(int x,int y);
//功能 迴圈移動分割線
//入參 分割線移動的距離
void MoveRoll(int x);
//data
//分割線橫座標
int xseparate;
};

看一看圖片顯示 類MYANIOBJ
類說明:這個類負責遊戲中的圖片顯示。菜單背景、通關和遊戲結束的提示圖片,由MYBITMAP處理(大小一致的靜態圖片)。遊戲背景由MYBKSKY處理。其餘圖片,也就是遊戲過程中的所有圖片,都是MYANIOBJ處理。
技術原理:遊戲中的圖片大小不一致,具體在超級瑪麗中,可以分成兩類:矩形圖片和不規則圖片。在位元影像檔案中,都是縱向排列各個圖片,橫向排列各幀。用兩個數組儲存各個圖片的寬和高。為了方便顯示某一個圖片,用一個數組儲存各個圖片的縱座標(即位元影像檔案中左上方的位置)。使用時,由邏輯層指定“哪個圖片”的“哪一幀”,顯示在“什麼位置”。這樣圖片的顯示功能就實現了。
成員函數功能列表:複製代碼 代碼如下:class MYANIOBJ:public MYBITMAP
{
public:
MYANIOBJ();
~MYANIOBJ();
//init list
//功能 初始化寬度數組 高度數組 縱座標數組 是否有黑白圖
//入參 寬度數組地址 高度數組地址 圖片數量 是否有黑白圖(0 沒有, 1 有)
//(圖片縱座標資訊由Function Compute得出)
void InitAniList(int *pw,int *ph,int inum,int ismask);
//功能 初始化一些特殊的位元影像,例如各圖片大小一致,或者有其他規律
//入參 初始化方式 參數1 參數2
//(留作以後擴充, 目的是為了省去寬高數組的麻煩)
void InitAniList(int style,int a,int b);
//show
//功能 顯示圖片(不規則圖片)
//入參 橫縱座標(要顯示的位置) 圖片id(縱向第幾個), 圖片幀(橫向第幾個)
void DrawItem(int x,int y,int id,int iframe);
//功能 顯示圖片(矩形圖片)
//入參 橫縱座標(要顯示的位置) 圖片id(縱向第幾個), 圖片幀(橫向第幾個)
void DrawItemNoMask(int x,int y,int id,int iframe);
//功能 指定寬度, 顯示圖片的一部分(矩形圖片)
//入參 橫縱座標(要顯示的位置) 圖片id(縱向第幾個), 顯示寬度 圖片幀(橫向第幾個)
void DrawItemNoMaskWidth(int x,int y,int id,int w,int iframe);
//功能 播放一個動畫 即迴圈顯示各幀
//入參 橫縱座標(要顯示的位置) 圖片id(縱向第幾個)
void PlayItem(int x,int y,int id);
//寬度數組 最多支援20個圖片
int wlist[20];
//高度數組 最多支援20個圖片
int hlist[20];
//縱座標數組 最多支援20個圖片
int ylist[20];
//動畫播放時的當前幀
int iframeplay;
};

看一看 魔法攻擊 類MYANIMAGIC
類說明:玩家有兩種攻擊方式:普通攻擊(子彈),魔法攻擊(旋風)。這個類是專門處理旋風的。我最初的想法是用一些特殊的bitblt方法製造特效,例如或、與、異或。試了幾次,都失敗了。最後只能用“先與後或”的老方法。這個類可看成MYANIOBJ的一個簡化版,只支援不規則圖片的顯示。
成員函數功能列表:複製代碼 代碼如下:class MYANIMAGIC:public MYBITMAP
{
public:
MYANIMAGIC();
~MYANIMAGIC();
//init list
//功能 初始化寬度數組 高度數組 縱座標數組(必須有黑白圖)
//入參 寬度數組地址 高度數組地址 圖片數量
//(圖片縱座標資訊由Function Compute得出)
void InitAniList(int *pw,int *ph,int inum);
//功能 設定dc
//入參 顯示dc 臨時dc(用於圖片控制代碼選擇) 臨時dc(用於特效實現)
void SetDevice(HDC hdest,HDC hsrc,HDC htemp);
//show
//功能 顯示某個圖片的某幀
//入參 橫縱座標(顯示位置) 圖片id(縱向第幾個) 幀(橫向第幾個)
void DrawItem(int x,int y,int id,int iframe);
//寬度數組
int wlist[20];
//高度數組
int hlist[20];
//縱座標數組
int ylist[20];
//用於特效的臨時dc, 功能沒有實現L
HDC hdctemp;
};

這就是我的一些架構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.