⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameplay.c

📁 凌阳32位单片机开发的小游戏
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
 *
 *     The information contained herein is the exclusive property of
 *   Sunplus Technology Co. And shall not be distributed, reproduced,
 *   or disclosed in whole in part without prior written permission.
 *
 *         (C) COPYRIGHT 2005   SUNPLUS TECHNOLOGY CO.
 *                        ALL RIGHTS RESERVED
 *
 * The entire notice above must be reproduced on all authorized copies.
 *
 *****************************************************************************/

/******************************************************************************
 *  Filename:   	GamePlay.c
 *  Author:     	Robin.xjliu  (eMail: xjliu@sunplus.com)
 *  Tel:        	00885-028-87848688-5884
 *  Date:       	2005-11-15
 *  Description:	play loop function
 *  Reference:
 *  Version history:
 *-----------------------------------------------------------------------------
 *	Version   YYYY-MM-DD-INDEX   Modified By         Description
 *	1.0.0     2005-11-15           xjliu               Create
 *
 *****************************************************************************/
#include "Include/GamePlay.h"
#include "Include/Play_ManageFish.h"
#include "../GameData/MotionData.h"

//extern MOTION *pFish4;
extern U16 nHMovementCnt;
extern bool g_bHMovementFlag;
extern const U32 Sp_BackupPalette[];
extern S16	iTextCount_Y[];
#define START_Y	160

#define CHECK_DIRECTION(A, ptr, flag)	flag = ((A != ptr)?false:flag)

U8 nPlayState;
//actor management
MOTION *pPlayer;
U8		g_nPlayerVx;
U8		g_nPlayerVy;
U8		g_nPlayerAx;
U8		g_nPlayerAy;
bool	g_bMoveFlag_X;
bool	g_bMoveFlag_Y;
U8		g_nScreenStep_X;
U8		g_nScreenStep_Y;
U8		g_nPlayerLevel;
U8		g_nPlayerState;
U8		g_nOldPlayerState;

U8		g_nDeathCnt;
U8		g_nInvincibleCnt;
bool	g_bInvincibleFlag;
U8		StepX,StepY;
U8		g_nText3Mode;

U8		g_nScore;
bool	g_bScoreColor;
bool	g_bCompleteColor;

MOTION *pMenu;
MOTION *pSelectBox;
U8		g_nMenuID;
//bool	g_bMenuColor = false;

/*U8		g_nShakeTime = 1;
U8		g_nShakeCnt = 0;
const S8 aShakeValue[] = {
	0, -5,
	5, 5,
	-5, 0,
	5, -5,
	0, 5,
	-5, -5,
	5, 0,
	-5, 5,
	0, 0,
};*/

const U16 PlayStep[] = {
	0,
	1,1,1,1,1,
	2,2,2,2,3,
	3,3,4,4,4,
	5,5,5,6,6,
	7,7,8,8,9,
	10,11,12,13,14,
	15,16,17,18,19,
	20};
const U8 Fish2_1_EatBox[] = {
	47, 101, 63, 134,
	128, 101, 144, 134,
};
const U8 Fish3_1_EatBox[] = {
	27, 66, 44, 126,
	147, 66, 164, 126,
	29, 63, 47, 104,
	144, 63, 162, 104,
};
const U16 Fish4_1_EatBox[] = {
	29+10, 138, 70+10, 230,
	313-10, 138, 354-10, 230,
};
const U8 Actor_EatBox[] = {
	31-5, 64-5, 42+5, 96+5,
	85-5, 64-5, 96+5, 96+5,
	37, 90, 64, 146,
	127, 90, 154, 146,
};

const S8 pScanline[] = {
0,1,1,2,4,5,6,10,11,14,13,12,10,11,12,13,14,15,19,20,21,18,17,15,13,12,11,10,10,10,9,8,7,6,3,2,1,0,0,1,
0,1,1,2,4,5,6,10,11,14,13,12,10,11,12,13,14,15,19,20,21,18,17,15,13,12,11,10,10,10,9,8,7,6,3,2,1,0,0,1,
};

U8	g_nTrackCnt;
const S8 aTrack[] = {
	  2,   4,   6,   8,  10,  12,  14,  16,  18,  20,
	 22,  24,  26,  28,  30,  32,  34,  //36,  38,  40,
	-20, -18, -16, -14, -12, -10,  -8,  -6,  -4,  -2,
	  0,   2,   4,   6,   8,  10,  12,  14,  16,  18,
	 20, -14, -12, -10,  -8,  -6,  -4,  -2,   0,   2,
	  4,   6,   8,  10,  12,  14,  -8,  -6,  -4,  -2,
	  0,   2,   4,   6,   8,  -4,  -2,   0,   2,   4,
	 -3,  -2,  -1,   0,   1,   2,   3,  -2,  -1,   0,
	  1,   2,  -1,   0,   1,
};

const LOAD_INFO LoadPlayInfo[] =
{
	{".\\Game\\CeShow\\Game_Index1.bin"		, TEXT1_PNT_ADDR	, O_RDONLY, 0x4000  },
	{".\\Game\\CeShow\\Game_Index2.bin"		, TEXT2_PNT_ADDR	, O_RDONLY, 0x4000  },
	{".\\Game\\CeShow\\Game_Index3.bin"		, TEXT3_PNT_ADDR	, O_RDONLY, 0x4000  },
	{".\\Game\\CeShow\\Game_Pixel1.bin"		, TEXT1_PGT_ADDR	, O_RDONLY, 0x100000},
	{".\\Game\\CeShow\\Game_Pixel2.bin"		, TEXT2_PGT_ADDR	, O_RDONLY, 0x100000},
	{".\\Game\\CeShow\\Game_Pixel3.bin"		, TEXT3_PGT_ADDR	, O_RDONLY, 0x100000},
	{".\\Game\\CeShow\\Game_Palette.bin"	 	, BG_PAL_ADDR   	, O_RDONLY, 0x4000  },
	{".\\Game\\CeShow\\Game_TextHeader.bin" 	, TEXT_HEADER_ADDR	, O_RDONLY, 0x8000  },
	//{".\\SpriteCell_Game.bin"	, SP_PGT_ADDR		, O_RDONLY, 0x479400},//0x479400
};

/**
 * Play_ProcessEvent - .
 */
void Play_InitVariable(void)
{
	U8 i;

	for (i = 0; i < 3; i ++)
	{
		g_aTextPos_X[i] = 192;
		g_aTextPos_Y[i] = 0;
		g_aPNTPtrFlag[i] = 0;
		iTextCount_Y[i] = 0;
	}
	//set screen start location
	*P_PPU_TX1_N_PTR = *P_PPU_TX1_N_PTR + 32 * 2 * 5;
	*P_PPU_TX1_Attribute = ((*P_PPU_TX1_Attribute) & 0x9FFF) | 0x0000;
	*P_PPU_TX2_N_PTR = *P_PPU_TX2_N_PTR + 32 * 2 * 5;
	*P_PPU_TX2_Attribute = ((*P_PPU_TX2_Attribute) & 0x9FFF) | 0x2000;
	*P_PPU_TX1_Control = 0x000a;
	*P_PPU_TX2_Control = 0x000a;
	*P_PPU_TX1_X = 192;
	*P_PPU_TX2_X = 192;
	if ( g_nText3Mode )
	{
		//*P_PPU_TX3_N_PTR = *P_PPU_TX3_N_PTR + 32 * 2 * 5;
		*P_PPU_TX3_Attribute = ((*P_PPU_TX3_Attribute) & 0x9FFF) | 0x6000;
		(*P_PPU_TX3_Control)=0x011a;
		(*P_PPU_TX3_Blending)=45;
		*P_PPU_TX3_X = 192;
	}
	else
	{
		*P_PPU_TX3_X = 0;
		*P_PPU_TX3_Y = 0;
		g_aTextPos_X[TEXT3] = 0;
		g_aTextPos_Y[TEXT3] = 0;
		g_aPNTPtrFlag[TEXT3] = 0;
		iTextCount_Y[TEXT3] = 0;
	}

	g_nPlayerVx = 0;
	g_nPlayerVy = 0;
	g_nPlayerAx = 0;
	g_nPlayerAy = 0;
	g_bMoveFlag_X = false;
	g_bMoveFlag_Y = false;
	g_nScreenStep_X = 0;
	g_nScreenStep_Y = 0;

	g_nInvincibleCnt = 0;
	g_bInvincibleFlag = true;

//	g_nScore = 0;
	g_bScoreColor = false;
	g_bCompleteColor = false;
}

/**
 * Play_ProcessEvent - .
 */
CMD* Play_ProcessEvent(void)
{
	CMD *pCmd;
	
	Key_Index = LCD_KEYMIDDLE;
	if (g_stEvent.Ev_Key == VK_LEFT)
	{
		CHECK_DIRECTION(g_nPlayerAx, TO_LEFT, g_bMoveFlag_X);
		if ( g_nPlayerAx == TO_LEFT )
		{
			g_nPlayerVx = PLAY_MAX_VEL;
		}
		g_nPlayerAx = TO_LEFT;
		Key_Index = LCD_KEYLEFT;
	}
	if (g_stEvent.Ev_Key == VK_RIGHT)
	{
		CHECK_DIRECTION(g_nPlayerAx, TO_RIGHT, g_bMoveFlag_X);
		if ( g_nPlayerAx == TO_RIGHT )
		{
			g_nPlayerVx = PLAY_MAX_VEL;
		}
		g_nPlayerAx = TO_RIGHT;
		Key_Index = LCD_KEYRIGHT;
	}
	if (g_stEvent.Ev_Key == VK_UP)
	{
		CHECK_DIRECTION(g_nPlayerAy, TO_UP, g_bMoveFlag_Y);
		if ( g_nPlayerAy != TO_UP )
		{
			g_nPlayerVy = (g_nPlayerVy>>1);
		}
		else
		{
			g_nPlayerVy = PLAY_MAX_VEL;
		}		
		g_nPlayerAy = TO_UP;
		Key_Index = LCD_KEYUP;
	}
	if (g_stEvent.Ev_Key == VK_DOWN)
	{
		CHECK_DIRECTION(g_nPlayerAy, TO_DOWN, g_bMoveFlag_Y);
		if ( g_nPlayerAy != TO_DOWN )
		{
			g_nPlayerVy = (g_nPlayerVy>>1);
		}
		else
		{
			g_nPlayerVy = PLAY_MAX_VEL;
		}		
		g_nPlayerAy = TO_DOWN;
		Key_Index = LCD_KEYDOWN;
	}

	if (g_stEvent.Ev_Key == VK_LEFTUP)
	{
		CHECK_DIRECTION(g_nPlayerAx, TO_LEFT, g_bMoveFlag_X);
		CHECK_DIRECTION(g_nPlayerAy, TO_UP, g_bMoveFlag_Y);
		if ( g_nPlayerAx == TO_LEFT )
		{
			g_nPlayerVx = PLAY_MAX_VEL;
		}
		g_nPlayerAx = TO_LEFT;
		if ( g_nPlayerAy != TO_UP )
		{
			g_nPlayerVy = (g_nPlayerVy>>1);
		}
		else
		{
			g_nPlayerVy = PLAY_MAX_VEL;
		}
		g_nPlayerAy = TO_UP;
		Key_Index = LCD_KEYLEFTUP;
	}
	if (g_stEvent.Ev_Key == VK_RIGHTUP)
	{
		CHECK_DIRECTION(g_nPlayerAx, TO_RIGHT, g_bMoveFlag_X);
		CHECK_DIRECTION(g_nPlayerAy, TO_UP, g_bMoveFlag_Y);
		if ( g_nPlayerAx == TO_RIGHT )
		{
			g_nPlayerVx = PLAY_MAX_VEL;
		}
		g_nPlayerAx = TO_RIGHT;
		if ( g_nPlayerAy != TO_UP )
		{
			g_nPlayerVy = (g_nPlayerVy>>1);
		}
		else
		{
			g_nPlayerVy = PLAY_MAX_VEL;
		}
		g_nPlayerAy = TO_UP;
		Key_Index = LCD_KEYRIGHTUP;
	}
	if (g_stEvent.Ev_Key == VK_LEFTDOWN)
	{
		CHECK_DIRECTION(g_nPlayerAx, TO_LEFT, g_bMoveFlag_X);
		CHECK_DIRECTION(g_nPlayerAy, TO_DOWN, g_bMoveFlag_Y);
		if ( g_nPlayerAx == TO_LEFT )
		{
			g_nPlayerVx = PLAY_MAX_VEL;
		}
		g_nPlayerAx = TO_LEFT;
		if ( g_nPlayerAy != TO_DOWN )
		{
			g_nPlayerVy = (g_nPlayerVy>>1);
		}
		else
		{
			g_nPlayerVy = PLAY_MAX_VEL;
		}
		g_nPlayerAy = TO_DOWN;
		Key_Index = LCD_KEYLEFTDOWN;
	}
	if (g_stEvent.Ev_Key == VK_RIGHTDOWN)
	{
		CHECK_DIRECTION(g_nPlayerAx, TO_RIGHT, g_bMoveFlag_X);
		CHECK_DIRECTION(g_nPlayerAy, TO_DOWN, g_bMoveFlag_Y);
		if ( g_nPlayerAx == TO_RIGHT )
		{
			g_nPlayerVx = PLAY_MAX_VEL;
		}
		g_nPlayerAx = TO_RIGHT;
		if ( g_nPlayerAy != TO_DOWN )
		{
			g_nPlayerVy = (g_nPlayerVy>>1);
		}
		else
		{
			g_nPlayerVy = PLAY_MAX_VEL;
		}
		g_nPlayerAy = TO_DOWN;
		Key_Index = LCD_KEYRIGHTDOWN;
	}

	return pCmd;
}

/**
 * Play_ProcessInput - .
 */
void Play_ProcessInput(void)
{
	//input service
#if defined(INPUT_SENSOR) || defined(INPUT_TOUCHPANEL)
	//check joystick firstly
	if (g_Joystick_KeyCode1)
	{
		E_InputService(EV_JOYSTICK);
	}
	else
	{
		E_InputService(EV_SENSOR);
	}
#else
	//check joystick
	E_InputService(EV_JOYSTICK);
#endif
}

/**
 * Play_ActorMove - .
 */
void Play_ActorMove()
{
	U16 tempX,tempY;

	tempX = ((pPlayer->pSprite->pFrame->stSize.width - ACTOR0_WIDTH) >> 1);
	tempY = ((pPlayer->pSprite->pFrame->stSize.height - ACTOR0_HEIGHT) >> 1);
	
	if (!g_bMoveFlag_X)
	{
		if (g_nPlayerAx)
		{//right
			pPlayer->pSprite->stPos.x += PlayStep[g_nPlayerVx];
			if ( (pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width
				- tempX) > SCREEN_WIDTH - BLOCK_X
				&& g_aTextPos_X[TEXT2] != SCREENBUFF_WIDTH - SCREEN_WIDTH)
			{//screen can scroll, so sprite move end
				StepX = (pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width - tempX) - (SCREEN_WIDTH - BLOCK_X);
				pPlayer->pSprite->stPos.x -= StepX;
				g_bMoveFlag_X = true;
			}
			else
			{//screen can't scroll, so sprite move
				if ( (pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width
					- tempX) > SCREEN_WIDTH)
				{
					pPlayer->pSprite->stPos.x = SCREEN_WIDTH + tempX - pPlayer->pSprite->pFrame->stSize.width;
				}
			}
		}
		else
		{//left
			pPlayer->pSprite->stPos.x -= PlayStep[g_nPlayerVx];
			if (pPlayer->pSprite->stPos.x + tempX < BLOCK_X && g_aTextPos_X[TEXT2] != 0)
			{//screen can scroll, so sprite move end
				StepX = BLOCK_X - (pPlayer->pSprite->stPos.x + tempX);
				pPlayer->pSprite->stPos.x += StepX;
				g_bMoveFlag_X = true;
			}
			else
			{//screen can't scroll, so sprite move
				if (pPlayer->pSprite->stPos.x + tempX < 0)
				{
					pPlayer->pSprite->stPos.x = -tempX;
				}
			}
		}
	}

	if (!g_bMoveFlag_Y)
	{
		if (g_nPlayerAy)
		{//down
			pPlayer->pSprite->stPos.y += PlayStep[g_nPlayerVy];
			if ( (pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height
				- tempY) > SCREEN_HEIGHT - BLOCK_Y
				&& iTextCount_Y[TEXT2] != START_Y - 1)
			{//screen can scroll, so sprite move end
				StepY = (pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height - tempY) - (SCREEN_HEIGHT - BLOCK_Y);
				pPlayer->pSprite->stPos.y -= StepY;
				g_bMoveFlag_Y = true;
			}
			else
			{//screen can't scroll, so sprite move
				if ( (pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height
					- tempY) > SCREEN_HEIGHT)
				{
					pPlayer->pSprite->stPos.y = SCREEN_HEIGHT + tempY - pPlayer->pSprite->pFrame->stSize.height;
				}
			}
		}
		else
		{//up
			pPlayer->pSprite->stPos.y -= PlayStep[g_nPlayerVy];
			if (pPlayer->pSprite->stPos.y + tempY < BLOCK_Y 
				&& iTextCount_Y[TEXT2] != -(START_Y - 1))
			{//screen can scroll, so sprite move end
				StepY = BLOCK_Y - (pPlayer->pSprite->stPos.y + tempY);
				pPlayer->pSprite->stPos.y += StepY;
				g_bMoveFlag_Y = true;
			}
			else
			{//screen can't scroll, so sprite move
				if (pPlayer->pSprite->stPos.y + tempY < 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -