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

📄 title.cpp

📁 打飞机的过关游戏(linux)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						else if (selectedOption == 6)
							engine.done = 1;
						break;

					case 1:
						if (selectedOption != listLength)
							{engine.done = 1; continueSaveSlot = selectedOption; selectedOption = 3;}
						else
							{menuType = 0; selectedOption = 1;}
						break;

					case 2:
						if ((selectedOption == 1) && (engine.useAudio))
							currentGame.useSound = 1 - currentGame.useSound;
						else if ((selectedOption == 2) && (engine.useAudio))
						{
							currentGame.useMusic = 1 - currentGame.useMusic;

							if (currentGame.useMusic)
							{
								if (Mix_PausedMusic() == 1)
									Mix_ResumeMusic();
								else
									Mix_PlayMusic(engine.music, 1);
							}
							else
							{
								Mix_PauseMusic();
							}
						}
						else if (selectedOption == 3)
						{
							currentGame.fullScreen = 1 - currentGame.fullScreen;
							#if LINUX
							SDL_WM_ToggleFullScreen(graphics.screen);
							#else
							if (currentGame.fullScreen)
								graphics.screen = SDL_SetVideoMode(800, 600, 16, SDL_HWSURFACE|SDL_HWPALETTE|SDL_FULLSCREEN);
							else
								graphics.screen = SDL_SetVideoMode(800, 600, 0, SDL_HWSURFACE|SDL_HWPALETTE);

							graphics.drawBackGround();
							graphics.flushBuffer();
							#endif
						}
						else if (selectedOption == 4)
							Math::wrapChar(&(++currentGame.autoSaveSlot), -1, 4);
						else if (selectedOption == listLength)
							{menuType = 0; selectedOption = 1;}
						createOptionsMenu();
						break;

					case 3:
						if (selectedOption == 1)
							engine.cheatShield = 1 - engine.cheatShield;
						else if (selectedOption == 2)
							engine.cheatAmmo = 1 - engine.cheatAmmo;
						else if (selectedOption == 3)
							engine.cheatCash = 1 - engine.cheatCash;
						else if (selectedOption == 4)
							engine.cheatTime = 1 - engine.cheatTime;
						else if (selectedOption == listLength)
							{menuType = 0; selectedOption = 1;}
						createCheatMenu();
						break;

					case 4:
						if (selectedOption == listLength)
							{menuType = 0; selectedOption = 1;}
						break;
				}
			}
			engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0;
		}

		while (SDL_GetTicks() < (frameLimit + 16)){}
		frameLimit = SDL_GetTicks();
	}

	Mix_HaltMusic();

	SDL_FreeSurface(prlogo);
	SDL_FreeSurface(sflogo);

	engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0;

	resetLists();

	if (selectedOption == 1)
		selectedOption = 2; // go straight to mission 0

	if (selectedOption == 3)
	{
		newGame();
		selectedOption = loadGame(continueSaveSlot);
	}

	// Send back a negative number...
	if (selectedOption > 4)
	{
		selectedOption = -1;
		exit(0);
	}

	return selectedOption;
}

/*
Scrolls the intro text up the screen and nothing else. The text will be placed
into a data file when the game is finished.
*/
void showStory()
{
	graphics.freeGraphics();

	int y = 620;

	FILE *fp;

	#if USEPACK
	int dataLocation = locateDataInPak("data/intro.txt", 1);
	fp = fopen(PACKLOCATION, "rb");
	fseek(fp, dataLocation, SEEK_SET);
	#else
	fp = fopen("data/intro.txt", "rb");
	#endif

	int i = 0;
	int nextPos = -1;
	char string[255];

	fscanf(fp, "%d ", &nextPos);

	while (nextPos != -1)
	{
		fscanf(fp, "%[^\n]%*c", string);

		y += nextPos;
		graphics.textSurface(i, string, -1, y, FONT_WHITE);

		i++;

		fscanf(fp, "%d ", &nextPos);
	}

	fclose(fp);

	loadBackground("gfx/startUp.jpg");
	graphics.blit(graphics.background, 0, 0);
	graphics.flushBuffer();

	unsigned long frameLimit = SDL_GetTicks();

	SDL_PumpEvents();
	engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0;

	while (true)
	{
		graphics.updateScreen();
		graphics.unBuffer();

		getPlayerInput();

		if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]) || (engine.keyState[SDLK_SPACE]))
			break;

		if (graphics.textShape[8].y > 450)
		{
			for (int i = 0 ; i < 9 ; i++)
			{
				graphics.textShape[i].y -= 0.25;
				graphics.blitText(i);
			}
		}
		else
		{
			SDL_Delay(3000);
			break;
		}

		while (SDL_GetTicks() < (frameLimit + 16)){}
		frameLimit = SDL_GetTicks();
	}
}

/*
The game over screen :(
*/
void gameover()
{
	graphics.flushBuffer();
	graphics.freeGraphics();
	SDL_FillRect(graphics.background, NULL, graphics.black);

	engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0;
	engine.gameSection = SECTION_INTERMISSION;

	loadMusic("music/Wybierak.mod");

	SDL_Surface *gameover = loadImage("gfx/gameover.png");

	graphics.clearScreen(graphics.black);
	graphics.updateScreen();
	graphics.clearScreen(graphics.black);
	SDL_Delay(1000);

	if ((currentGame.useMusic) && (engine.useAudio))
	{
		Mix_VolumeMusic(100);
		Mix_PlayMusic(engine.music, 1);
	}

	int x = (800 - gameover->w) / 2;
	int y = (600 - gameover->h) / 2;

	unsigned long frameLimit = SDL_GetTicks();
	graphics.updateScreen();

	SDL_PumpEvents();
	engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0;

	while (true)
	{
		getPlayerInput();
		
		if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]) || (engine.keyState[SDLK_SPACE]))
			break;

		graphics.updateScreen();

		graphics.unBuffer();
		x = ((800 - gameover->w) / 2) - Math::rrand(-2, 2);
		y = ((600 - gameover->h) / 2)  - Math::rrand(-2, 2);
		graphics.blit(gameover, x,  y);

		// Limit us to 60 frame a second
		while (SDL_GetTicks() < (frameLimit + 16)){}
		frameLimit = SDL_GetTicks();
	}

	SDL_FreeSurface(gameover);

	if ((currentGame.useMusic) && (engine.useAudio))
		Mix_HaltMusic();

	graphics.flushBuffer();
}

void doCredits()
{
	loadBackground("gfx/credits.jpg");
	graphics.flushBuffer();
	graphics.freeGraphics();

	if ((currentGame.useMusic) && (engine.useAudio))
		loadMusic("music/Solace.s3m");

	FILE *fp;
	int numberOfCredits = 0;
	int lastCredit = 0;

	int yPos = 0;
	int yPos2 = 510;
	char text[255];

	textObject *credit;

	graphics.clearScreen(graphics.black);
	graphics.updateScreen();
	graphics.clearScreen(graphics.black);
	SDL_Delay(1000);

	graphics.drawBackGround();

	#if USEPACK
	int dataLocation = locateDataInPak("data/credits.txt", 1);
	fp = fopen(PACKLOCATION, "rb");
	fseek(fp, dataLocation, SEEK_SET);
	#else
	fp = fopen("data/credits.txt", "rb");
	#endif

	for (int i = 0 ; i < 6 ; i++)
	{
		fscanf(fp, "%[^\n]%*c", text);
		graphics.drawString(text, -1, 240 + (i * 20), FONT_WHITE);
	}

	fscanf(fp, "%d%*c", &numberOfCredits);

	credit = (textObject*) malloc(sizeof(textObject) * numberOfCredits);

	for (int i = 0 ; i < numberOfCredits ; i++)
	{
		fscanf(fp, "%d %[^\n]%*c", &yPos, text);
		credit[i].image = graphics.textSurface(text, FONT_WHITE);
		credit[i].x = (800 - credit[i].image->w) / 2;
		yPos2 += yPos;
		credit[i].y = yPos2;
	}

	fclose(fp);

	if ((currentGame.useMusic) && (engine.useAudio))
	{
		Mix_VolumeMusic(100);
		Mix_PlayMusic(engine.music, 1);
	}

	SDL_Delay(3000);

	graphics.updateScreen();
 	SDL_Delay(10000);
	graphics.drawBackGround();

	unsigned long frameLimit = SDL_GetTicks();
	engine.done = 0;

	lastCredit = numberOfCredits - 1;

	SDL_Rect r1 = {0, 80, 800, 20};
	SDL_Rect r2 = {0, 500, 800, 20};

	engine.keyState[SDLK_ESCAPE] = 0;
	SDL_PumpEvents();

	while (true)
	{
		graphics.updateScreen();
		graphics.unBuffer();

		getPlayerInput();
		if (engine.keyState[SDLK_ESCAPE])
			break;

		for (int i = 0 ; i < numberOfCredits ; i++)
		{
			if ((credit[i].y > 80) && (credit[i].y < 500))
				graphics.blit(credit[i].image, (int)credit[i].x, (int)credit[i].y);
			if (credit[lastCredit].y > 400)
				credit[i].y -= 0.3;
		}

		SDL_FillRect(graphics.screen, &r1, graphics.black);
		SDL_FillRect(graphics.screen, &r2, graphics.black);

		while (SDL_GetTicks() < (frameLimit + 16)){}
		frameLimit = SDL_GetTicks();
	}

	for (int i = 0 ; i < numberOfCredits ; i++)
	{
		SDL_FreeSurface(credit[i].image);
	}

	free(credit);
}

⌨️ 快捷键说明

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