funcode是一個簡單的游戲制作引擎,適合c++初學者操作,可以幫助初學者更好的了解c++環境,以及各種函數的實現,本學期我們用funcode作為C++最后的課程設計,所以我就使用funcode制作一個打地鼠的小游戲。以下是對這個小程序的描述。
游戲比較簡單,共有2個頭文件,兩個cpp文件
CommonClass.h這是系統自帶的頭文件
/
//
//
//
//
/
#ifndef _COMMON_CLASS_H_
#define _COMMON_CLASS_H_
//
#include <windows.h>
/
//
// 全局變量、宏定義
#define MAX_NAME_LEN 128 // 名字長度
/
//
// Sprite精靈與世界邊界碰撞響應定義( 碰撞之后API OnSpriteColWorldLimit 將被調用 )
enum EWorldLimit
{WORLD_LIMIT_OFF, // 關閉與世界邊界的碰撞WORLD_LIMIT_NULL, // 碰撞之后引擎不做任何處理,由各游戲自己處理響應WORLD_LIMIT_RIGID, // 剛性物理碰撞反應WORLD_LIMIT_BOUNCE, // 反彈模式WORLD_LIMIT_CLAMP, // 小幅反彈,逐漸停止模式(比如籃球落地)WORLD_LIMIT_STICKY, // 碰撞之后靜止WORLD_LIMIT_KILL, // 碰撞之后精靈將被刪除WORLD_LIMIT_INVALID, // 無效值
};
/
//
/// 精靈與精靈之間、精靈與地圖中其它精靈之間的碰撞響應( 碰撞之后API OnSpriteColSprite 將被調用 )
enum ECollisionResponse
{COL_RESPONSE_OFF, // 關閉碰撞響應(不調用OnSpriteColSprite)COL_RESPONSE_RIGID, // 剛性物理碰撞響應COL_RESPONSE_BOUNCE, // 反彈模式COL_RESPONSE_CLAMP, // 小幅反彈,逐漸停止模式(比如籃球落地)COL_RESPONSE_STICKY, // 碰撞之后靜止COL_RESPONSE_KILL, // 碰撞之后精靈將被刪除COL_RESPONSE_CUSTOM, // 碰撞之后引擎不做任何處理,由各游戲自己處理響應COL_RESPONSE_INVALID, // 無效值
};
//================================================================================
//
// 鼠標按鍵值定義
enum MouseTypes
{MOUSE_LEFT = 0, // 左鍵MOUSE_RIGHT = 1, // 右鍵MOUSE_MIDDLE = 2 // 中鍵
};
/
//
// 鍵盤KEY值定義
enum KeyCodes
{KEY_NULL = 0x000, ///< Invalid KeyCodeKEY_BACKSPACE = 0x001,KEY_TAB = 0x002,KEY_ENTER = 0x003,KEY_CONTROL = 0x004,KEY_ALT = 0x005,KEY_SHIFT = 0x006,KEY_PAUSE = 0x007,KEY_CAPSLOCK = 0x008,KEY_ESCAPE = 0x009,KEY_SPACE = 0x00a,KEY_PAGE_DOWN = 0x00b,KEY_PAGE_UP = 0x00c,KEY_END = 0x00d,KEY_HOME = 0x00e,KEY_LEFT = 0x00f,KEY_UP = 0x010,KEY_RIGHT = 0x011,KEY_DOWN = 0x012,KEY_PRINT = 0x013,KEY_INSERT = 0x014,KEY_DELETE = 0x015,KEY_HELP = 0x016,KEY_0 = 0x017,KEY_1 = 0x018,KEY_2 = 0x019,KEY_3 = 0x01a,KEY_4 = 0x01b,KEY_5 = 0x01c,KEY_6 = 0x01d,KEY_7 = 0x01e,KEY_8 = 0x01f,KEY_9 = 0x020,KEY_A = 0x021,KEY_B = 0x022,KEY_C = 0x023,KEY_D = 0x024,KEY_E = 0x025,KEY_F = 0x026,KEY_G = 0x027,KEY_H = 0x028,KEY_I = 0x029,KEY_J = 0x02a,KEY_K = 0x02b,KEY_L = 0x02c,KEY_M = 0x02d,KEY_N = 0x02e,KEY_O = 0x02f,KEY_P = 0x030,KEY_Q = 0x031,KEY_R = 0x032,KEY_S = 0x033,KEY_T = 0x034,KEY_U = 0x035,KEY_V = 0x036,KEY_W = 0x037,KEY_X = 0x038,KEY_Y = 0x039,KEY_Z = 0x03a,KEY_TILDE = 0x03b,KEY_MINUS = 0x03c,KEY_EQUALS = 0x03d,KEY_LBRACKET = 0x03e,KEY_RBRACKET = 0x03f,KEY_BACKSLASH = 0x040,KEY_SEMICOLON = 0x041,KEY_APOSTROPHE = 0x042,KEY_COMMA = 0x043,KEY_PERIOD = 0x044,KEY_SLASH = 0x045,KEY_NUMPAD0 = 0x046,KEY_NUMPAD1 = 0x047,KEY_NUMPAD2 = 0x048,KEY_NUMPAD3 = 0x049,KEY_NUMPAD4 = 0x04a,KEY_NUMPAD5 = 0x04b,KEY_NUMPAD6 = 0x04c,KEY_NUMPAD7 = 0x04d,KEY_NUMPAD8 = 0x04e,KEY_NUMPAD9 = 0x04f,KEY_MULTIPLY = 0x050,KEY_ADD = 0x051,KEY_SEPARATOR = 0x052,KEY_SUBTRACT = 0x053,KEY_DECIMAL = 0x054,KEY_DIVIDE = 0x055,KEY_NUMPADENTER = 0x056,KEY_F1 = 0x057,KEY_F2 = 0x058,KEY_F3 = 0x059,KEY_F4 = 0x05a,KEY_F5 = 0x05b,KEY_F6 = 0x05c,KEY_F7 = 0x05d,KEY_F8 = 0x05e,KEY_F9 = 0x05f,KEY_F10 = 0x060,KEY_F11 = 0x061,KEY_F12 = 0x062,KEY_F13 = 0x063,KEY_F14 = 0x064,KEY_F15 = 0x065,KEY_F16 = 0x066,KEY_F17 = 0x067,KEY_F18 = 0x068,KEY_F19 = 0x069,KEY_F20 = 0x06a,KEY_F21 = 0x06b,KEY_F22 = 0x06c,KEY_F23 = 0x06d,KEY_F24 = 0x06e,KEY_NUMLOCK = 0x06f,KEY_SCROLLLOCK = 0x070,KEY_LCONTROL = 0x071,KEY_RCONTROL = 0x072,KEY_LALT = 0x073,KEY_RALT = 0x074,KEY_LSHIFT = 0x075,KEY_RSHIFT = 0x076,KEY_WIN_LWINDOW = 0x077,KEY_WIN_RWINDOW = 0x078,KEY_WIN_APPS = 0x079,KEY_OEM_102 = 0x080,KEY_MAC_OPT = 0x090,KEY_MAC_LOPT = 0x091,KEY_MAC_ROPT = 0x092,KEY_BUTTON0 = 0x0100,KEY_BUTTON1 = 0x0101,KEY_BUTTON2 = 0x0102,KEY_BUTTON3 = 0x0103,KEY_BUTTON4 = 0x0104,KEY_BUTTON5 = 0x0105,KEY_BUTTON6 = 0x0106,KEY_BUTTON7 = 0x0107,KEY_BUTTON8 = 0x0108,KEY_BUTTON9 = 0x0109,KEY_BUTTON10 = 0x010A,KEY_BUTTON11 = 0x010B,KEY_BUTTON12 = 0x010C,KEY_BUTTON13 = 0x010D,KEY_BUTTON14 = 0x010E,KEY_BUTTON15 = 0x010F,KEY_BUTTON16 = 0x0110,KEY_BUTTON17 = 0x0111,KEY_BUTTON18 = 0x0112,KEY_BUTTON19 = 0x0113,KEY_BUTTON20 = 0x0114,KEY_BUTTON21 = 0x0115,KEY_BUTTON22 = 0x0116,KEY_BUTTON23 = 0x0117,KEY_BUTTON24 = 0x0118,KEY_BUTTON25 = 0x0119,KEY_BUTTON26 = 0x011A,KEY_BUTTON27 = 0x011B,KEY_BUTTON28 = 0x011C,KEY_BUTTON29 = 0x011D,KEY_BUTTON30 = 0x011E,KEY_BUTTON31 = 0x011F,KEY_ANYKEY = 0xfffe
};
//
//
// 類:CSprite
// 所有精靈的基類。包括下面的靜態精靈,動態精靈,文字,特效等均由此類繼承下去
// 一般的圖片精靈從本類繼承下去即可。只有特殊的精靈,比如帶動畫的精靈,才需要從動態精靈繼承下去
//
class CSprite
{
private:char m_szName[MAX_NAME_LEN]; // 精靈名字public:// 構造函數,需要傳入一個非空的精靈名字字符串。如果傳入的是地圖里擺放好的精靈名字,則此類即與地圖里的精靈綁定// 如果傳入的是一個新的精靈名字,則需要調用成員函數 CloneSprite,復制一份精靈對象實例,才與實際的地圖精靈關聯起來// szCloneName : 預先存在于場景中,需要克隆的精靈名字CSprite( const char *szName );CSprite( const char *szName, const char *szCloneName );virtual ~CSprite();// GetName// 返回值:返回精靈名字const char *GetName();// CloneSprite:復制(創建)一個精靈。精靈的創建方式:先在地圖中擺放一個精靈做為模板,設置好各項參數,然后在代碼里使用此函數克隆一個實例// 返回值:true表示克隆成功,false克隆失敗。失敗的原因可能是在地圖中未找到對應名字的精靈// 參數 szSrcName:地圖中用做模板的精靈名字//bool CloneSprite( const char *szSrcName );// DeleteSprite:在地圖中刪除與本對象實例關聯的精靈//void DeleteSprite();// SetSpriteVisible:設置精靈隱藏或者顯示(可見不可見)// 參數 bVisible:true 可見 false不可見//void SetSpriteVisible( const bool bVisible );// IsSpriteVisible:獲取該精靈當前是否可見//bool IsSpriteVisible();// SetSpriteEnable:禁止或者啟用該精靈。被禁止的精靈將不參與任何響應,包括不移動,沒有碰撞等,僅僅是在地圖中顯示// 參數 bEnable:true啟用 false禁止//void SetSpriteEnable( const bool bEnable );// SetSpriteScale:設置精靈的縮放值// 參數 fScale:縮放值。大于0的值//void SetSpriteScale( const float fScale );// IsPointInSprite:判斷某個坐標點是否位于精靈內部// 參數 fPosX:X坐標點// 參數 fPosY:Y坐標點//bool IsPointInSprite( const float fPosX, const float fPosY );// SetSpritePosition:設置精靈位置// 參數 fPosX:X坐標// 參數 fPosY:Y坐標//void SetSpritePosition( const float fPosX, const float fPosY );// SetSpritePositionX:只設置精靈X坐標// 參數 fPosX:X坐標//void SetSpritePositionX( const float fPosX );// SetSpritePositionY:只設置精靈Y坐標// 參數 fPosY:Y坐標//void SetSpritePositionY( const float fPosY );// GetSpritePositionX:獲取精靈X坐標// 返回值:精靈的X坐標//float GetSpritePositionX();// GetSpritePositionY:獲取精靈Y坐標// 返回值:精靈的Y坐標//float GetSpritePositionY();// GetSpriteLinkPointPosX:獲取精靈鏈接點X坐標。鏈接點是依附于精靈的一個坐標點,可以在編輯器里增加或者刪除// 參數 iId:鏈接點序號,第一個為1,后面依次遞加//float GetSpriteLinkPointPosX( const int iId );// GetSpriteLinkPointPosY:獲取精靈鏈接點Y坐標。鏈接點是依附于精靈的一個坐標點,可以在編輯器里增加或者刪除// 參數 iId:鏈接點序號,第一個為1,后面依次遞加//float GetSpriteLinkPointPosY( const int iId );// SetSpriteRotation:設置精靈的旋轉角度// 參數 fRot:旋轉角度,范圍0 - 360//void SetSpriteRotation( const float fRot );// GetSpriteRotation:獲取精靈的旋轉角度// 返回值:精靈的旋轉角度//float GetSpriteRotation();// SetSpriteAutoRot:設置精靈按照指定速度自動旋轉// 參數 fRotSpeed:旋轉速度//void SetSpriteAutoRot( const float fRotSpeed );// SetSpriteWidth:設置精靈外形寬度// 參數 fWidth:寬度值,大于0//void SetSpriteWidth( const float fWidth );// GetSpriteWidth:獲取精靈外形寬度// 返回值:精靈寬度值//float GetSpriteWidth();// SetSpriteHeight:設置精靈外形高度// 參數 fHeight:精靈高度值//void SetSpriteHeight( const float fHeight );// GetSpriteHeight:獲取精靈外形高度// 返回值:精靈高度值//float GetSpriteHeight();// SetSpriteFlipX:設置精靈圖片X方向翻轉顯示// 參數 bFlipX:true 翻轉 false不翻轉(恢復原來朝向)//void SetSpriteFlipX( const bool bFlipX );// GetSpriteFlipX:獲取當前精靈圖片X方向是否是翻轉顯示// 返回值:true 翻轉 false不翻轉//bool GetSpriteFlipX();// SetSpriteFlipY:設置精靈圖片Y方向翻轉顯示// 參數 bFlipY:true 翻轉 false不翻轉(恢復原來朝向)//void SetSpriteFlipY( const bool bFlipY );// GetSpriteFlipY:獲取當前精靈圖片Y方向是否是翻轉顯示// 返回值:true 翻轉 false不翻轉//bool GetSpriteFlipY();// SetSpriteFlip:同時設置精靈翻轉X及Y方向// 參數 bFlipX:true 翻轉 false不翻轉(恢復原來朝向)// 參數 bFlipY:true 翻轉 false不翻轉(恢復原來朝向)//void SetSpriteFlip( const bool bFlipX, const bool bFlipY );// SetSpriteLifeTime:設置精靈的生命時長,時間到了之后將自動被刪除// 參數 fLifeTime:生命時長,單位 秒//void SetSpriteLifeTime( const float fLifeTime );// GetSpriteLifeTime:獲取精靈生命時長// 返回值:生命時長,單位 秒//float GetSpriteLifeTime(); // SpriteMoveTo:讓精靈按照給定速度移動到給定坐標點// 參數 fPosX:移動的目標X坐標值// 參數 fPosY:移動的目標Y坐標值// 參數 fSpeed:移動速度// 參數 bAutoStop:移動到終點之后是否自動停止//void SpriteMoveTo( const float fPosX, const float fPosY, const float fSpeed, const bool bAutoStop );// SpriteRotateTo:讓精靈按照給定速度旋轉到給定的角度// 參數 fRotation:給定的目標旋轉值// 參數 fRotSpeed:旋轉速度// 參數 bAutoStop:旋轉到終點之后是否自動停止//void SpriteRotateTo( const float fRotation, const float fRotSpeed, const bool bAutoStop );// SetSpriteWorldLimit:設置精靈的世界邊界坐標限制及碰撞模式// 參數 Limit:碰撞到世界邊界之后的響應模式,如果為OFF,則是關閉世界邊界碰撞。其它值見 EWorldLimit// 參數 fLeft:邊界的左邊X坐標// 參數 fTop:邊界的上邊Y坐標// 參數 fRight:邊界的右邊X坐標// 參數 fBottom:邊界的下邊Y坐標//void SetSpriteWorldLimit( const EWorldLimit Limit, const float fLeft, const float fTop, const float fRight, const float fBottom );// SetSpriteWorldLimitMode:設置精靈的世界邊界碰撞模式// 參數 Limit:碰撞到世界邊界之后的響應模式,如果為OFF,則是關閉世界邊界碰撞。其它值見 EWorldLimit//void SetSpriteWorldLimitMode( const EWorldLimit Limit );// SetSpriteWorldLimitMin:設置精靈的世界邊界上邊及左邊坐標限制// 參數 fLeft:邊界的左邊X坐標// 參數 fTop:邊界的上邊Y坐標//void SetSpriteWorldLimitMin( const float fLeft, const float fTop );// SetSpriteWorldLimitMax:設置精靈的世界邊界下邊及右邊坐標限制// 參數 fRight:邊界的右邊X坐標// 參數 fBottom:邊界的下邊Y坐標//void SetSpriteWorldLimitMax( const float fRight, const float fBottom );// GetSpriteWorldLimitLeft:獲取精靈世界邊界左邊界限制//float GetSpriteWorldLimitLeft();// GetSpriteWorldLimitTop:獲取精靈世界邊界上邊界限制//float GetSpriteWorldLimitTop();// GetSpriteWorldLimitRight:獲取精靈世界邊界右邊界限制//float GetSpriteWorldLimitRight();// GetSpriteWorldLimitBottom:獲取精靈世界邊界下邊界限制//float GetSpriteWorldLimitBottom();// SetSpriteCollisionSend:設置精靈是否可以發送(產生)碰撞// 精靈的碰撞方式為:當A移動中碰上B時,如果A是可以產生碰撞的,B是可以接受碰撞的,則這2個物體會產生碰撞,精靈碰撞的API將被調用。否則無碰撞發生// 參數 bSend:true 可以產生 false 不產生//void SetSpriteCollisionSend( const bool bSend );// SetSpriteCollisionReceive:設置精靈是否可以接受碰撞// 精靈的碰撞方式為:當A移動中碰上B時,如果A是可以產生碰撞的,B是可以接受碰撞的,則這2個物體會產生碰撞,精靈碰撞的API將被調用。否則無碰撞發生// 參數 bReceive:true 可以接受 false 不接受//void SetSpriteCollisionReceive( const bool bReceive );// SetSpriteCollisionActive:同時設置精靈是否可以產生及接受碰撞// 精靈的碰撞方式為:當A移動中碰上B時,如果A是可以產生碰撞的,B是可以接受碰撞的,則這2個物體會產生碰撞,精靈碰撞的API將被調用。否則無碰撞發生// 參數 bSend:true 可以產生 false 不產生// 參數 bReceive:true 可以接受 false 不接受//void SetSpriteCollisionActive( const bool bSend, const bool bReceive );// SetSpriteCollisionPhysicsSend:設置精靈是否可以發送(產生)物理碰撞// 參數 bSend:true 可以產生 false 不產生//void SetSpriteCollisionPhysicsSend( const bool bSend );// SetSpriteCollisionPhysicsReceive:設置精靈是否可以接受物理碰撞// 參數 bReceive:true 可以接受 false 不接受//void SetSpriteCollisionPhysicsReceive( const bool bReceive );// GetSpriteCollisionSend:獲取精靈當前是否是可以產生碰撞// 返回值:true 可以產生 false 不產生//bool GetSpriteCollisionSend();// GetSpriteCollisionReceive:獲取精靈當前是否是可以接受碰撞// 返回值:true 可以接受 false 不接受//bool GetSpriteCollisionReceive();// SetSpriteCollisionResponse:設置精靈與精靈的碰撞響應模式// 參數 Response:響應模式,如果為OFF,則為關閉碰撞響應,碰撞API將不會被調用。其它值見 ECollisionResponse//void SetSpriteCollisionResponse( const ECollisionResponse Response );// SetSpriteCollisionMaxIterations:設置精靈碰撞之后的最大反彈次數// 參數 iTimes:反彈次數//void SetSpriteCollisionMaxIterations( const int iTimes );// SetSpriteForwardMovementOnly:設置精靈是否只能朝前移動// 參數 bForward:true 只能朝前移動 false 可以朝其他方向移動//void SetSpriteForwardMovementOnly( const bool bForward );// GetSpriteForwardMovementOnly:獲取精靈當前是否只能朝前移動// 返回值:true 只能朝前移動 false 可以朝其它方向移動//bool GetSpriteForwardMovementOnly();// SetSpriteForwardSpeed:設置精靈向前的速度// 參數 fSpeed:速度//void SetSpriteForwardSpeed( const float fSpeed );// SetSpriteImpulseForce:設置精靈瞬間推力// 參數 fForceX:X方向推力大小// 參數 fForceY:Y方向推力大小// 參數 bGravitic:是否計算重力//void SetSpriteImpulseForce( const float fForceX, const float fForceY, const bool bGravitic );// SetSpriteImpulseForcePolar:按角度朝向設置精靈瞬間推力// 參數 fPolar:角度朝向// 參數 fForce:推力大小// 參數 bGravitic:是否計算重力//void SetSpriteImpulseForcePolar( const float fPolar, const float fForce, const bool bGravitic );// SetSpriteConstantForceX:設置精靈X方向常量推力// 參數 fForceX:X方向推力大小//void SetSpriteConstantForceX( const float fForceX );// SetSpriteConstantForceY:設置精靈Y方向常量推力// 參數 fForceY:Y方向推力大小//void SetSpriteConstantForceY( const float fForceY );// SetSpriteConstantForceGravitic:精靈在計算常量推力的時候,是否計算重力// 參數 bGravitic:是否計算重力//void SetSpriteConstantForceGravitic( const bool bGravitic );// SetSpriteConstantForce:設置精靈常量推力// 參數 fForceX:X方向推力大小// 參數 fForceY:Y方向推力大小// 參數 bGravitic:是否計算重力//void SetSpriteConstantForce( const float fForceX, const float fForceY, const bool bGravitic );// SetSpriteConstantForcePolar:按角度朝向設置精靈常量推力// 參數 fPolar:角度朝向// 參數 fForce:推力大小// 參數 bGravitic:是否計算重力//void SetSpriteConstantForcePolar( const float fPolar, const float fForce, const bool bGravitic );// StopSpriteConstantForce:停止精靈常量推力//void StopSpriteConstantForce();// SetSpriteForceScale:按倍數縮放精靈當前受的推力// 參數 fScale:縮放值//void SetSpriteForceScale( const float fScale );// SetSpriteAtRest:暫停/繼續精靈的各種受力計算// 參數 bRest:true 暫停 false 繼續//void SetSpriteAtRest( const bool bRest );// GetSpriteAtRest:獲取精靈當前是否在暫停中// 返回值:true 暫停中 false 正常//bool GetSpriteAtRest( );// SetSpriteFriction:設置精靈摩擦力// 參數 fFriction:摩擦力大小//void SetSpriteFriction( const float fFriction );// SetSpriteRestitution:設置精靈彈力// 參數 fRestitution:彈力值大小//void SetSpriteRestitution( const float fRestitution );// SetSpriteMass:設置精靈質量// 參數 fMass:質量大小//void SetSpriteMass( const float fMass );// GetSpriteMass:獲取精靈質量// 返回值 :質量大小//float GetSpriteMass();// SetSpriteAutoMassInertia:開啟或者關閉精靈慣性// 參數 bStatus:true 開啟 false 關閉//void SetSpriteAutoMassInertia( const bool bStatus );// SetSpriteInertialMoment:設置精靈慣性大小// 參數 fInert:慣性大小//void SetSpriteInertialMoment( const float fInert );// SetSpriteDamping:設置精靈衰減值// 參數 fDamp:衰減值大小//void SetSpriteDamping( const float fDamp );// SetSpriteImmovable:設置精靈是否不可移動// 參數 bImmovable:true 不可以移動 false 可以移動//void SetSpriteImmovable( const bool bImmovable );// GetSpriteImmovable:獲取精靈當前是否不可以移動// 返回值:true 不可以移動 false 可以移動//bool GetSpriteImmovable();// SetSpriteLinearVelocity:設置精靈移動速度// 參數 fVelX:X方向速度// 參數 fVelY:Y方向速度//void SetSpriteLinearVelocity( const float fVelX, const float fVelY );// SetSpriteLinearVelocityX:設置精靈X方向移動速度// 參數 fVelX:X方向速度//void SetSpriteLinearVelocityX( const float fVelX );// SetSpriteLinearVelocityY:設置精靈Y方向移動速度// 參數 fVelY:Y方向速度//void SetSpriteLinearVelocityY( const float fVelY );// SetSpriteLinearVelocityPolar:按角度朝向設置精靈移動速度// 參數 fSpeed:移動速度// 參數 fPolar:角度朝向//void SetSpriteLinearVelocityPolar( const float fSpeed, const float fPolar );// SetSpriteAngularVelocity:設置精靈角度旋轉速度// 參數 fAngular:角度旋轉速度//void SetSpriteAngularVelocity( const float fAngular );// SetSpriteMinLinearVelocity:設置精靈最小速度// 參數 fMin:最小速度值//void SetSpriteMinLinearVelocity( const float fMin );// SetSpriteMaxLinearVelocity:設置精靈最大速度// 參數 fMax:最大速度值//void SetSpriteMaxLinearVelocity( const float fMax );// SetSpriteMinAngularVelocity:設置精靈最小角速度// 參數 fMin:最小角速度//void SetSpriteMinAngularVelocity( const float fMin );// SetSpriteMaxAngularVelocity:設置精靈最大角速度// 參數 fMax:最大角速度//void SetSpriteMaxAngularVelocity( const float fMax );// GetSpriteLinearVelocityX:獲取精靈X方向速度// 返回值:X方向速度//float GetSpriteLinearVelocityX();// GetSpriteLinearVelocityY:獲取精靈Y方向速度// 返回值:Y方向速度//float GetSpriteLinearVelocityY();// SpriteMountToSprite:將一個精靈綁定到另一個精靈上,暫時的成為另一個精靈的一部分,跟隨其運動等// 參數 szDstName:承載綁定的母體精靈名字// 參數 fOffSetX:綁定偏移X// 參數 fOffsetY:綁定偏移Y// 返回值:返回一個綁定ID//int SpriteMountToSprite( const char *szDstName, const float fOffSetX, const float fOffsetY );// SpriteMountToSpriteLinkPoint:將一個精靈綁定到另一個精靈上,綁定位置為指定的鏈接點,暫時的成為另一個精靈的一部分,跟隨其運動等// 參數 szDstName:承載綁定的母體精靈名字// 參數 iPointId:鏈接點序號// 返回值:返回一個綁定ID//int SpriteMountToSpriteLinkPoint( const char *szDstName, const int iPointId );// SetSpriteMountRotation:設置精靈的綁定朝向,即相對于母體的朝向// 參數 fRot:角度朝向,0 - 360//void SetSpriteMountRotation( const float fRot );// GetSpriteMountRotation:獲取精靈的綁定朝向,即相對于母體的朝向// 返回值:角度朝向//float GetSpriteMountRotation();// SetSpriteAutoMountRotation:設置精靈綁定之后自動旋轉// 參數 fRot:旋轉速度//void SetSpriteAutoMountRotation( const float fRot );// GetSpriteAutoMountRotation:獲取精靈綁定之后的自動旋轉值// 返回值:旋轉速度//float GetSpriteAutoMountRotation();// SetSpriteMountForce:綁定至另一個精靈時,附加的作用力// 參數 fFroce:作用力//void SetSpriteMountForce( const float fForce );// SetSpriteMountTrackRotation:綁定的精靈是否跟隨母體旋轉// 參數 bTrackRotation:true 跟隨 false 不跟隨//void SetSpriteMountTrackRotation( const bool bTrackRotation );// SetSpriteMountOwned:母體被刪除的時候,綁定的精靈是否也跟著被刪除// 參數 bMountOwned:true 跟著 false 不跟著//void SetSpriteMountOwned( const bool bMountOwned );// SetSpriteMountInheritAttributes:綁定的時候,是否繼承母體的屬性// 參數 bInherAttr:true 繼承 false 不繼承//void SetSpriteMountInheritAttributes( const bool bInherAttr );// SpriteDismount:將已經綁定的精靈進行解綁//void SpriteDismount();// GetSpriteIsMounted:判斷精靈是否綁定在另一個精靈上// 返回值:true 綁定 false 不綁定//bool GetSpriteIsMounted();// GetSpriteMountedParent:獲取綁定的母體精靈的名字// 返回值:母體精靈名字,如果未綁定,則返回空字符串//const char* GetSpriteMountedParent();// SetSpriteColorRed:更改精靈顯示顏色中的紅色。默認精靈的紅綠藍三顏色的值均為255,修改其中一項將可以改變其顏色// 參數 iCol:顏色范圍 0 - 255//void SetSpriteColorRed( const int iCol );// SetSpriteColorGreen:更改精靈顯示顏色中的綠色。默認精靈的紅綠藍三顏色的值均為255,修改其中一項將可以改變其顏色// 參數 iCol:顏色范圍 0 - 255//void SetSpriteColorGreen( const int iCol );// SetSpriteColorBlue:更改精靈顯示顏色中的藍色。默認精靈的紅綠藍三顏色的值均為255,修改其中一項將可以改變其顏色// 參數 iCol:顏色范圍 0 - 255//void SetSpriteColorBlue( const int iCol );// SetSpriteColorAlpha:設置精靈透明度// 參數 iCol:透明度,值0 - 255,從完全透明至完全不透明//void SetSpriteColorAlpha( const int iCol );// GetSpriteColorRed:獲取精靈顯示顏色中的紅色值// 返回值:顏色值//int GetSpriteColorRed();// GetSpriteColorGreen:獲取精靈顯示顏色中的綠色值// 返回值:顏色值//int GetSpriteColorGreen();// GetSpriteColorBlue:獲取精靈顯示顏色中的藍色值// 返回值:顏色值//int GetSpriteColorBlue();// GetSpriteColorAlpha:獲取精靈透明度// 返回值:透明度//int GetSpriteColorAlpha();
};
//
//
// 類:CStaticSprite
// 靜態精靈(靜態圖片顯示),從CSprite精靈基類繼承下來,比基類多了幾個控制精靈圖片顯示的函數
//
class CStaticSprite : public CSprite
{
public:CStaticSprite( const char *szName );CStaticSprite( const char *szName, const char *szCloneName );~CStaticSprite();// SetStaticSpriteImage:設置/更改靜態精靈的顯示圖片// 參數 szImageName:圖片名字// 參數 iFrame:該圖片的顯示幀數。為編輯器預覽圖里顯示的1/N,范圍為 0 到 N - 1//void SetStaticSpriteImage( const char *szImageName, const int iFrame );// SetStaticSpriteFrame:設置靜態精靈當前圖片的顯示幀數// 參數 iFrame:該圖片的顯示幀數。為編輯器預覽圖里顯示的1/N,范圍為 0 到 N - 1//void SetStaticSpriteFrame( const int iFrame );//// GetStaticSpriteImage:獲取精靈當前顯示的圖片名字// 返回值:圖片名字//const char* GetStaticSpriteImage();// GetStaticSpriteFrame:獲取精靈當前顯示的圖片幀數// 返回值:幀數//int GetStaticSpriteFrame();
};
//
//
// 類:CAnimateSprite
// 動態精靈(帶圖片動畫),從CSprite精靈基類繼承下來,比基類多了幾個控制圖片動畫的函數
//
class CAnimateSprite : public CSprite
{
public:CAnimateSprite( const char *szName );CAnimateSprite( const char *szName, const char *szCloneName );~CAnimateSprite();// SetAnimateSpriteFrame:設置動態精靈的動畫幀數// 參數 iFrame:動畫幀數//void SetAnimateSpriteFrame( const int iFrame );// GetAnimateSpriteAnimationName:獲取動態精靈當前動畫名字// 返回值:動畫名字//const char* GetAnimateSpriteAnimationName();// GetAnimateSpriteAnimationTime:獲取動畫精靈當前動畫時間長度// 返回值:長度,單位秒//float GetAnimateSpriteAnimationTime();// IsAnimateSpriteAnimationFinished:判斷動態精靈當前動畫是否播放完畢,只針對非循環動畫而言// 返回值:true 完畢 false 未完畢//bool IsAnimateSpriteAnimationFinished();// AnimateSpritePlayAnimation:動畫精靈播放動畫// 參數 szAnim:動畫名字// 參數 bRestore:播放完畢后是否恢復當前動畫// 返回值:是否播放成功//bool AnimateSpritePlayAnimation( const char *szAnim, const bool bRestore );
};
//
//
// 類:CTextSprite
// 文字精靈,亦屬于精靈中的一種。基本用法:在地圖里擺放一個“文字”物體,起個名字
// 然后在代碼里定義一個文字精靈的對象實例,將此名字做為構造函數的參數,然后調用對應的成員函數更新文字顯示即可
//
class CTextSprite : public CSprite
{
public:CTextSprite( const char *szName );CTextSprite( const char *szName, const char *szCloneName );~CTextSprite();// SetTextValue:文字精靈顯示某個數值// 參數 iValue:要顯示的數值//void SetTextValue( int iValue );// SetTextValueFloat:文字精靈顯示某個浮點數值// 參數 fValue:要顯示的數值//void SetTextValueFloat( float fValue );// SetTextString:文字精靈顯示某個字符串文字// 參數 szStr:要顯示的字符串//void SetTextString( const char *szStr );// SetTextChar:文字精靈顯示某個字符// 參數 szChar:要顯示的字符//void SetTextChar( char szChar );
};
/
//
// 類:CEffect
// 特效精靈,屬于精靈中的一種。用法和文字精靈一樣,先在地圖里擺放一個特效做為模板,并命名
// 然后在代碼里定義一個特效精靈的對象實例即可使用
class CEffect : public CSprite
{char m_szCloneName[MAX_NAME_LEN]; // 在地圖中預先擺放好的用做克隆的特效名字float m_fTime; // 非循環特效:生命時長;循環特效:循環時長
public:// 構造函數 // 參數 szCloneName:地圖里擺放好的特效名字// 參數 szMyName:新的特效名字。注意:如果是循環特效,那么必須一個循環特效就定義一個對象實例,用不同的名字// 否則如果一個同名的循環特效被播放多次,在刪除的時候會出問題。非循環特效則可以用一個實例多次播放// 參數 fTime:非循環特效:生命時長;循環特效:循環時長//CEffect( const char *szCloneName, const char *szMyName, const float fTime );~CEffect();// GetCloneName:獲取用做克隆的特效名字// const char* GetCloneName();// GetTime:返回特效循環時長或者生命時長//float GetTime();// PlayEffect:播放一個不循環的特效,播放完畢之后該特效自動刪除// 播放非循環特效的時候,可以使用一個CEffect的對象實例,播放多個特效// 參數 fPosX:播放的X坐標// 參數 fPosY:播放的Y坐標// 參數 fRotation:播放的角度朝向//void PlayEffect( const float fPosX, const float fPosY, const float fRotation);// PlayLoopEffect:播放一個循環特效,不需要該特效的時候,需要自己調用API進行刪除// 參數 fPosX:播放的X坐標// 參數 fPosY:播放的Y坐標// 參數 fRotation:播放的角度朝向//void PlayLoopEffect( const float fPosX, const float fPosY, const float fRotation);// DeleteEffect:刪除一個正在播放的特效,只有循環特效才需要手動刪除//void DeleteEffect();
};
/
//
// 類:CSound
// 播放聲音的類,定義一個對象實例,調用播放函數即可實現聲音的播放
//
class CSound
{
private:char m_szName[MAX_NAME_LEN]; // 聲音名int m_iSoundId; // 引擎播放聲音的時候,返回的IDbool m_bLoop; // bLoop : 是否循環播放。如果為循環音效,則在CSound實例析構的時候,自動調用StopSound停止此聲音的播放float m_fVolume; // 音量大小,0-1。1為聲音文件的原聲大小public:// 構造函數// 參數 szName:聲音的路徑及名稱,具體值請在編輯器的資源 -> 添加聲音那里查看本項目里的聲音資源,完整按照那個路徑值填寫即可// 參數 bLoop:是否循環播放。如果是循環播放的聲音,需要手動調用API停止播放// 參數 fVolume:音量大小,0-1。1為聲音文件的原聲大小//CSound( const char *szName, const bool bLoop, const float fVolume );~CSound();// GetName:獲取聲音名字//const char* GetName();// PlaySound:播放該聲音//void PlaySound();// StopSound:停止該聲音的播放// 非循環的播放完之后將自動停止,所以一般不需要調用此函數。只有循環的聲音才需要調用。對于循環音效,在析構函數里也會自動調用此函數//void StopSound();// StopAllSound:停止播放所有聲音// 靜態函數,可以以此種方式調用:CSound::StopAllSound,以停止游戲中所有正在播放的聲音//static void StopAllSound();
};//
// 類:CSystem
// 系統相關功能的類. 函數調用方法 CSystem::函數名();
//
class CSystem
{
public:CSystem();~CSystem();// OnMouseMove:鼠標移動后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 參數 fMouseX, fMouseY:為鼠標當前坐標//static void OnMouseMove( const float fMouseX, const float fMouseY );// OnMouseClick:鼠標按下后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 參數 iMouseType:鼠標按鍵值,見 enum MouseTypes 定義// 參數 fMouseX, fMouseY:為鼠標當前坐標//static void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );// OnMouseUp:鼠標按下后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 參數 iMouseType:鼠標按鍵值,見 enum MouseTypes 定義// 參數 fMouseX, fMouseY:為鼠標當前坐標//static void OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY );// OnKeyDown:鍵盤被按下后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 參數 iKey:被按下的鍵,值見 enum KeyCodes 宏定義// 參數 bAltPress, bShiftPress,bCtrlPress:鍵盤上的功能鍵Alt,Ctrl,Shift當前是否也處于按下狀態//static void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress );// OnKeyUp:鍵盤按鍵彈起后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 參數 iKey:彈起的鍵,值見 enum KeyCodes 宏定義//static void OnKeyUp( const int iKey );// OnSpriteColSprite:精靈與精靈碰撞后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 精靈之間要產生碰撞,必須在編輯器或者代碼里設置精靈發送及接受碰撞// 參數 szSrcName:發起碰撞的精靈名字// 參數 szTarName:被碰撞的精靈名字//static void OnSpriteColSprite( const char *szSrcName, const char *szTarName );// OnSpriteColWorldLimit:精靈與世界邊界碰撞后將被調用的函數,可在此函數體里(Main.cpp)增加自己的響應代碼// 精靈之間要產生碰撞,必須在編輯器或者代碼里設置精靈的世界邊界限制// 參數 szName:碰撞到邊界的精靈名字// 參數 iColSide:碰撞到的邊界 0 左邊,1 右邊,2 上邊,3 下邊//static void OnSpriteColWorldLimit( const char *szName, const int iColSide );// MakeSpriteName: 將前面的字符串與后面的數字整合成一個字符串。// 參數 szPrev:一個非空字符串,最長不能超過20個英文字符。名字前面的字符。// 參數 iId:一個數字// 返回值:返回一個字符串,比如傳入("xxx", 2),則返回"xxx2"//static char* MakeSpriteName(const char *szPrev, const int iId);// CursorOff:關閉鼠標不顯示。此API隱藏的是整個Windows的鼠標,除非調用開啟鼠標的API dCursorOn,否則鼠標將一直不顯示//static void CursorOff();// CursorOn:開啟鼠標顯示。將API dCursorOff關閉的鼠標重新開啟顯示//static void CursorOn();// IsCursorOn:當前鼠標是開啟還是關閉。對應的是用API dCursorOff和dCursorOn開啟或者關閉的操作// 返回值:true為開啟狀態,false為關閉狀態//static bool IsCursorOn();// ShowCursor:隱藏/顯示鼠標。此API只是隱藏本程序窗口內的鼠標,移動到窗口外的時候,鼠標還是會顯示// 參數 bShow:true 為顯示,false 為隱藏//static void ShowCursor( const bool bShow );// IsShowCursor:當前鼠標是顯示還是隱藏。對應的是用API ShowCursor隱藏或者顯示的操作// 返回值:true為開啟狀態,false為關閉狀態//static bool IsShowCursor();// SetWindowTitle:設置窗口名字/標題// 參數 szTitle:非空字符串//static void SetWindowTitle( const char *szTitle );// ResizeWindow:更改窗口大小// 參數 iWidth:寬度,大于0小于等于1920// 參數 iHeight:高度,大于0小于等于1080//static void ResizeWindow(int iWidth, int iHeight);// GetHwnd:獲取窗口句柄// 返回值:窗口句柄//static void *GetHwnd();// Random:獲取一個大于等于0的隨機數// 返回值:int,范圍0 - 2147483648//static int Random();// RandomRange:獲取一個位于參數1到參數2之間的隨機數// 返回值:int,范圍iMin - iMax// 參數 iMin:小于iMax的整數// 參數 iMax:大于iMin的整數//static int RandomRange( const int iMin, const int iMax );// CalLineRotation:計算兩點連線的直線的旋轉角度// 返回值:角度,范圍0 - 360// 參數 fStartX:起始坐標X// 參數 fStartY:起始坐標Y// 參數 fEndX:終點坐標X// 參數 fEndY:終點坐標Y//static float CalLineRotation( const float fStartX, const float fStartY, const float fEndX, const float fEndY );// RotationToVectorX:計算某個角度對應的直線向量的X方向// 參數 fRotation:角度,范圍0 - 360// 返回值 :該直線向量的X值//static float RotationToVectorX( const float fRotation );// RotationToVectorY:計算某個角度對應的直線向量的Y方向// 參數 fRotation:角度,范圍0 - 360// 返回值 :該直線向量的Y值//static float RotationToVectorY( const float fRotation );// DrawLine:在兩點之間畫一條線// 參數 fStartX:起始坐標X// 參數 fStartY:起始坐標Y// 參數 fEndX:終點坐標X// 參數 fEndY:終點坐標Y// 參數 fLineWidth:線的粗細,大于等于1// 參數 iLayer:改線所在的層,與編輯器里設置的精靈的層級是同一個概念。范圍0 - 31。// 參數 iRed, iGreen, iBlue : 紅綠藍三原色的顏色值,范圍 0 - 255// 參數 iAlpha:線的透明度,范圍0-255. 0為全透明,255為不透明//static void DrawLine( const float fStartX, const float fStartY, const float fEndX, const float fEndY, const float fLineWidth, const int iLayer, const int iRed, const int iGreen, const int iBlue, const int iAlpha );// DrawTriangle:畫一個三角形// 參數 fX1,fX2,fX3:三角形上三個點的X坐標// 參數 fY1,fY2,fY3:三角形上三個點的Y坐標// 參數 fLineWidth:線的粗細,大于等于1// 參數 iLayer:該三角形所在的層,與編輯器里設置的精靈的層級是同一個概念。范圍0 - 31。// 參數 iRed, iGreen, iBlue : 紅綠藍三原色的顏色值,范圍 0 - 255// 參數 iAlpha:三角形的透明度,范圍0-255. 0為全透明,255為不透明//static void DrawTriangle( const float fX1, const float fY1, const float fX2, const float fY2, const float fX3, const float fY3, const float fLineWidth, const int iLayer, const int iRed, const int iGreen, const int iBlue, const int iAlpha );// DrawRect:畫一個矩形// 參數 fUpperX:左上角坐標X// 參數 fUpperY:左上角坐標Y// 參數 fLowerX:右下角坐標X// 參數 fLowerY:右下角坐標Y// 參數 fLineWidth:線的粗細,大于等于1// 參數 iLayer:該矩形所在的層,與編輯器里設置的精靈的層級是同一個概念。范圍0 - 31。// 參數 iRed, iGreen, iBlue : 紅綠藍三原色的顏色值,范圍 0 - 255// 參數 iAlpha:矩形的透明度,范圍0-255. 0為全透明,255為不透明//static void DrawRect( const float fUpperX, const float fUpperY, const float fLowerX, const float fLowerY, const float fLineWidth, const int iLayer, const int iRed, const int iGreen, const int iBlue, const int iAlpha );// DrawCircle:畫一個圓// 參數 fCenterX:圓心坐標X// 參數 fCenterY:圓心坐標Y// 參數 fRadius:圓的半徑// 參數 iSegment:圓弧段數,范圍4-72. 比如傳入6,將得到一個6邊形,段數越大越圓滑,但是畫圖效率越低// 參數 fLineWidth:線的粗細,大于等于1// 參數 iLayer:該圓所在的層,與編輯器里設置的精靈的層級是同一個概念。范圍0 - 31。// 參數 iRed, iGreen, iBlue : 紅綠藍三原色的顏色值,范圍 0 - 255// 參數 iAlpha:圓的透明度,范圍0-255. 0為全透明,255為不透明//static void DrawCircle( const float fCenterX, const float fCenterY, const float fRadius, const int iSegment, const float fLineWidth, const int iLayer, const int iRed, const int iGreen, const int iBlue, const int iAlpha );// GetScreenLeft:獲取世界邊界之左邊X坐標// 返回值:左邊界X坐標//static float GetScreenLeft();// GetScreenTop:獲取世界邊界之上邊Y坐標// 返回值:上邊界Y坐標//static float GetScreenTop();// GetScreenRight:獲取世界邊界之右邊X坐標// 返回值:右邊界X坐標//static float GetScreenRight();// GetScreenBottom:獲取世界邊界之下邊Y坐標// 返回值:下邊界Y坐標//static float GetScreenBottom();// LoadMap:載入新場景。注意,載入新場景的時候,舊場景的所有精靈都將被引擎刪除掉,所以所有在程序中創建、復制出來的精靈都必須在調用本API之前先刪除掉// 參數 szName:場景名字。即新建場景保存的時候取的名字,必須帶小寫的后綴 -- xxx.t2d。不用帶路徑//static void LoadMap( const char *szName );////// 以下API為系統API,請勿自己調用////// GetTimeDelta:獲取兩次調用本函數之間的時間差// 返回值:float,單位 秒//static float GetTimeDelta();// EngineMainLoop:引擎主循環函數。請勿自己調用//static bool EngineMainLoop();// InitGameEngine:初始化引擎,請勿自己調用//static bool InitGameEngine( HINSTANCE hInstance, LPSTR lpCmdLine );// ShutdownGameEngine:關閉引擎,請勿自己調用//static void ShutdownGameEngine();
};//
#endif // _COMMON_API_H_
LessonX.h
/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
//using std::vector;//表明使用的是std標準庫里面的vecto.h文件/
//
// 游戲總管類。負責處理游戲主循環、游戲初始化、結束等工作
class CGameMain
{
private:int m_iGameState; // 游戲狀態,0:結束或者等待開始;1:初始化;2:游戲進行中CSprite* m_pChuizi;//錘子精靈CSprite* m_pKaishi;//開始游戲CSprite* m_pFengmian;//開始封面CSprite* m_pShuoming;float m_fGameTime;CTextSprite* m_pTime;//時間文字CTextSprite* m_pScore;//分數CTextSprite* m_pDefen;//CTextSprite* m_pfirst;CTextSprite* m_pSecond;CTextSprite* m_pthird;CTextSprite* m_pDengji;//游戲等級float m_fChuiX; //錘子精靈的x坐標float m_fChuiY; //錘子精靈的y坐標int m_iGameScore ; // 本局游戲當前積分值float m_fRotateTime ;// 錘子拍下后距離復位還差多少時間float m_fOldRotation ;// 錘子的初始角度CSprite* m_pDishu; //地鼠精靈//vector<CSprite> m_vdishu; //地鼠數組float m_fBaseTime ; // 第一架飛碟出現后,距離第二架飛碟出現還剩多少時間int m_iCount ; // 游戲中飛碟出現的架數float m_fScreenLeft ;// 屏幕上下左右4個邊界值float m_fScreenRight ;float m_fScreenTop ;float m_fScreenBottom ;CSprite* m_ptexiao;int sum;int defen;float jibie;int a[4]={0,0,0,0};
public:CGameMain(); //構造函數~CGameMain(); //析構函數// Get方法int GetGameState() { return m_iGameState; }// Set方法void SetGameState( const int iState ) { m_iGameState = iState; }// 游戲主循環等void GameMainLoop( float fDeltaTime );void GameInit();void GameRun( float fDeltaTime ,float jibie);void GameEnd();void OnKeyDown( const int iKey, const int bAltPress, const int bShiftPress, const int bCtrlPress); //空格開始控制函數void OnMouseMove(const float fMouseX,const float fMouseY);void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY);void Dishu(const char* szName);void Dengji(const int DengjiKey,float jibie);//設置游戲級別
};/
//
extern CGameMain g_GameMain;#endif // _LESSON_X_H_
以上是兩個頭文件定義個各種變量和方法,為下面的文件做了鋪墊
LessonX.cpp
/
//
//
//
//
/
#include <Stdio.h>
#include <algorithm>
#include "CommonClass.h"
#include "LessonX.h"
#include "Texiao.h"
#include "iostream"
using namespace std;//
//
CGameMain g_GameMain;//==============================================================================
//
// 大體的程序流程為:GameMainLoop函數為主循環函數,在引擎每幀刷新屏幕圖像之后,都會被調用一次。//==============================================================================
//
// 構造函數
CGameMain::CGameMain()
{m_fGameTime =0.f;m_iGameScore =0;m_fChuiX =0.f;m_fChuiY =0.f;m_pKaishi =new CSprite("kaishi");m_pChuizi =new CSprite("chuizi");m_pTime =new CTextSprite("time");m_pScore =new CTextSprite("Score");m_pDefen =new CTextSprite("defen");m_pfirst =new CTextSprite("First");m_pSecond =new CTextSprite("Second");m_pthird =new CTextSprite("Third");m_pDishu =new CSprite("dishu");m_ptexiao =new CSprite("texiao");m_pDengji =new CTextSprite("dengji");//游戲等級選擇及顯示m_pFengmian =new CSprite("fengmian");m_psorry =new CSprite("sorry");m_pShuoming =new CSprite("shuoming");m_pwenzi =new CTextSprite("wenzi");m_pyanhua =new CSprite("yanhua");m_fRotateTime =0.f;m_fOldRotation =0.f;m_iGameState =0;//四個邊界值m_fScreenLeft =0.f;m_fScreenRight =0.f;m_fScreenTop =0.f;m_fScreenBottom =0.f;m_fBaseTime =0.f;//計分sum =0;//游戲等級jibie =0.5f;gs = 0;
}
//==============================================================================
//
// 析構函數
CGameMain::~CGameMain()
{
}//==============================================================================
//
// 游戲主循環,此函數將被不停的調用,引擎每刷新一次屏幕,此函數即被調用一次
// 用以處理游戲的開始、進行中、結束等各種狀態.
// 函數參數fDeltaTime : 上次調用本函數到此次調用本函數的時間間隔,單位:秒
void CGameMain::GameMainLoop( float fDeltaTime )
{switch( GetGameState() ){// 初始化游戲,清空上一局相關數據case 1:{cout<<1<<endl;GameInit();SetGameState(2); // 初始化之后,將游戲狀態設置為進行中}break;// 游戲進行中,處理各種游戲邏輯case 2://判斷游戲時間是否大于0,是的話,顯示游戲剩余時間。{// TODO 修改此處游戲循環條件,完成正確游戲邏輯cout<<2<<endl;if( m_fGameTime>0 ){GameRun( fDeltaTime ,jibie);}else // 游戲結束。調用游戲結算函數,并把游戲狀態修改為結束狀態{SetGameState(0);GameEnd();}}break;// 游戲結束/等待按空格鍵開始case 0:cout<<0<<endl;default:break;};
}
//=============================================================================
//
// 每局開始前進行初始化,清空上一局相關數據
void CGameMain::GameInit()
{m_fChuiX=m_pChuizi->GetSpritePositionX();m_fChuiY=m_pChuizi->GetSpritePositionY();m_fOldRotation=m_pChuizi->GetSpriteRotation();// 獲取屏幕4個邊界值m_fScreenLeft = CSystem::GetScreenLeft();m_fScreenRight = CSystem::GetScreenRight();m_fScreenTop = CSystem::GetScreenTop();m_fScreenBottom = CSystem::GetScreenBottom();sum = 0;
}
//=============================================================================
//
// 每局游戲進行中
void CGameMain::GameRun( float fDeltaTime ,float jibie)
{m_fGameTime-=fDeltaTime;//減少游戲時間m_pTime->SetTextValue((int)m_fGameTime);//顯示時時更新的游戲時間if(m_fRotateTime>0){m_fRotateTime-=fDeltaTime;if(m_fRotateTime<=0){m_pChuizi->SetSpriteRotation(m_fOldRotation);}}m_fBaseTime -= fDeltaTime;if(m_fBaseTime <= 0){m_fBaseTime = jibie;m_ptexiao->SetSpritePosition(-25,-45);m_pyanhua->SetSpritePosition(80,-53);Dishu("");}}
//=============================================================================
//
// 本局游戲結束
void CGameMain::GameEnd()
{//游戲時間小于等于0,則設置游戲狀態為游戲結束m_iGameState = 0;m_pChuizi->SetSpriteVisible(true);m_fGameTime = 0.f;m_pScore->SetTextValue((int)m_fGameTime);CSystem::ShowCursor(true);m_pChuizi->SetSpritePosition(m_fChuiX,m_fChuiY);/*char name[128];sprintf(name, "dishu_%d", sont);CSprite* tmpSprite1=new CSprite(name);tmpSprite1->DeleteSprite();*/m_pDishu->SetSpritePosition(-45,-45);m_psorry->SetSpritePosition(-45,-55);m_ptexiao->SetSpritePosition(-25,-45);m_pyanhua->SetSpritePosition(80,-53);defen=sum;m_pDefen->SetTextValue(defen);a[0]=sum;sort(a,a+4);m_pfirst->SetTextValue(a[3]);m_pSecond->SetTextValue(a[2]);m_pthird->SetTextValue(a[1]);m_pChuizi->SetSpriteRotation(m_fOldRotation);}
//=============================================================================
//
// 按數字鍵1、2、3選擇游戲等級
void CGameMain::Dengji(const int DengjiKey,float jibie)
{if(KEY_F1 == DengjiKey)jibie = 0.5f;else if(KEY_F2 == DengjiKey)jibie = 1.0f;else if(KEY_F3 == DengjiKey)jibie = 1.5f;elsejibie = 0.5f;
}
//=============================================================================
//
// 選取難度開始游戲
void CGameMain::OnKeyDown(const int iKey,const int bAltPress, const int bShiftPress, const int bCtrlPress)
{if(0 == m_iGameState && KEY_SPACE == iKey){m_pFengmian->DeleteSprite();return ;}m_pShuoming->DeleteSprite();m_pwenzi->DeleteSprite();if( KEY_ENTER == iKey && 2== m_iGameState){m_iGameState = 1;m_iGameScore = 0;m_fGameTime = 30.f;//游戲總共的時間 //設置游戲時間// 更新當前游戲積分顯示(清零上一局積分顯示值)m_pScore->SetTextValue(m_iGameScore);// 更新當前游戲剩余時間顯示, 由于游戲剛開始,所以直接設置為g_fMaxGameTimem_pTime->SetTextValue(m_fGameTime);// 隱藏 "按空格開始游戲" 這個提示圖片m_pKaishi->SetSpriteVisible(false);//隱藏鼠標m_pDengji->SetTextString("一般");CSystem::ShowCursor(false);}else if(0 == m_iGameState){if(KEY_F1 == iKey){m_iGameState = 1;m_iGameScore = 0;m_fGameTime = 30.f;//游戲總共的時間 //設置游戲時間// 更新當前游戲積分顯示(清零上一局積分顯示值)m_pScore->SetTextValue(m_iGameScore);// 更新當前游戲剩余時間顯示, 由于游戲剛開始,所以直接設置為g_fMaxGameTimem_pTime->SetTextValue(m_fGameTime);// 隱藏 "按空格開始游戲" 這個提示圖片m_pKaishi->SetSpriteVisible(false);//隱藏鼠標m_pDengji->SetTextString("簡單");CSystem::ShowCursor(false);jibie = 1.5f;gs=1;}else if(KEY_F2 == iKey){m_iGameState = 1;m_iGameScore = 0;m_fGameTime = 30.f;//游戲總共的時間 //設置游戲時間// 更新當前游戲積分顯示(清零上一局積分顯示值)m_pScore->SetTextValue(m_iGameScore);// 更新當前游戲剩余時間顯示, 由于游戲剛開始,所以直接設置為g_fMaxGameTimem_pTime->SetTextValue(m_fGameTime);// 隱藏 "按空格開始游戲" 這個提示圖片m_pKaishi->SetSpriteVisible(false);//隱藏鼠標m_pDengji->SetTextString("一般");CSystem::ShowCursor(false);jibie = 1.0f;gs = 2;}else if(KEY_F3 == iKey){m_iGameState = 1;m_iGameScore = 0;m_fGameTime = 30.f;//游戲總共的時間 //設置游戲時間// 更新當前游戲積分顯示(清零上一局積分顯示值)m_pScore->SetTextValue(m_iGameScore);// 更新當前游戲剩余時間顯示, 由于游戲剛開始,所以直接設置為g_fMaxGameTimem_pTime->SetTextValue(m_fGameTime);// 隱藏 "按空格開始游戲" 這個提示圖片m_pKaishi->SetSpriteVisible(false);//隱藏鼠標CSystem::ShowCursor(false);m_pDengji->SetTextString("困難");jibie = 0.5f;gs = 2;}else{m_iGameState = 1;m_iGameScore = 0;m_fGameTime = 30.f;//游戲總共的時間 //設置游戲時間// 更新當前游戲積分顯示(清零上一局積分顯示值)m_pScore->SetTextValue(m_iGameScore);// 更新當前游戲剩余時間顯示, 由于游戲剛開始,所以直接設置為g_fMaxGameTimem_pTime->SetTextValue(m_fGameTime);// 隱藏 "按空格開始游戲" 這個提示圖片m_pKaishi->SetSpriteVisible(false);//隱藏鼠標CSystem::ShowCursor(false);jibie = 1.0f;m_pDengji->SetTextString("一般");}}
}
//=============================================================================
//
// 打地鼠實現
void CGameMain::Dishu(const char* szName)
{//char szName[128];//char name[128];//int Msont;int iDir = 0;int iDir1 = 0;int i=0;float fPosX, fPosY;float fPosX1,fPosY1;iDir = CSystem::RandomRange(0,15);//隨機生成出現地鼠的編號iDir1 = CSystem::RandomRange(0,15);//隨機生成出現地鼠的編號i=CSystem::RandomRange(0,3);//m_fBaseTime -= fDeltaTime;//if(m_fBaseTime <= 0)//{//m_fBaseTime = 0.8f;//根據隨機數設置地鼠出現在哪if(iDir!=iDir1&&i==1&&gs==2){switch(iDir1){case 0:fPosX1 = CSystem::RandomRange(-35, -35 );fPosY1 = CSystem::RandomRange(-25,-25);break;case 1:fPosX1 = CSystem::RandomRange(-15, -15 );fPosY1 = CSystem::RandomRange(-25,-25);break;case 2:fPosX1 = CSystem::RandomRange(5, 5 );fPosY1 = CSystem::RandomRange(-25,-25);break;case 3:fPosX1 = CSystem::RandomRange(25, 25 );fPosY1 = CSystem::RandomRange(-25,-25);break;case 4:fPosX1 = CSystem::RandomRange(-35, -35 );fPosY1 = CSystem::RandomRange(-10,-10);break;case 5:fPosX1 = CSystem::RandomRange(-15, -15 );fPosY1 = CSystem::RandomRange(-10,-10);break;case 6:fPosX1 = CSystem::RandomRange(5, 5 );fPosY1 = CSystem::RandomRange(-10,-10);break;case 7:fPosX1 = CSystem::RandomRange(25, 25 );fPosY1 = CSystem::RandomRange(-10,-10);break;case 8:fPosX1 = CSystem::RandomRange(-35, -35 );fPosY1 = CSystem::RandomRange(5,5);break;case 9:fPosX1 = CSystem::RandomRange(-15, -15 );fPosY1 = CSystem::RandomRange(5,5);break;case 10:fPosX1 = CSystem::RandomRange(5, 5 );fPosY1 = CSystem::RandomRange(5,5 );break;case 11:fPosX1 = CSystem::RandomRange(25, 25 );fPosY1 = CSystem::RandomRange(5,5);break;case 12:fPosX1 = CSystem::RandomRange(-35, -35 );fPosY1 = CSystem::RandomRange(20,20);break;case 13:fPosX1 = CSystem::RandomRange(-15, -15 );fPosY1= CSystem::RandomRange(20,20);break;case 14:fPosX1 = CSystem::RandomRange(5, 5 );fPosY1 = CSystem::RandomRange(20,20);break;case 15:fPosX1 = CSystem::RandomRange(25, 25 );fPosY1 = CSystem::RandomRange(20,20);break;}m_psorry->SetSpritePosition(fPosX1,fPosY1);}else{m_psorry->SetSpritePosition(-45,-55);}switch(iDir){case 0:fPosX = CSystem::RandomRange(-35, -35 );fPosY = CSystem::RandomRange(-25,-25);break;case 1:fPosX = CSystem::RandomRange(-15, -15 );fPosY = CSystem::RandomRange(-25,-25);break;case 2:fPosX = CSystem::RandomRange(5, 5 );fPosY = CSystem::RandomRange(-25,-25);break;case 3:fPosX = CSystem::RandomRange(25, 25 );fPosY = CSystem::RandomRange(-25,-25);break;case 4:fPosX = CSystem::RandomRange(-35, -35 );fPosY = CSystem::RandomRange(-10,-10);break;case 5:fPosX = CSystem::RandomRange(-15, -15 );fPosY = CSystem::RandomRange(-10,-10);break;case 6:fPosX = CSystem::RandomRange(5, 5 );fPosY = CSystem::RandomRange(-10,-10);break;case 7:fPosX = CSystem::RandomRange(25, 25 );fPosY = CSystem::RandomRange(-10,-10);break;case 8:fPosX = CSystem::RandomRange(-35, -35 );fPosY = CSystem::RandomRange(5,5);break;case 9:fPosX = CSystem::RandomRange(-15, -15 );fPosY = CSystem::RandomRange(5,5);break;case 10:fPosX = CSystem::RandomRange(5, 5 );fPosY = CSystem::RandomRange(5,5);break;case 11:fPosX = CSystem::RandomRange(25, 25 );fPosY = CSystem::RandomRange(5,5);break;case 12:fPosX = CSystem::RandomRange(-35, -35 );fPosY = CSystem::RandomRange(20,20);break;case 13:fPosX = CSystem::RandomRange(-15, -15 );fPosY = CSystem::RandomRange(20,20);break;case 14:fPosX = CSystem::RandomRange(5, 5 );fPosY = CSystem::RandomRange(20,20);break;case 15:fPosX = CSystem::RandomRange(25, 25 );fPosY = CSystem::RandomRange(20,20);break;}/*sont=m_iCount;sprintf(szName, "dishu_%d", m_iCount);CSprite* tmpSprite=new CSprite(szName);tmpSprite->CloneSprite("dishu");tmpSprite->SetSpritePosition(fPosX, fPosY);//m_vdishu.push_back(*tmpSprite);m_iCount++;Msont=m_iCount;sprintf(name, "dishu_%d", Msont-=2);CSprite* tmpSprite1=new CSprite(name);tmpSprite1->DeleteSprite();}*/m_pDishu->SetSpritePosition(fPosX,fPosY);}
//=============================================================================
//
// 鼠標可控制錘子
void CGameMain::OnMouseMove(const float fMouseX, const float fMouseY)
{if(m_iGameState == 1||m_iGameState == 2){m_pChuizi->SetSpritePosition(fMouseX, fMouseY);}
}
//=============================================================================
//
// 鼠標點擊實現拍打動作
void CGameMain::OnMouseClick(const int iMouseType, const float fMouseX, const float fMouseY)
{if(m_iGameState==0){m_pFengmian->SetSpriteVisible(false);}if(m_iGameState==1||m_iGameState==2){m_pChuizi->SetSpriteRotation(m_fOldRotation-45);m_fRotateTime = 0.2f;}float fPosX,fPosY;fPosX=m_pDishu->GetSpritePositionX();fPosY=m_pDishu->GetSpritePositionY();float fPosX1,fPosY1;fPosX1=m_psorry->GetSpritePositionX();fPosY1=m_psorry->GetSpritePositionY();if(m_pChuizi->IsPointInSprite(fPosX,fPosY)){m_ptexiao->SetSpritePosition(fPosX,fPosY);sum++;m_pScore->SetTextValue(sum);m_pDishu->SetSpritePosition(-45,-45);}if(m_pChuizi->IsPointInSprite(fPosX1,fPosY1)){m_pyanhua->SetSpritePosition(fPosX1,fPosY1);sum+=5;m_pScore->SetTextValue(sum);m_psorry->SetSpritePosition(-45,-55);}
}
Main.cpp
這個文件夜視系統自帶的接口文件,不過有的需要使用
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#include "CommonClass.h"
#include "LessonX.h"///
//
// 主函數入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{// 初始化游戲引擎if( !CSystem::InitGameEngine( hInstance, lpCmdLine ) )return 0;// To do : 在此使用API更改窗口標題CSystem::SetWindowTitle("打地鼠");// 引擎主循環,處理屏幕圖像刷新等工作while( CSystem::EngineMainLoop() ){// 獲取兩次調用之間的時間差,傳遞給游戲邏輯處理float fTimeDelta = CSystem::GetTimeDelta();// 執行游戲主循環g_GameMain.GameMainLoop( fTimeDelta );};// 關閉游戲引擎CSystem::ShutdownGameEngine();return 0;
}//==========================================================================
//
// 引擎捕捉鼠標移動消息后,將調用到本函數
void CSystem::OnMouseMove( const float fMouseX, const float fMouseY )
{// 可以在此添加游戲需要的響應函數g_GameMain.OnMouseMove(fMouseX,fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠標點擊消息后,將調用到本函數
void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戲需要的響應函數g_GameMain.OnMouseClick(iMouseType,fMouseX,fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠標彈起消息后,將調用到本函數
void CSystem::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戲需要的響應函數}
//==========================================================================
//
// 引擎捕捉鍵盤按下消息后,將調用到本函數
// bAltPress bShiftPress bCtrlPress 分別為判斷Shift,Alt,Ctrl當前是否也處于按下狀態。比如可以判斷Ctrl+E組合鍵
void CSystem::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{// 可以在此添加游戲需要的響應函數g_GameMain.OnKeyDown(iKey,bAltPress,bShiftPress,bCtrlPress);
}
//==========================================================================
//
// 引擎捕捉鍵盤彈起消息后,將調用到本函數
void CSystem::OnKeyUp( const int iKey )
{// 可以在此添加游戲需要的響應函數}//===========================================================================
//
// 引擎捕捉到精靈與精靈碰撞之后,調用此函數
void CSystem::OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
}//===========================================================================
//
// 引擎捕捉到精靈與世界邊界碰撞之后,調用此函數.
// iColSide : 0 左邊,1 右邊,2 上邊,3 下邊
void CSystem::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{}
以上就是funcode做的簡單打地鼠游戲的代碼和方法,希望對大家有幫助。