实验内容
海底有五条鱼,其中四条来回随机游动,由玩家用键盘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);	// Ëæ»úËÙ¶È
		}else
		if(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;else
		if(iColSide==1)g_fSpeedRight=0;else
		if(iColSide==2)g_fSpeedTop=0;else g_fSpeedBottom=0;
		Swimming();
	}

}