📄 mmigame.c
字号:
hWin = TetrisCreate (hParentWin);
if (hWin NEQ NULL)
{
SEND_EVENT (hWin, E_INIT, NULL, NULL);
}
return 1;
}
void initTetrisData( T_TETRIS *data );
static MfwHnd TetrisCreate(MfwHnd hParentWin)
{
T_TETRIS *psData = (T_TETRIS *)ALLOC_MEMORY (sizeof( T_TETRIS));
MfwWin *psWin;
MfwWinAttr *win_attr;
TRACE_FUNCTION ("TetrisCreate()");
if (psData == NULL)
{
TRACE_EVENT ("ALLOC_MEMORY() failed");
return NULL;
}
win_attr = (MfwWinAttr *) ALLOC_MEMORY (sizeof(MfwWinAttr));
if (win_attr)
{
win_attr->win.px = 0;
win_attr->win.py = 0;
win_attr->win.sx = SCREEN_SIZE_X;
win_attr->win.sy = SCREEN_SIZE_Y;
}
psData->win = winCreate (hParentWin, win_attr, E_WIN_VISIBLE, (T_MFW_CB)TetrisWinCb);
if (psData->win == NULL)
{
mfwFree((U8*) win_attr, sizeof(MfwWinAttr));
FREE_MEMORY((void *)psData, sizeof (T_TETRIS));
return NULL;
}
psData->mmi_control.dialog = (T_DIALOG_FUNC)TetrisExecCb;
psData->mmi_control.data = psData;
psData->timeStep = 150;
psData->maxDropTime = 120;
psData->dropTime = psData->maxDropTime;
psWin = ((MfwHdr *)psData->win)->data;
psWin->user = (void *)psData;
psData->parent_win = hParentWin;
initTetrisData( psData );
return psData->win;
}
static int TetrisWinCb (MfwEvt uiE, MfwWin *psWin)
{
T_TETRIS *psData = (T_TETRIS *)psWin->user;
TRACE_FUNCTION ("TetrisWinCb()");
switch (uiE)
{
case MfwWinVisible:
dspl_ResetWindow();
dspl_SetBgdColour(0x000000FF);
dspl_Clear(0,0,SCREEN_SIZE_X-1,SCREEN_SIZE_Y-1 );
tetris_drawScreen( 1, psData);
break;
case MfwWinFocussed:
case MfwWinDelete:
default:
return MFW_EVENT_REJECTED;
}
TRACE_FUNCTION ("TetrisWinCb() - end");
return MFW_EVENT_CONSUMED;
}
static void TetrisExecCb (MfwHnd hWin, USHORT uiE, SHORT iValue, void *pParameter)
{
MfwWin *psWin = ((MfwHdr *) hWin)->data;
T_TETRIS *psData = (T_TETRIS *)psWin->user;
TRACE_FUNCTION ("TetrisExecCb()");
switch (uiE)
{
case E_INIT:
psData->info_tim = timCreate(hWin, psData->timeStep, (MfwCb)tetris_tim_cb);
psData->hKbd = kbdCreate(psData->win, KEY_ALL, (MfwCb)TetrisKbdCb);
timStart(psData->info_tim);
/* */
winShow(hWin);
break;
case E_EXIT:
tetris_destroy(hWin);
break;
default:
return;
}
return;
}
static int tetris_checkPos( T_TETRIS *data, int px, int py, char* shape)
{
int x,y;
for (x=0;x<4;x++)
for (y=0;y<4;y++)
if (shape[x+y*4] != ' ')
{
if (data->tetrisScreen[px+x][py+y]!= ' ')
return(1);
}
return(0);
}
static int tetris_moveDown(T_TETRIS *data,int *px, int *py)
{
int cannotMove;
cannotMove = tetris_checkPos(data,*px,*py+1,data->shapeStr);
if (cannotMove)
return (1);
else
*py = *py+1;
return (0);
}
static int tetris_moveLeft(T_TETRIS *data, int *px, int *py)
{
int cannotMove;
cannotMove = tetris_checkPos(data,*px-1,*py,data->shapeStr);
if (cannotMove)
return (1);
else
*px = *px-1;
return (0);
}
static int tetris_moveRight( T_TETRIS *data, int *px, int *py)
{
int cannotMove;
cannotMove = tetris_checkPos(data,*px+1,*py,data->shapeStr);
if (cannotMove)
return (1);
else
*px = *px+1;
return (0);
}
static int tetris_rotateLeft( T_TETRIS *data, int *px, int *py )
{
int i;
int cannotMove;
char tmpShape[20];
tetris_getShape(data->shapeId,(data->rotateId+1)%4,tmpShape);
cannotMove = tetris_checkPos(data,*px,*py,tmpShape);
if (cannotMove)
return (1);
for (i=0;i<16;i++)
data->shapeStr[i] = tmpShape[i];
data->rotateId = (data->rotateId+1)%4;
return (0);
}
static int tetris_rotateRight( T_TETRIS *data, int *px, int *py )
{
int i;
int cannotMove;
char tmpShape[20];
tetris_getShape(data->shapeId,(data->rotateId+3)%4,tmpShape);
cannotMove = tetris_checkPos(data,*px,*py,tmpShape);
if (cannotMove)
return (1);
for (i=0;i<16;i++)
data->shapeStr[i] = tmpShape[i];
data->rotateId = (data->rotateId+3)%4;
return (0);
}
#define KEY_TET_MOVELEFT KCD_1
#define KEY_TET_MOVERIGHT KCD_3
#define KEY_TET_ROTATELEFT KCD_4
#define KEY_TET_ROTATERIGHT KCD_6
#define KEY_TET_DROPALL KCD_5
#define KEY_TET_DROP KCD_2
static int TetrisKbdCb (MfwEvt uiE, MfwKbd *psK)
{
MfwHnd hWin = mfwParent(mfwHeader());
MfwWin *psWin = ((MfwHdr *)hWin)->data;
T_TETRIS *psData = (T_TETRIS *)psWin->user;
int cannotMove=0;
char dbg[80];
TRACE_FUNCTION ("TetrisKbdCb()");
sprintf(dbg,"Code : %d",(int)psK->code);
TRACE_FUNCTION (dbg);
switch(psK->code )
{
case KEY_TET_MOVELEFT:
case KCD_MNULEFT:
tetris_moveLeft(psData,&psData->px,&psData->py);
break;
case KEY_TET_MOVERIGHT:
case KCD_MNURIGHT:
tetris_moveRight(psData,&psData->px,&psData->py);
break;
case KEY_TET_ROTATELEFT:
tetris_rotateLeft(psData,&psData->px,&psData->py);
break;
case KCD_MNUSELECT:
case KEY_TET_ROTATERIGHT:
tetris_rotateRight(psData,&psData->px,&psData->py);
break;
case KEY_TET_DROP:
cannotMove = tetris_moveDown(psData,&psData->px,&psData->py);
if (cannotMove)
tetris_testGameOver( psData );
break;
case KEY_TET_DROPALL:
while(tetris_moveDown(psData,&psData->px,&psData->py) ==0)
{ //loop until we hit the bottom
}
cannotMove = 1;
tetris_testGameOver( psData );
break;
case KCD_RIGHT:
SEND_EVENT (hWin, E_EXIT, 0, 0);
return MFW_EVENT_CONSUMED;
default:
return MFW_EVENT_CONSUMED;
}
tetris_drawScreen(cannotMove, psData);
TRACE_FUNCTION ("TetrisKbdCb()-end");
return MFW_EVENT_CONSUMED;
}
static int tetris_tim_cb(MfwEvt e, MfwTim *t)
{
T_MFW_HND win = mfw_parent (mfw_header());
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
T_TETRIS * data = (T_TETRIS *)win_data->user;
static int nCycles = 0;
int cannotMove;
char bfr[80];
nCycles = nCycles+ data->timeStep;
if (nCycles > 1000)
{
nCycles = nCycles - 1000;
data->maxDropTime = data->maxDropTime-1;
}
TRACE_EVENT("tetris_tim_cb");
data->dropTime = data->dropTime - data->timeStep;
if (data->dropTime < 0)
{
if (data->maxDropTime > 90)
data->dropTime = data->dropTime+75*10;
else if (data->maxDropTime > 60)
data->dropTime = data->dropTime+(60+(data->maxDropTime-60)/2)*10;
else if (data->maxDropTime > 30)
data->dropTime = data->dropTime+data->maxDropTime*10;
else
data->dropTime = data->dropTime+(data->maxDropTime+90)/4*10;
if (data->dropTime < data->timeStep)
data->dropTime = data->timeStep;
else if (data->dropTime < data->timeStep)
data->dropTime = data->timeStep;
resources_setColour(COLOUR_GAME);
sprintf(bfr,"%d ",data->score);
dspl_TextOut(SCREEN_SIZE_X-30 ,10, 0, bfr);
sprintf(bfr,"%d ",data->linesToGo);
dspl_TextOut(SCREEN_SIZE_X-30 ,12+Mmi_layout_line_height(), 0, bfr);
resources_restoreColour();
cannotMove = tetris_moveDown(data,&data->px,&data->py);
tetris_getNextShapeId( );//To randomize it
if (cannotMove)
{
tetris_testGameOver( data );
}
tetris_drawScreen(cannotMove, data);
}
timStart(data->info_tim);
TRACE_EVENT("tetris_tim_cb-end");
return 1;
}
T_MFW_HND Game_Info(T_MFW_HND parent_window)
{
T_MFW_HND win = ShowGame_Information(parent_window);
TRACE_FUNCTION("ShowVerion()");
if (win NEQ NULL)
{
SEND_EVENT (win, SHOWGAMEINFO_INIT, 0, 0);
}
return win;
}
static T_MFW_HND ShowGame_Information(MfwHnd parent_window)
{
tShowInfo* data = (tShowInfo*)ALLOC_MEMORY (sizeof (tShowInfo));
T_MFW_WIN* win;
if (data EQ NULL)
{
return NULL;
}
// Create the window handler
data->win = win_create (parent_window, 0, E_WIN_VISIBLE, NULL);
if (data->win EQ NULL)
{
return NULL;
}
// connect the dialog data to the MFW window
data->mmi_control.dialog = (T_DIALOG_FUNC)ShowGame_DialogCB;
data->mmi_control.data = data;
win = ((T_MFW_HDR *)data->win)->data;
win->user = (void *)data;
data->parent_win = parent_window;
return data->win;
}
static void ShowGame_DialogCB(T_MFW_HND win, USHORT e, SHORT identifier, void *parameter)
{
T_MFW_WIN *win_data = ((T_MFW_HDR *) win)->data;
tShowInfo* data = (tShowInfo*) win_data->user;
/* SPR#1428 - SH - New editor data */
#ifdef NEW_EDITOR
T_AUI_EDITOR_DATA editor_data;
#else /* NEW_EDITOR */
T_EDITOR_DATA editor_data;
#endif /* NEW_EDITOR */
switch (e)
{
case SHOWGAMEINFO_INIT:
{
strcat(data->buffer, info);
ShowGameInfoEditor(win);
/* SPR#1428 - SH - New editor changes */
#ifdef NEW_EDITOR
data->editor_data.Callback = (T_AUI_EDIT_CB)ShowInfoCB;
AUI_edit_Start(win, &(data->editor_data));
#else /* NEW_EDITOR */
data->editor_data.Callback = (T_EDIT_CB)ShowInfoCB;
editor_start(win, &(data->editor_data));
#endif /* NEW_EDITOR */
winShow(data->win);
}
break;
default:
{
TRACE_EVENT("Show Game Info : Unknown Event");
}
break;
}
}
void ShowGameInfoEditor (T_MFW_HND win)
{
T_MFW_WIN *win_data = ((T_MFW_HDR *) win)->data;
tShowInfo* data = (tShowInfo*) win_data->user;
/* SPR#1428 - SH - New editor changes */
#ifdef NEW_EDITOR
AUI_edit_SetDefault(&data->editor_data);
AUI_edit_SetDisplay(&data->editor_data, NULL, COLOUR_EDITOR, EDITOR_FONT);
AUI_edit_SetTextStr(&data->editor_data, TxtSoftBack, TxtNull, TxtNull, NULL);
AUI_edit_SetEvents(&data->editor_data, 0, TRUE, FOREVER, NULL);
AUI_edit_SetBuffer(&data->editor_data, ATB_DCS_ASCII, (UBYTE *)data->buffer, 35);
AUI_edit_SetMode(&data->editor_data, ED_MODE_READONLY, ED_CURSOR_NONE);
#else /* NEW_EDITOR */
editor_attr_init(&((data->editor_data).editor_attr), NULL, edtCurNone, 0, (char*)data->buffer, 35, COLOUR_EDITOR);
editor_data_init(&data->editor_data, NULL, TxtSoftBack, TxtNull, 0, 1, READ_ONLY_MODE, FOREVER);
data->editor_data.hide = FALSE;
data->editor_data.Identifier = 0;
data->editor_data.TextString = NULL;
data->editor_data.destroyEditor = TRUE;
#endif /* NEW_EDITOR */
}
static void ShowInfoCB( T_MFW_HND win, USHORT Identifier,UBYTE reason)
{
T_MFW_WIN *win_data = ( (T_MFW_HDR *) win )->data;
tShowInfo*data = (tShowInfo*) win_data->user;
TRACE_FUNCTION("ShowVerionCB()");
switch (reason )
{
case INFO_KCD_LEFT:
case INFO_KCD_HUP:
case INFO_KCD_RIGHT:
default:
showGameInfo_destroy(data->win);
break;
}
}
/*******************************************************************************
$Function: showVersion_destroy
$Description: Destroys the editor
$Returns:
$Arguments:
*******************************************************************************/
void showGameInfo_destroy(MfwHnd own_window)
{
T_MFW_WIN * win_data;
tShowInfo* data = NULL;
if (own_window == NULL)
{
TRACE_EVENT ("Error : showGameInfo_destroy called with NULL Pointer");
return;
}
win_data = ((T_MFW_HDR *)own_window)->data;
if (win_data != NULL)
data = (tShowInfo*)win_data->user;
if (data)
{
TRACE_EVENT ("calc_destroy()");
win_delete (data->win);
// Free Memory
FREE_MEMORY ((void *)data, sizeof (tShowInfo));
}
else
{
TRACE_EVENT ("calc_destroy() called twice");
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -