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

📄 game.cpp

📁 Torus 3D Engine is an open-source OpenGL ES 3D Engine for creating your own games in BREW environmen
💻 CPP
📖 第 1 页 / 共 3 页
字号:


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::KeyPressEvent(uint16 wParam)
{
	switch(wParam)
	{
		case AVK_SELECT:
			m_kSELECT = true;
			return TRUE;

		case AVK_LEFT:
			m_kLEFT = true;
			return TRUE;

		case AVK_RIGHT:
			m_kRIGHT = true;
			return TRUE;

		case AVK_UP:
			m_kUP = true;
			return TRUE;

		case AVK_DOWN:
			m_kDOWN = true;
			return TRUE;

		case AVK_1:
			return TRUE;
		case AVK_2:
			return TRUE;
		case AVK_3:
			return TRUE;
		case AVK_4:
			return TRUE;
		case AVK_5:
			return TRUE;
		case AVK_6:
			return TRUE;
		case AVK_7:
			return TRUE;
		case AVK_8:
			return TRUE;
		case AVK_9:
			return TRUE;
		case AVK_STAR:
			return TRUE;
		case AVK_0:
			return TRUE;

		case AVK_POUND:
			return TRUE;

		case AVK_CLR:
			m_kCLEAR = true;
			return TRUE;
	}

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::KeyReleaseEvent(uint16 wParam)
{
	switch(wParam)
	{
		case AVK_SELECT:
			m_kSELECT = false;
			return TRUE;

		case AVK_LEFT:
			m_kLEFT = false;
			return TRUE;

		case AVK_RIGHT:
			m_kRIGHT = false;
			return TRUE;

		case AVK_UP:
			m_kUP = false;
			return TRUE;

		case AVK_DOWN:
			m_kDOWN = false;
			return TRUE;

		case AVK_1:
			return TRUE;
		case AVK_2:
			return TRUE;
		case AVK_3:
			return TRUE;
		case AVK_4:
			return TRUE;
		case AVK_5:
			return TRUE;
		case AVK_6:
			return TRUE;
		case AVK_7:
			return TRUE;
		case AVK_8:
			return TRUE;
		case AVK_9:
			return TRUE;
		case AVK_STAR:
			return TRUE;
		case AVK_0:
			return TRUE;

		case AVK_POUND:
			return TRUE;

		case AVK_CLR:
			m_kCLEAR = false;
			return TRUE;
	}

	return TRUE;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::NextFrame(CGame* pGame)
{
	IDISPLAY_Backlight(pGame->m_applet.m_pIDisplay, TRUE);
	// ----------------------------------------------------------------------------------

	pGame->RenderFrame();

	// ----------------------------------------------------------------------------------
	ISHELL_SetTimer(pGame->m_applet.m_pIShell, 33, (PFNNOTIFY)NextFrame, (void *)pGame);
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderFrame()
{
	// -----------------------------------------------------------------------------------------
	// clear everything
	// -----------------------------------------------------------------------------------------
	#if 1
		glClearColorx(0,0,0,0);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	#else
		glClear(GL_DEPTH_BUFFER_BIT);
	#endif

	switch (m_jGameStatus)
	{
		case STATUS_START:
		{
			RenderStart();
			break;
		}

		case STATUS_LOADING:
		{
			if (!LoadResources()) ISHELL_CloseApplet(m_applet.m_pIShell, 0);
			m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-88)>>1, (m_pEngine->ScreenHeight()-13)>>1, "- LOADING -");
			m_dwFrame = 0;
			m_jGameStatus = STATUS_INTRO;
			break;
		}

		case STATUS_INTRO:
		{
			RenderIntro();
			break;
		}

		case STATUS_NEWLEVEL:
		{
			RenderNewLevel();
			break;
		}

		case STATUS_PLAYING:
		{
			RenderGame();
			break;
		}

		case STATUS_DYING:
		{
			RenderDying();
			break;
		}

		case STATUS_PASSLEVEL:
		{
			RenderPassLevel();
			break;
		}

		case STATUS_GAMEOVER:
		{
			RenderGameOver();
			break;
		}
	}

	// -----------------------------------------------------------------------------------------
	//
	// swap buffers and update screen
	m_pEngine->SwapBuffers();
	IDISPLAY_Update(m_applet.m_pIDisplay);
	//
	// -----------------------------------------------------------------------------------------
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderStart()
{
	if (m_dwFrame == 0)
	{
		if (m_kCLEAR || m_kSELECT) return;
		// load 8x13 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ font sprite
		m_pSpr8x13 = new CSprite(m_pEngine);
		m_pSpr8x13->LoadFromVfs("game.dat", "font_8x13.bmp");
		int16 jFrm8x13[58*6];
		int yy, pp=0, f8x13offx=0;
		for (yy=0; yy<58; yy++)
		{
			jFrm8x13[pp++] = f8x13offx;
			jFrm8x13[pp++] = 0;
			jFrm8x13[pp++] = 0;
			jFrm8x13[pp++] = 0;
			jFrm8x13[pp++] = 8;
			jFrm8x13[pp++] = 13;
			f8x13offx += 8;
		}
		m_pSpr8x13->Config(58, jFrm8x13);
	}

	if (m_dwFrame)
	{
		m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-88)>>1, (m_pEngine->ScreenHeight()-13)>>1, "- LOADING -");
		m_jGameStatus = STATUS_LOADING;
		return;
	}

	m_dwFrame++;
}


// ----------------------------------------------------------------------------------------------------------
//
// Render a intro frame
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderIntro()
{
	char* szText[] =
	{
		"MUSIC:",
		"JONATHAN DANIEL",
		" ",
		"3D SHIP:",
		"MAX SHELEKHOV",
		" ",
		"CODE:",
		"VANDER NUNES",
		" ",
		"IMERSIVA.COM"
	};

	//
	// initialize intro
	//
	if (m_dwFrame == 0)
	{
		if (m_kCLEAR || m_kSELECT) return;

		// load intro music
		m_pMusIntro = new CMusic(m_pEngine);
		m_pMusIntro->LoadFromVfs("game.dat", "jdtechno.mid");

		// load intro resources
		m_pScene = new CSceneGraph(m_pEngine);
 		m_pScene->LoadModel("plane.mob", 1.5f, 1.25f, 1.0f);
		m_pScene->LoadTexture("introbkg.tga");
		m_pScene->LoadModel("spaceship2.mob", 0.1f, 0.1f, 0.1f);
		m_pScene->LoadTexture("spaceship2a.tga");

		m_pTiles[0] = new CSceneItem(m_pScene, 0, 0);
		m_pScene->AddItem(m_pScene->Root(), m_pTiles[0]);
		m_pPlayer = new CSceneItem(m_pScene, 1, 1);
		m_pScene->AddItem(m_pScene->Root(), m_pPlayer);

		m_pTiles[0]->TranslateTo(0,0,ITOX(-25));

		m_pPlayer->TranslateTo(0,0,0);
		m_pPlayer->RotateTo(ITOX(20),ITOX(160),0);
		m_pPlayer->UpdateDirection();

		m_pCam->RotateTo(0,0,0);
		m_pCam->UpdateDirection();
		m_pCam->TranslateTo(0,0,ITOX(40));

		// start music
		m_pMusIntro->Play(true);

		m_iIntroTextIdx = 0;
		m_jLevel = 1;

		m_dwFrame = 1;
	}

	//
	// render a frame
	//
	if (m_dwFrame)
	{
		// user select a previous level to start game
		if (m_kLEFT)
		{
			if (!m_klastLEFT)
			{
				if (m_jLevel > 1) m_jLevel--;
				m_klastLEFT = TRUE;
			}
		} else m_klastLEFT = FALSE;

		// select a next level to start game
		if (m_kRIGHT)
		{
			if (!m_klastRIGHT)
			{
				if (m_jLevel < 6) m_jLevel++;
				m_klastRIGHT = TRUE;
			}
		} else m_klastRIGHT = FALSE;

		// scroll up credits text
		if (m_kDOWN)
		{
			//if (!m_klastDOWN)
			{
				m_iIntroTextIdx+=2;
				m_klastDOWN = TRUE;
			}
		} else m_klastDOWN = FALSE;

		// scroll down credits text
		if (m_kUP)
		{
			//if (!m_klastUP)
			{
				m_iIntroTextIdx-=2;
				m_klastUP = TRUE;
			}
		} else m_klastUP = FALSE;

		if (m_kCLEAR)
		{
			ISHELL_CloseApplet(m_applet.m_pIShell, 0);
			return;
		}
		m_pTiles[0]->TranslateTo(25 * FPsin[(m_dwFrame<<1)%359], 15 * FPcos[m_dwFrame%359], ITOX(-25));
		m_pPlayer->AddRotation(0,ITOX(2),0);
		m_pPlayer->UpdateDirection();
		m_pScene->Render(m_pScene->Root(), m_pCam, FALSE);
		m_pSprPressStart->Draw((m_pEngine->ScreenWidth()-m_pSprPressStart->Width())>>1, m_pEngine->ScreenHeight()-m_pSprPressStart->Height()-4);

		// show selected level to start...
		char szNumber[16];
		SPRINTF(szNumber, "%02u", m_jLevel);
		m_pSprLevel->Draw(4,4);
		m_pSprNumbers->DrawNumber(4,10, szNumber);

		for (byte tt=0; tt<10; tt++)
			m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-(8*STRLEN(szText[tt])))>>1,m_pEngine->ScreenHeight()+tt*13-m_iIntroTextIdx, szText[tt]);

		m_dwFrame++;
	}

	//
	// start the game
	//
	if (m_kSELECT)
	{
		// release intro music (will stop and free memory)
		if (m_pMusIntro) { m_pMusIntro->Stop(); DeletePtr(m_pMusIntro); }

		// unload all intro resources
		CleanUpLevel();
		m_dwFrame = 0;

		// start game
		m_jLifes = 3;
		m_dwScore = 0;
		m_jGameStatus = STATUS_NEWLEVEL;
	}
}


// ----------------------------------------------------------------------------------------------------------
//
// Render a newlevel frame
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderNewLevel()
{
	CleanUpLevel();
	if (LoadLevel("game.dat", m_jLevel))
	{
		m_pSndLevel->Play();
		m_jGameStatus = STATUS_PLAYING;
	}
	else
		m_jGameStatus = STATUS_INTRO;
}


// ----------------------------------------------------------------------------------------------------------
//
// Render dying
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderDying()
{
	int xx;

	m_pPlayer->AddTranslation(0,m_DieImpulse,0);
	m_pPlayer->AddRotation(ITOX(16),ITOX(12),ITOX(0));
	m_DieImpulse -= DIE_GRAVITY;

	if (m_DieImpulse < -128000)
	{
		// reposition player
		VectorCopy(m_PlayerStartPos, m_pPlayer->Position());
		m_pPlayer->RotateTo(0,0,0);
		m_pPlayer->UpdateDirection();

		// reposition enemies
		for (xx=0; xx<m_jEnemyCount; xx++)
		{
			VectorCopy(m_EnemyStartPos[xx], m_pEnemies[xx]->Position());
			m_pEnemies[xx]->RotateTo(0,0,0);
			m_pEnemies[xx]->UpdateDirection();
		}

		// clear player and enemies from grid
		for (xx=0; xx<GRID_SIZE*GRID_SIZE; xx++)
			if (m_pLevelGrid[xx] == 1 || m_pLevelGrid[xx] == 4)
				m_pLevelGrid[xx] = 5;

		// reposition camera
		m_pCam->TranslateTo(m_pPlayer->Position()[0] - m_pPlayer->Direction()[0]*25,ITOX(20), m_pPlayer->Position()[2] + m_pPlayer->Direction()[2]*25);
		VectorCopy(m_pPlayer->Rotation(), m_pCam->Rotation());
		m_pCam->AddRotation(ITOX(-45), 0, 0);
		m_pCam->UpdateDirection();

		m_jLifes--;
		m_dwFrame = 0;
		m_jTurnLeft = m_jTurnRight = 0;

		if (m_jLifes > 0)
			m_jGameStatus = STATUS_PLAYING;
		else
			m_jGameStatus = STATUS_GAMEOVER;

		return;
	}

	// -----------------------------------------------------------------------------------------
	//
	// flags animation
	//
	// -----------------------------------------------------------------------------------------
	for (xx=0; xx<m_jFlagsCount; xx++)
		m_pFlags[xx]->AddRotation(0,ITOX(4),0);

	// -----------------------------------------------------------------------------------------
	//
	// render scene
	//
	// -----------------------------------------------------------------------------------------
	m_pScene->Render(m_pScene->Root(), m_pCam);

	// -----------------------------------------------------------------------------------------
	//
	// show some feedback text
	//
	// -----------------------------------------------------------------------------------------

	char szNumber[16];

	// remaining flags
	SPRINTF(szNumber, "%02u", m_jFlagsLeft);
	m_pSprNumbers->DrawNumber(4,m_pEngine->ScreenHeight()-8, szNumber);

	// current level
	SPRINTF(szNumber, "%02u", m_jLevel);
	m_pSprLevel->Draw(4,4);
	m_pSprNumbers->DrawNumber(4,10, szNumber);

	// current score
	SPRINTF(szNumber, "%06u", m_dwScore);
	m_pSprScore->Draw(m_pEngine->ScreenWidth()-m_pSprScore->Width()-4,4);
	m_pSprNumbers->DrawNumber(m_pEngine->ScreenWidth()-33,10, szNumber);

	// lifes
	for (xx=1; xx<m_jLifes; xx++)
		m_pSprLive->Draw(m_pEngine->ScreenWidth()-(m_pSprLive->Width()+1)*xx-4,m_pEngine->ScreenHeight()-m_pSprLive->Height()-4);
}


// ----------------------------------------------------------------------------------------------------------
//
// Render level upgrading
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderPassLevel()
{
	m_pPlayer->AddRotation(0,0,0);
	m_pPlayer->AddTranslation(PLAYER_MOVE_SPEED*3, ITOX(1), PLAYER_MOVE_SPEED*3);
	if (m_pPlayer->Position()[1] > ITOX(30))
	{
		CleanUpLevel();
		m_jLevel++;
		m_dwFrame = 0;
		m_jGameStatus = STATUS_NEWLEVEL;
		return;
	}

⌨️ 快捷键说明

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