既然上面的遊戲的“内幕”已經掌握,那麼我們來看看在上一節中涉及的“武器”和基本知識。或許本篇所涉及的東西是基于理論的多數,但是,這将為了解在後面即将寫的程式部分會打下很好的基礎的。是以咬咬牙,看完吧!(啊?沒有牙了啊?大家應該鼓掌吧!連牙都沒有長齊的“3、4點種的太陽”都開始學習了,你們還有理由嗎?恩?是大娘啊?那更應該值得學習了!跑題:)
首先要介紹的第一位主角是 Windows 程式設計中的必要元素: RECT 。是英語 rectangle 的簡寫,意思是矩形。它有什麼用呢?我們在上面不是講到了動作的分解動作嗎?我們看右圖:
這個圖就是一個簡單的行走動作分解圖,複雜的可能有10幀左右哦:)那麼怎麼在程式中實作自動在紙上畫出正确的遊戲圖檔呢?(其實我一直在考慮是否将這部分内容加上,因為實在太基本了。但是每個人都這麼想的話,基礎的誰來教呢?算了,讓别人的口水淹死我吧!)假設您已經有點 C++ 語言的基礎了。這個教我教的話,說不過去吧:)請看下面的代碼:
#define m_Width 32 // 每個動作的 寬度
#define m_Height 48 // 每個動作的 高度
void ShowThePic()
{
static RECT rect; // 矩形對象,用于精确定位所要的目前動作
static int CurrentFrame = 0; // 目前動作的編号
static int Direction = 0; // 目前的方向
rect.top = Direction; rect.bottom = (Direction+1)*m_Height; // 對目前矩形的大小定義,數學的問題哦
rect.left = CurrentFrame; rect.right = (CurrentFrame+1)*m_Width; // 根據英文的意思也可以知道在給誰指派
BltPicToScreen(); // 一個僞函數,作用是将目前矩形内的圖形複制到螢幕上。
CurrentFrame++;
if( CurrrentFrame==3 )
CurrentFrame = 0; // 這個步驟能夠保證動作的循環
}
不知道這麼個函數你能否看懂。之是以要采用 static 靜态變量,是因為我們這個函數程式要循環運作。如果直接寫個 int 的話,每次執行都會被賦回原值 0,那麼圖檔就不會變了。
上面這段代碼其實并不是那麼理想。因為程式自己在那兒一個勁地運作,完全沒有我們控制的份兒。别急!來看下面這份修改過的僞代碼:
static RECT rect; // 矩形對象,用于精确定位所要的目前動作
static int CurrentFrame = 0; // 目前動作的編号
static int Direction = 0; // 目前的方向
rect.top = Direction; rect.bottom = (Direction+1)*m_Height; //對目前矩形的大小定義,數學的問題哦
rect.left = CurrentFrame; rect.right = (CurrentFrame+1)*m_Width; //根據英文的意思也可以知道在給誰指派
BltPicToScreen(); // 一個僞函數,作用是将目前矩形内的圖形複制到螢幕上。
if( LeftArrowDown() ) // 如果 左箭頭 被按下
{
Direction = 1; // 指派方向為 1
CurrentFrame++;
}
if( RightArrowDown() )
Direction = 3;
if( UpArrowDown() )
Direction = 2;
if( DownArrowDown() )
Direction = 0;
if(CurrrentFrame==3)
}
經過這麼一修改,問題再次得到解決。上面的代碼就能夠響應使用者的操作了。當然,你這麼直接在程式裡輸入這些代碼是不行的:)因為是“僞代碼”。你得根據實際情況,自己相應地做些修改,才能使程式運作!
(題外話:不曉得這麼進行教學,你是否能夠一點一點的積累到知識?這種教程是不是合适?請到論壇内發表意見,我真的很想能夠摸索出大家接受的方法,有利教學)
歡迎回到教程中來!有人或許會問,為什麼這麼麻煩要把圖形放在這麼個圖檔裡頭,不一個動作一個圖啊?呵呵,想想,那要多少圖檔啊,很難于管理的。況且,這樣并不能避免使用這種常用手法,因為 RECT 已經是一個成員。遊戲裡不能不用他的!
哇,口水幹了。(其實是手累了:)我們下回再見吧。
下回預告: