亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gamewnd.c

?? brew學習
?? C
字號:
#include "GameWnd.h"

#include "AEEStdLib.h"
#include "AEEAppGen.h"

#include "pfly_res.h"
#include "pfly.h"
#include "commondef.h"

#define MAX_HEIGHT			12800
#define WALL_START_POS_Y	150
#define SCORE_START_X		9
#define DIGIT_WEIGHT		7		

//rgCmds中各種對象的索引
#define SPRITE_DIGIT		8
#define SPRITE_PLANE		12

//各種對象的源圖像貼索引
#define PIC_START_DIGIT		15
#define PIC_START_WALL		13

//紙飛機在不同飛行角度下的速度表
static const uint16 speedTableX[] = {-4, -3, -3, -2, -1, 0, 1, 2, 3, 3, 4};
static const uint16 speedTableY[] = { 3,  3,  4,  4,  5, 6, 5, 4, 4, 3, 3}; 

static int GameWnd_LoadResources(GameWnd *pthis);
static void GameWnd_UnloadResources(GameWnd *pthis);
static boolean GameWnd_HandleKeyEvent(GameWnd *pthis, AEEEvent eCode, uint16 wParam);
static void GameWnd_NextFrame(GameWnd *pthis);
static boolean GameWnd_IsCrash(GameWnd *pthis);
static void GameWnd_LoadSprites(GameWnd *pthis, const char * pszFile, 
				uint16 resID, uint8 unSpriteSize, boolean isTile);
static int16 Random(int16 range);

boolean GameWnd_New(GameWnd *pthis, PflyApp* pMe)
{
	pthis->pMe = pMe;

	return TRUE;
}

boolean GameWnd_HandleEvent(GameWnd * pthis, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	switch (eCode) {
	case EVT_APP_SUSPEND:
		CALLBACK_Cancel(&pthis->cbTimer);
		return TRUE;
		
	case EVT_APP_RESUME:
		ISHELL_SetTimerEx(pthis->pMe->a.m_pIShell, 0, &pthis->cbTimer);
		return TRUE;
		
	case EVT_APP_NO_SLEEP:
		// catching this event prevent BREW from going to "sleep"
		return TRUE;
		
	default:
		return GameWnd_HandleKeyEvent(pthis, eCode, wParam);		 
	}
}

boolean GameWnd_Open(GameWnd *pthis)
{
	AEEDeviceInfo di;
	int i;
	int8 gridCntX;
	
	pthis->direction = 5;
	pthis->keyLeft = FALSE;
	pthis->keyRight = FALSE;
	pthis->layer = 0;
	pthis->crashCounter = 0;
	pthis->isCrash = FALSE;
	
	ISHELL_GetDeviceInfo(pthis->pMe->a.m_pIShell, &di);
	
	gridCntX = ((di.cxScreen+12)/16 > 9) ? 9 : (di.cxScreen+12)/16;
	
	//tile索引數組
	MEMSET(pthis->BackGroundLayer,0,sizeof(pthis->BackGroundLayer));
    pthis->BackGroundLayer[0] = 2;
	pthis->BackGroundLayer[gridCntX-1] = 1;
	pthis->BackGroundLayer[gridCntX] = 3;
	pthis->BackGroundLayer[15] = 3;
	
	pthis->frameMax.x = gridCntX*16;
	pthis->frameMax.y = 256;
	
	pthis->frameStart.x = (di.cxScreen - pthis->frameMax.x)/2;
	pthis->frameStart.y = 0;
	
	CALLBACK_Init(&pthis->cbTimer, GameWnd_NextFrame, pthis);
	
	//sprite
	MEMSET(pthis->rgCmds, 0, sizeof(pthis->rgCmds));
	
	//score digit
	for (i = SPRITE_DIGIT; i < 4+SPRITE_DIGIT; i++) {
		pthis->rgCmds[i].x = pthis->frameStart.x 
			+ SCORE_START_X + (i-SPRITE_DIGIT)*DIGIT_WEIGHT; 
		pthis->rgCmds[i].y = pthis->frameStart.y + 0;
		pthis->rgCmds[i].unSpriteIndex = PIC_START_DIGIT;
		pthis->rgCmds[i].unSpriteSize = SPRITE_SIZE_16X16;
		pthis->rgCmds[i].unComposite = 0;
		pthis->rgCmds[i].unLayer = 2;
	}
	
	//wall
	for (i = 0; i < 4; i++) {
		pthis->rgCmds[i].x = pthis->frameStart.x 
			+ 4 + Random((int16) (pthis->frameMax.x - 8 - 32));
		pthis->rgCmds[i].y = WALL_START_POS_Y + 56*i;
		pthis->rgCmds[i].unSpriteIndex = PIC_START_WALL;
		pthis->rgCmds[i].unSpriteSize = SPRITE_SIZE_16X16;
		pthis->rgCmds[i].unComposite = 0;
		pthis->rgCmds[i].unLayer = 0;
		
		pthis->rgCmds[i+4].x = pthis->rgCmds[i].x + 16;
		pthis->rgCmds[i+4].y = pthis->rgCmds[i].y;
		pthis->rgCmds[i+4].unSpriteIndex = PIC_START_WALL+1;
		pthis->rgCmds[i+4].unSpriteSize = SPRITE_SIZE_16X16;
		pthis->rgCmds[i+4].unComposite = 0;
		pthis->rgCmds[i+4].unLayer = 0;
	}
	
	//plane
	pthis->rgCmds[SPRITE_PLANE].x = pthis->frameStart.x + 50;
	pthis->rgCmds[SPRITE_PLANE].y = pthis->frameStart.y + 40;
	pthis->rgCmds[SPRITE_PLANE].unSpriteIndex = pthis->direction;
	pthis->rgCmds[SPRITE_PLANE].unSpriteSize = SPRITE_SIZE_16X16;
	pthis->rgCmds[SPRITE_PLANE].unComposite = 0;
	pthis->rgCmds[SPRITE_PLANE].unLayer = 1;
	
	//terminator
	pthis->rgCmds[SPRITE_PLANE+1].unSpriteSize = SPRITE_SIZE_END;
	
	//tile
	MEMSET(pthis->rgMaps, 0, sizeof(pthis->rgMaps));
	
	pthis->rgMaps[0].pMapArray = (uint16*) pthis->BackGroundLayer;
	pthis->rgMaps[0].x = pthis->frameStart.x;
	pthis->rgMaps[0].y = pthis->frameStart.y;
	pthis->rgMaps[0].w = MAP_SIZE_16;
	pthis->rgMaps[0].h = MAP_SIZE_1;
	pthis->rgMaps[0].unTileSize = TILE_SIZE_16X16;
	pthis->rgMaps[0].unFlags = MAP_FLAG_WRAP;

	if (GameWnd_LoadResources(pthis) != SUCCESS) {
		return FALSE;
	}	
	ISHELL_SetTimerEx(pthis->pMe->a.m_pIShell, 0, &pthis->cbTimer);

	return TRUE;
}

void GameWnd_Close(GameWnd *pthis)
{
	CALLBACK_Cancel(&pthis->cbTimer);
	GameWnd_UnloadResources(pthis);
}

void GameWnd_Free(GameWnd *pthis)
{
	CALLBACK_Cancel(&pthis->cbTimer);
	GameWnd_UnloadResources(pthis);
}

static int GameWnd_LoadResources(GameWnd *pthis)
{
	IBitmap	*pbmScreen;
	
	//creates instance of ISprite
	ISHELL_CreateInstance(pthis->pMe->a.m_pIShell, AEECLSID_SPRITE, 
		(void**)&pthis->pISprite);
	//sets IDisplay as its destination
	pbmScreen = IDISPLAY_GetDestination(pthis->pMe->a.m_pIDisplay);
	ISPRITE_SetDestination(pthis->pISprite, pbmScreen);
	IBITMAP_Release(pbmScreen);
	
	//load image for tile
	GameWnd_LoadSprites(pthis, PFLY_RES_FILE, IDB_BACKGROUND, TILE_SIZE_16X16, TRUE);
	
	//load image for sprite
	GameWnd_LoadSprites(pthis, PFLY_RES_FILE, IDB_SPRITE16, SPRITE_SIZE_16X16, FALSE);
	GameWnd_LoadSprites(pthis, PFLY_RES_FILE, IDB_SPRITE32, SPRITE_SIZE_32X32, FALSE);
	
	return SUCCESS;
}

static boolean GameWnd_HandleKeyEvent(GameWnd *pthis, AEEEvent eCode, uint16 wParam)
{
	if (eCode == EVT_KEY_PRESS)  {
		switch (wParam) {
		case AVK_RIGHT:
			if (pthis->keyLeft == FALSE) {
				pthis->keyRight = TRUE;
			}
			break;
		case AVK_LEFT:
			if (pthis->keyRight == FALSE) {
				pthis->keyLeft = TRUE;
			}
			break;
		default:
			return FALSE;
		}
		return TRUE;
	} else if (eCode == EVT_KEY_RELEASE) {
		switch (wParam) {
		case AVK_RIGHT:
			pthis->keyRight = FALSE;
			break;
		case AVK_LEFT:
			pthis->keyLeft = FALSE;
			break;
		default:
			return FALSE;
		}
		return TRUE;
		
	} else if(eCode == EVT_KEY) {
		switch(wParam) {
		case AVK_CLR:
			return Pfly_SetActiveWnd(pthis->pMe, IDW_MAINMENU);
		default:
			return FALSE;
		}
	}
	return FALSE;
}

static void GameWnd_NextFrame(GameWnd *pthis)
{
	int i;
	ISHELL_SetTimerEx(pthis->pMe->a.m_pIShell, 80, &pthis->cbTimer);
	
	//飛機是否分解
	if (pthis->isCrash == FALSE) {
		
		pthis->isCrash = GameWnd_IsCrash(pthis);
		
		if(pthis->keyRight == TRUE ) {
			if (pthis->direction<10) {
				pthis->direction++;
			}		
		} else if (pthis->keyLeft == TRUE ) {
			if (pthis->direction>0) {
				pthis->direction--;
			}		
		}	
		
		//update coordinate
		pthis->rgMaps[0].y += speedTableY[pthis->direction];
		if (pthis->rgMaps[0].y >= MAX_HEIGHT) {
			pthis->rgMaps[0].y -= MAX_HEIGHT;
		}
		
		//update wall
		for(i=0; i<4; i++) {
			if ((pthis->rgCmds[SPRITE_PLANE].y > 
				pthis->rgCmds[i].y+16-speedTableY[pthis->direction])
				&& pthis->rgCmds[SPRITE_PLANE].y <= pthis->rgCmds[i].y+16) {
				pthis->layer++;
			}
			if (pthis->rgCmds[i].y < -16) {
				//init wall
				pthis->rgCmds[i].x = pthis->frameStart.x 
					+ 4 + Random((int16) (pthis->frameMax.x - 8 - 32));
				pthis->rgCmds[i].y += 224;
				pthis->rgCmds[i].unSpriteIndex = PIC_START_WALL;
				pthis->rgCmds[i].unSpriteSize = SPRITE_SIZE_16X16;
				pthis->rgCmds[i].unComposite = 0;
				pthis->rgCmds[i].unLayer = 0;
				
				pthis->rgCmds[i+4].x = pthis->rgCmds[i].x + 16;
				pthis->rgCmds[i+4].y = pthis->rgCmds[i].y;
				pthis->rgCmds[i+4].unSpriteIndex = PIC_START_WALL+1;
				pthis->rgCmds[i+4].unSpriteSize = SPRITE_SIZE_16X16;
				pthis->rgCmds[i+4].unComposite = 0;
				pthis->rgCmds[i+4].unLayer = 0;
			}
			//move wall
			pthis->rgCmds[i].y -= speedTableY[pthis->direction];
			pthis->rgCmds[i+4].y = pthis->rgCmds[i].y;
		}
		
		//update plane
		pthis->rgCmds[SPRITE_PLANE].x += speedTableX[pthis->direction]; 
		pthis->rgCmds[SPRITE_PLANE].unSpriteIndex = pthis->direction;
		
		//update score digit
		pthis->rgCmds[SPRITE_DIGIT+0].unSpriteIndex = PIC_START_DIGIT 
			+ (pthis->layer/1000)%10;
		pthis->rgCmds[SPRITE_DIGIT+1].unSpriteIndex = PIC_START_DIGIT 
			+ (pthis->layer/100)%10;
		pthis->rgCmds[SPRITE_DIGIT+2].unSpriteIndex = PIC_START_DIGIT 
			+ (pthis->layer/10)%10;
		pthis->rgCmds[SPRITE_DIGIT+3].unSpriteIndex = PIC_START_DIGIT 
			+ pthis->layer%10;
		
	} else {
		if(pthis->crashCounter == 1) {
			//update image to crash plane
			pthis->rgCmds[SPRITE_PLANE].x -= 8;
			pthis->rgCmds[SPRITE_PLANE].y -= 8;
			pthis->rgCmds[SPRITE_PLANE].unSpriteIndex = 0;
			pthis->rgCmds[SPRITE_PLANE].unSpriteSize = SPRITE_SIZE_32X32;
			pthis->rgCmds[SPRITE_PLANE].unComposite = 0;
			pthis->rgCmds[SPRITE_PLANE].unLayer = 1;
		} else if (pthis->crashCounter == 4) {
			//update crash image
			pthis->rgCmds[SPRITE_PLANE].unSpriteIndex = 1;
		} else if (pthis->crashCounter == 7) {
			//game over
			Pfly_SetActiveWnd(pthis->pMe, IDW_GAMEEND);
			return;
		}
		pthis->crashCounter++;
	}
	
	//update tiles and sprites
	ISPRITE_DrawTiles(pthis->pISprite, pthis->rgMaps);
	ISPRITE_DrawSprites(pthis->pISprite, pthis->rgCmds);
	IDISPLAY_Update(pthis->pMe->a.m_pIDisplay);
}


static void GameWnd_LoadSprites(GameWnd *pthis, const char * pszFile, 
				uint16 resID, uint8 unSpriteSize, boolean isTile)
{
	IBitmap       *pbmScreen = NULL;
	IBitmap       *pbmDib = NULL;
	IBitmap       *pbmDdb = NULL;
	NativeColor    color;
	AEEBitmapInfo  bi;
	
	pbmScreen = IDISPLAY_GetDestination(pthis->pMe->a.m_pIDisplay);
	
	pbmDib = ISHELL_LoadResBitmap(pthis->pMe->a.m_pIShell, pszFile, resID);
	IBITMAP_GetInfo(pbmDib, &bi, sizeof(bi));
	IBITMAP_CreateCompatibleBitmap(pbmScreen, 
		&pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
	IBITMAP_BltIn(pbmDdb, 0, 0, (uint16)bi.cx, (uint16)bi.cy, 
		pbmDib, 0, 0, AEE_RO_COPY);
	IBITMAP_Release(pbmDib);
	IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
	IBITMAP_SetTransparencyColor(pbmDdb, color);
	if (isTile == TRUE) {
		ISPRITE_SetTileBuffer(pthis->pISprite, unSpriteSize, pbmDdb);
	} else {
		ISPRITE_SetSpriteBuffer(pthis->pISprite, unSpriteSize, pbmDdb);
	}
	IBITMAP_Release(pbmDdb);
	IBITMAP_Release(pbmScreen);
}

static void GameWnd_UnloadResources(GameWnd *pthis)
{
	if (pthis->pISprite) {
		ISPRITE_Release(pthis->pISprite);
		pthis->pISprite = NULL;
	}
}

static boolean GameWnd_IsCrash(GameWnd *pthis)
{
	int i;
	//判斷是否撞邊
	if (pthis->rgCmds[SPRITE_PLANE].x - pthis->frameStart.x < 8 
		|| pthis->rgCmds[SPRITE_PLANE].x - pthis->frameStart.x > pthis->frameMax.x - 24) {
		return TRUE;
	}
	//判斷是否撞墻
	for(i=0; i<4; i++) {
		if (pthis->rgCmds[SPRITE_PLANE].x >= pthis->rgCmds[i].x-13 && pthis->rgCmds[SPRITE_PLANE].x <= pthis->rgCmds[i].x+29) {
			if (pthis->rgCmds[SPRITE_PLANE].y >= pthis->rgCmds[i].y-14 && pthis->rgCmds[SPRITE_PLANE].y <= pthis->rgCmds[i].y+14) {
				return TRUE;
			}
		}
	}
	return FALSE;
}

static int16 Random(int16 range)
{
	uint16 rand;
	GETRAND((byte *)&rand,2);
	return range == 0 ? 0 : rand%range;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产suv精品一区二区三区| 成人精品免费视频| 一区二区视频在线| 中文字幕制服丝袜一区二区三区| 2023国产精品| 国产三区在线成人av| 欧美激情在线看| 亚洲欧美电影院| 亚洲国产中文字幕在线视频综合| 夜夜嗨av一区二区三区四季av| 一区二区三区资源| 日日夜夜精品视频天天综合网| 视频在线观看一区二区三区| 丝袜美腿亚洲色图| 国产精品综合二区| 99精品欧美一区二区三区综合在线| 95精品视频在线| 欧洲av一区二区嗯嗯嗯啊| 4438亚洲最大| 久久久久国产精品人| 亚洲男人都懂的| 美女脱光内衣内裤视频久久网站| 日韩经典中文字幕一区| 国产精品一区一区| 在线观看视频91| 久久免费视频色| 亚洲激情综合网| 久久精品国产99| 一本一本大道香蕉久在线精品 | 欧美私人免费视频| 欧美色男人天堂| 久久久影院官网| 伊人夜夜躁av伊人久久| 久久99久久99精品免视看婷婷| 成人av片在线观看| 日韩欧美你懂的| 亚洲欧美一区二区不卡| 另类小说视频一区二区| 在线观看国产一区二区| 久久久久久夜精品精品免费| 夜夜夜精品看看| 高清av一区二区| 欧美精品xxxxbbbb| 亚洲欧美电影一区二区| 国产美女在线精品| 69堂成人精品免费视频| 亚洲欧洲日韩一区二区三区| 九九国产精品视频| 欧美精品久久一区| 亚洲人成伊人成综合网小说| 国产电影一区在线| 精品少妇一区二区三区在线视频 | 日韩免费电影网站| 玉足女爽爽91| 99久久久久久99| 精品av综合导航| 日韩电影一区二区三区四区| 91极品美女在线| 成人欧美一区二区三区小说| 国产91丝袜在线观看| 日韩精品中午字幕| 久久99国产精品免费| 制服丝袜日韩国产| 日韩国产精品久久久久久亚洲| 色综合久久综合网欧美综合网| 国产亚洲精久久久久久| 国产精品一线二线三线| 日韩欧美不卡一区| 久久99精品国产麻豆婷婷| 日韩欧美在线影院| 蓝色福利精品导航| 欧美不卡一区二区三区四区| 另类欧美日韩国产在线| 精品国精品国产| 国产精品一线二线三线| 亚洲国产精品成人综合| 成人激情校园春色| 亚洲欧洲无码一区二区三区| 99精品视频在线免费观看| 日韩码欧中文字| 欧美色图片你懂的| 日韩av成人高清| 欧美成人官网二区| 粉嫩在线一区二区三区视频| 中文久久乱码一区二区| 色婷婷综合久久久中文字幕| 一区二区三区电影在线播| 欧美亚洲国产怡红院影院| 三级久久三级久久久| 久久亚洲影视婷婷| 成人午夜碰碰视频| 亚洲图片一区二区| 精品久久久久一区二区国产| 岛国一区二区三区| 亚洲精品乱码久久久久久| 欧美日韩一区高清| 国产麻豆视频精品| 亚洲视频免费看| 911精品国产一区二区在线| 国产一区二区三区视频在线播放| 国产亚洲精品7777| 在线看国产日韩| 国内精品写真在线观看| 成人欧美一区二区三区黑人麻豆| 欧美人牲a欧美精品| 精油按摩中文字幕久久| 亚洲女人****多毛耸耸8| 91精品国产高清一区二区三区蜜臀| 麻豆中文一区二区| 亚洲免费电影在线| 精品精品欲导航| 91麻豆自制传媒国产之光| 青青草一区二区三区| 中文字幕在线不卡| 日韩限制级电影在线观看| 成人h版在线观看| 免费在线一区观看| 亚洲精品乱码久久久久久久久 | 国产一区二区三区在线观看免费视频| 久久精品人人做人人爽97| 欧美日韩国产欧美日美国产精品| 国产老妇另类xxxxx| 亚洲v中文字幕| 中文字幕色av一区二区三区| 日韩精品一区二区三区视频播放| a4yy欧美一区二区三区| 九九视频精品免费| 日韩高清电影一区| 亚洲精品中文在线影院| 久久精品亚洲精品国产欧美kt∨| 在线不卡一区二区| 91福利社在线观看| 成人伦理片在线| 国产成a人亚洲精| 麻豆成人久久精品二区三区红| 亚洲在线观看免费| 亚洲欧美自拍偷拍| 国产精品美女久久久久aⅴ| 日韩精品一区二区三区中文不卡| 欧美巨大另类极品videosbest| 97精品国产97久久久久久久久久久久| 国产在线精品视频| 精品一区二区免费视频| 图片区小说区区亚洲影院| 亚洲电影中文字幕在线观看| 亚洲免费av在线| 樱桃国产成人精品视频| 成人免费一区二区三区在线观看| 国产视频一区不卡| 亚洲国产电影在线观看| 国产欧美一区二区精品久导航| 亚洲精品一区二区三区影院| 日韩欧美在线123| 精品成人一区二区| 久久久不卡影院| 欧美激情一区不卡| 18欧美亚洲精品| 亚洲综合激情网| 同产精品九九九| 蜜臀av性久久久久av蜜臀妖精| 免费高清视频精品| 国产自产高清不卡| 9色porny自拍视频一区二区| 日本精品视频一区二区三区| 欧美日本国产一区| 欧美成人激情免费网| 久久精品男人天堂av| 亚洲天堂a在线| 亚洲国产另类av| 六月婷婷色综合| 波多野结衣中文字幕一区二区三区 | 91在线免费视频观看| 欧美亚洲自拍偷拍| 日韩视频在线永久播放| 久久久国产精华| 亚洲一区在线免费观看| 免费在线看一区| 成人精品视频一区| 欧美另类z0zxhd电影| 精品美女在线播放| 亚洲精品欧美综合四区| 七七婷婷婷婷精品国产| 国产99久久久久| 欧美日韩一区二区三区视频| 久久久久久99久久久精品网站| 亚洲精品写真福利| 极品美女销魂一区二区三区免费| a4yy欧美一区二区三区| 欧美一区二区三区的| 亚洲日本中文字幕区| 精品伊人久久久久7777人| av电影在线观看不卡| 日韩一区二区在线观看视频播放| 中文字幕一区二区三区在线不卡| 视频一区欧美日韩| 91亚洲精品久久久蜜桃网站| 日韩美女在线视频| 亚洲成人免费在线| 成人理论电影网| 精品va天堂亚洲国产|