📄 gameplay.c
字号:
/******************************************************************************
*
* 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 + -