实验内容
海底有五条鱼,其中四条来回随机游动,由玩家用键盘W A S D控制另外一条游动。
要求如下:
1、游戏初始界面如下图。
2、来回游动的四条鱼,从屏幕左边游进来,均已一个随机速度水平游动。从屏幕右侧游出去,很快又从屏幕右侧游出来,就这样来回游动。
3、玩家用WASD键控制一条鱼向上、左、下、右方向游动。松开按键时,玩家的鱼就停止游动。
4、玩家的鱼游到屏幕边界时,不能继续往前游。
#include <Stdio.h>
#include "CommonAPI.h"
#include "LessonX.h"//
//
int g_iGameState = 1; // ÓÎϷ״̬£¬0 -- ÓÎÏ·½áÊøµÈ´ý¿ªÊ¼×´Ì¬£»1 -- °´Ï¿ոñ¼ü¿ªÊ¼£¬³õʼ»¯ÓÎÏ·£»2 -- ÓÎÏ·½øÐÐÖÐ
//
float g_fScreenLeft = 0.f; // ÆÁÄ»×ó±ß½çÖµ
float g_fScreenRight = 0.f; // ÓÒ
float g_fScreenTop = 0.f; // ÉÏ
float g_fScreenBottom = 0.f; // ÏÂfloat g_fSpeedLeft = 0.f; // ×ó·½ÏòËÙ¶È
float g_fSpeedRight = 0.f; // ÓÒ
float g_fSpeedTop = 0.f; // ÉÏ
float g_fSpeedBottom = 0.f; // ÏÂvoid GameInit();
void GameRun( float fDeltaTime );
void GameEnd();//==============================================================================
//
// ´óÌåµÄ³ÌÐòÁ÷³ÌΪ£ºGameMainLoopº¯ÊýΪÖ÷Ñ»·º¯Êý£¬ÔÚÒýÇæÿ֡ˢÐÂÆÁĻͼÏñÖ®ºó£¬¶¼»á±»µ÷ÓÃÒ»´Î¡£//==============================================================================
//
// ÓÎÏ·Ö÷Ñ»·£¬´Ëº¯Êý½«±»²»Í£µÄµ÷Óã¬ÒýÇæÿˢÐÂÒ»´ÎÆÁÄ»£¬´Ëº¯Êý¼´±»µ÷ÓÃÒ»´Î
// ÓÃÒÔ´¦ÀíÓÎÏ·µÄ¿ªÊ¼¡¢½øÐÐÖС¢½áÊøµÈ¸÷ÖÖ״̬.
// º¯Êý²ÎÊýfDeltaTime : Éϴε÷Óñ¾º¯Êýµ½´Ë´Îµ÷Óñ¾º¯ÊýµÄʱ¼ä¼ä¸ô£¬µ¥Î»£ºÃë
void GameMainLoop( float fDeltaTime )
{switch( g_iGameState ){// ³õʼ»¯ÓÎÏ·£¬Çå¿ÕÉÏÒ»¾ÖÏà¹ØÊý¾Ýcase 1:{GameInit();g_iGameState = 2; // ³õʼ»¯Ö®ºó£¬½«ÓÎϷ״̬ÉèÖÃΪ½øÐÐÖÐ}break;// ÓÎÏ·½øÐÐÖУ¬´¦Àí¸÷ÖÖÓÎÏ·Âß¼case 2:{// TODO Ð޸Ĵ˴¦ÓÎÏ·Ñ»·Ìõ¼þ£¬Íê³ÉÕýÈ·ÓÎÏ·Âß¼if( true ){GameRun( fDeltaTime );}else{// ÓÎÏ·½áÊø¡£µ÷ÓÃÓÎÏ·½áË㺯Êý£¬²¢°ÑÓÎϷ״̬ÐÞ¸ÄΪ½áÊø״̬g_iGameState = 0;GameEnd();}}break;// ÓÎÏ·½áÊø/µÈ´ý°´¿Õ¸ñ¼ü¿ªÊ¼case 0:default:break;};
}//==============================================================================
//
// ÿ¾Ö¿ªÊ¼Ç°½øÐгõʼ»¯£¬Çå¿ÕÉÏÒ»¾ÖÏà¹ØÊý¾Ý
void GameInit()
{g_fScreenLeft=dGetScreenLeft();g_fScreenRight=dGetScreenRight();g_fScreenTop=dGetScreenTop();g_fScreenBottom=dGetScreenBottom();for(int i=0; i<4; i++){char szName[128];float fPosX, fPosY;float fSpeedX;sprintf(szName, "yu_%d", i);dSetSpriteWorldLimit(szName, WORLD_LIMIT_NULL, g_fScreenLeft-20.f, g_fScreenTop, g_fScreenRight+20.f, g_fScreenBottom);fPosX =(float)dRandomRange((int)g_fScreenLeft+10, (int)g_fScreenRight-10);fPosY =(float)dRandomRange((int)g_fScreenTop+10, (int)g_fScreenBottom-10);dSetSpritePosition(szName, fPosX, fPosY);fSpeedX=(float)dRandomRange(10, 20);dSetSpriteLinearVelocity(szName, fSpeedX, 0);}dSetSpriteWorldLimit("fish", WORLD_LIMIT_NULL, g_fScreenLeft, g_fScreenTop, g_fScreenRight, g_fScreenBottom);}
//==============================================================================
//
// ÿ¾ÖÓÎÏ·½øÐÐÖÐ
void GameRun( float fDeltaTime )
{
}
//==============================================================================
//
// ±¾¾ÖÓÎÏ·½áÊø
void GameEnd()
{
}
//==========================================================================
//
// Êó±êÒƶ¯
// ²ÎÊý fMouseX, fMouseY£ºÎªÊó±êµ±Ç°×ø±ê
void OnMouseMove( const float fMouseX, const float fMouseY )
{}
//==========================================================================
//
// Êó±êµã»÷
// ²ÎÊý iMouseType£ºÊó±ê°´¼üÖµ£¬¼û enum MouseTypes ¶¨Òå
// ²ÎÊý fMouseX, fMouseY£ºÎªÊó±êµ±Ç°×ø±ê
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{}
//==========================================================================
//
// Êó±êµ¯Æð
// ²ÎÊý iMouseType£ºÊó±ê°´¼üÖµ£¬¼û enum MouseTypes ¶¨Òå
// ²ÎÊý fMouseX, fMouseY£ºÎªÊó±êµ±Ç°×ø±ê
void OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{}
void Swimming()
{if((g_fSpeedLeft + g_fSpeedRight) > 0.f)dSetSpriteFlipX("fish", false);if((g_fSpeedLeft + g_fSpeedRight) < 0.f)dSetSpriteFlipX("fish", true);dSetSpriteLinearVelocity("fish", g_fSpeedLeft+g_fSpeedRight, g_fSpeedTop+g_fSpeedBottom);
}
//==========================================================================
//
// ¼üÅÌ°´ÏÂ
// ²ÎÊý iKey£º±»°´Ïµļü£¬Öµ¼û enum KeyCodes ºê¶¨Òå
// ²ÎÊý iAltPress, iShiftPress£¬iCtrlPress£º¼üÅÌÉϵŦÄܼüAlt£¬Ctrl£¬Shiftµ±Ç°ÊÇ·ñÒ²´¦ÓÚ°´ÏÂ״̬(0δ°´Ï£¬1°´ÏÂ)
void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{switch(iKey){case KEY_W: {g_fSpeedTop = -10.f;break;}case KEY_A:{g_fSpeedLeft = -15.f; break;}case KEY_S: {g_fSpeedBottom = 10.f;break;}case KEY_D:{g_fSpeedRight = 15.f; break;}default:break;}Swimming();
}
//==========================================================================
//
// ¼üÅ̵¯Æð
// ²ÎÊý iKey£ºµ¯ÆðµÄ¼ü£¬Öµ¼û enum KeyCodes ºê¶¨Òå
void OnKeyUp( const int iKey )
{switch(iKey){case KEY_W:{g_fSpeedTop=0.f;break;}case KEY_S:{g_fSpeedBottom=0.f;break;}case KEY_A:{g_fSpeedLeft=0.f;break;}case KEY_D:{g_fSpeedRight=0.f;break;}}Swimming();
}
//===========================================================================
//
// ¾«ÁéÓ뾫ÁéÅöײ
// ²ÎÊý szSrcName£º·¢ÆðÅöײµÄ¾«ÁéÃû×Ö
// ²ÎÊý szTarName£º±»ÅöײµÄ¾«ÁéÃû×Ö
void OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{}
//===========================================================================
//
// ¾«ÁéÓëÊÀ½ç±ß½çÅöײ
// ²ÎÊý szName£ºÅöײµ½±ß½çµÄ¾«ÁéÃû×Ö
// ²ÎÊý iColSide£ºÅöײµ½µÄ±ß½ç 0 ×ó±ß£¬1 Óұߣ¬2 Éϱߣ¬3 ϱß
void OnSpriteColWorldLimit( const char *szName, const int iColSide )
{bool bFlip;float fSpeedX;float fPosY;if(strstr(szName, "yu_")!=NULL){if(iColSide == 1) // ÓÒ±ß{bFlip = true;fSpeedX = -(float)dRandomRange(10, 20); // Ëæ»úËÙ¶È}elseif(iColSide == 0) // ×ó±ß{bFlip = false;fSpeedX = (float)dRandomRange(10, 20); // Ëæ»úËÙ¶È}dSetSpriteFlipX(szName, bFlip);dSetSpriteLinearVelocity(szName, fSpeedX, 0);// ÿ´Îµ÷ͷʱ£¬Î»ÖÃÊÇËæ»úµÄfPosY =(float)dRandomRange((int)g_fScreenTop+10,(int)g_fScreenBottom-10);dSetSpritePositionY(szName, fPosY);}if(strcmp(szName,"fish")==0){if(iColSide==0)g_fSpeedLeft=0;elseif(iColSide==1)g_fSpeedRight=0;elseif(iColSide==2)g_fSpeedTop=0;else g_fSpeedBottom=0;Swimming();}}