天天看點

基于動畫原理的提高

既然上面的遊戲的“内幕”已經掌握,那麼我們來看看在上一節中涉及的“武器”和基本知識。或許本篇所涉及的東西是基于理論的多數,但是,這将為了解在後面即将寫的程式部分會打下很好的基礎的。是以咬咬牙,看完吧!(啊?沒有牙了啊?大家應該鼓掌吧!連牙都沒有長齊的“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 已經是一個成員。遊戲裡不能不用他的! 

  哇,口水幹了。(其實是手累了:)我們下回再見吧。 

  下回預告: 

繼續閱讀