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

📄 main.c

📁 Linux游戏编程源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* If this is a network game, take note of variables	   set by the network thread. These are handled differently	   for a scripted opponent. */	if (opponent_type == OPP_NETWORK) {	    /* Has the opponent respawned? */	    if (network_opponent_respawn) {		printf("Remote player has respawned.\n");		opponent.shields = 100;		network_opponent_respawn = 0;		awaiting_respawn = 0;	    }			    /* Has the local player been hit? */	    if (local_player_hit) {		local_player_hit--;		player.shields -= PHASER_DAMAGE;		ShowPhaserHit(&player);				/* No need to check for death, the				   other computer will tell us. */	    }		}	/* Update phasers. */	player.firing -= time_scale;	if (player.firing < 0) player.firing = 0;	opponent.firing -= time_scale;	if (opponent.firing < 0) opponent.firing = 0;	ChargePhasers(&player);	/* If the local player is destroyed, the respawn timer will	   start counting. During this time the controls are disabled	   and explosion sequence occurs. */	if (respawn_timer >= 0) {	    respawn_timer++;	    if (respawn_timer >= ((double)RESPAWN_TIME / time_scale)) {		respawn_timer = -1;		InitPlayer(&player);				/* Set the local_player_respawn flag so the				   network thread will notify the opponent				   of the respawn. */		local_player_respawn = 1;		SetStatusMessage("GOOD LUCK, WARRIOR!");	    }	}	/* Respond to input and network events, but not if we're in a respawn. */	if (respawn_timer == -1) {	    if (keystate[SDLK_q] || keystate[SDLK_ESCAPE]) quit = 1;				    /* Left and right arrow keys control turning. */	    turn = 0;	    if (keystate[SDLK_LEFT]) turn += 10;	    if (keystate[SDLK_RIGHT]) turn -= 10;				    /* Forward and back arrow keys activate thrusters. */	    player.accel = 0;	    if (keystate[SDLK_UP]) player.accel = PLAYER_FORWARD_THRUST;	    if (keystate[SDLK_DOWN]) player.accel = PLAYER_REVERSE_THRUST;				    /* Spacebar fires phasers. */	    if (keystate[SDLK_SPACE]) {		if (CanPlayerFire(&player)) {		    FirePhasers(&player);		    /* If it's a hit, either notify the opponent		       or exact the damage. Create a satisfying particle		       burst. */		    if (!awaiting_respawn &&			CheckPhaserHit(&player,&opponent)) {			ShowPhaserHit(&opponent);			DamageOpponent();			/* If that killed the opponent, set the			   "awaiting respawn" state, to prevent multiple			   kills. */			if (opponent.shields <= 0 &&			    opponent_type == OPP_NETWORK)			    awaiting_respawn = 1;       		    }		}	    }				    /* Turn. */	    player.angle += turn * time_scale;	    if (player.angle < 0) player.angle += 360;	    if (player.angle >= 360) player.angle -= 360;	    /* If this is a network game, the remote player will	       tell us if we've died. Otherwise we have to check	       for failed shields. */	    if (((opponent_type == OPP_NETWORK) && local_player_dead) ||		(player.shields <= 0))	    {		printf("Local player has been destroyed.\n");		local_player_dead = 0;						/* Kaboom! */		KillPlayer();						/* Respawn. */		respawn_timer = 0;	    }	}	/* If this is a player vs. computer game, give the computer a chance. */	if (opponent_type == OPP_COMPUTER) {	    if (RunGameScript() != 0) {		fprintf(stderr, "Ending game due to script error.\n");		quit = 1;	    }				    /* Check for phaser hits against the player. */	    if (opponent.firing) {		if (CheckPhaserHit(&opponent,&player)) {							    ShowPhaserHit(&player);		    player.shields -= PHASER_DAMAGE;		    /* Did that destroy the player? */		    if (respawn_timer < 0 && player.shields <= 0) {			KillPlayer();			respawn_timer = 0;		    }		}	    }	    ChargePhasers(&opponent);	    UpdatePlayer(&opponent);	}	/* Update the player's position. */	UpdatePlayer(&player);	/* Update the status information. */	SetPlayerStatusInfo(player.score, player.shields, player.charge);	SetOpponentStatusInfo(opponent.score, opponent.shields);	/* Make the camera follow the player (but impose limits). */	camera_x = player.world_x - SCREEN_WIDTH/2;	camera_y = player.world_y - SCREEN_HEIGHT/2;			if (camera_x < 0) camera_x = 0;	if (camera_x >= WORLD_WIDTH-SCREEN_WIDTH)	    camera_x = WORLD_WIDTH-SCREEN_WIDTH-1;	if (camera_y < 0) camera_y = 0;	if (camera_y >= WORLD_HEIGHT-SCREEN_HEIGHT)	    camera_y = WORLD_HEIGHT-SCREEN_HEIGHT-1;	/* Update the particle system. */	UpdateParticles();	/* Keep OpenAL happy. */	UpdateAudio(&player, &opponent);					/* Redraw everything. */	DrawBackground(screen, camera_x, camera_y);	DrawParallax(screen, camera_x, camera_y);	DrawParticles(screen, camera_x, camera_y);	if (opponent.firing)	    DrawPhaserBeam(&opponent, screen, camera_x, camera_y);	if (player.firing)	    DrawPhaserBeam(&player, screen, camera_x, camera_y);	if (respawn_timer < 0)	    DrawPlayer(&player);	if (!awaiting_respawn)	    DrawPlayer(&opponent);	UpdateStatusDisplay(screen);			/* Release the mutex so the networking system can get it.	   It doesn't stay unlocked for very long, but the networking	   system should still have plenty of time. */	SDL_UnlockMutex(player_mutex);		/* Flip the page. */	SDL_Flip(screen);	frames_drawn++;    }    end_time = time(NULL);    if (start_time == end_time) end_time++;    /* Display the average framerate. */    printf("Drew %i frames in %i seconds, for a framerate of %.2f fps.\n",	   frames_drawn,	   end_time-start_time,	   (float)frames_drawn/(float)(end_time-start_time));    /* Terminate the music update thread. */    if (music_update_thread != NULL) {	SDL_KillThread(music_update_thread);	music_update_thread = NULL;    }	    /* Stop audio playback. */    StopAudio();    StopMusic();}int main(int argc, char *argv[]){    enum { GAME_COMPUTER, GAME_NETWORK, GAME_UNKNOWN } game_type = GAME_UNKNOWN;    char *remote_address = NULL;    int remote_port;    int i;	    if (argc < 2) {	printf("Penguin Warrior\n");	printf("Usage: pw [ mode ] [ option ... ]\n");	printf("  Game modes (choose one):\n");	printf("    --computer\n");	printf("    --client <remote ip address>\n");	printf("    --server <port number>\n");	printf("  Display options, for tweaking and experimenting:\n");	printf("    --fullscreen\n");	printf("    --hwsurface  (use an SDL hardware surface if possible)\n");	printf("    --doublebuf  (use SDL double buffering if possible)\n");	printf("  The display options default to a windowed, software buffer.\n");	return 1;    }    /* Process command line arguments. There are plenty of libraries for command       line processing, but our needs are simple in this case. */    for (i = 0; i < argc; i++) {	/* Networked or scripted opponent? */	if (!strcmp(argv[i], "--computer")) {	    game_type = GAME_COMPUTER;	    continue;	} else if (!strcmp(argv[i], "--client")) {	    game_type = GAME_NETWORK;	    if (i + 2 >= argc) {		printf("You must supply an IP address "\		       "and port number for network games.\n");		return 1;	    }	    remote_address = argv[i+1];	    remote_port = atoi(argv[i+2]);	    i++;	    continue;	} else if (!strcmp(argv[i], "--server")) {	    game_type = GAME_NETWORK;	    if (++i >= argc) {		printf("You must supply a port number "\		       "for --server.\n");		return 1;	    }	    remote_port = atoi(argv[i]);	    continue;				    /* Display-related options */	} else if (!strcmp(argv[i], "--hwsurface")) {	    hwsurface = 1;	} else if (!strcmp(argv[i], "--doublebuf")) {	    doublebuf = 1;	} else if (!strcmp(argv[i], "--fullscreen")) {	    fullscreen = 1;	}    }    /* If this is a network game, make a connection. */    if (game_type == GAME_NETWORK) {	/* If there's no remote address, the user selected	   server mode. */	if (remote_address == NULL) {	    if (WaitNetgameConnection(remote_port,				      &netlink) != 0) {		printf("Unable to receive connection.\n");		return 1;	    }	} else {	    if (ConnectToNetgame(remote_address, remote_port,				 &netlink) != 0) {		printf("Unable to connect.\n");		return 1;	    }	}	opponent_type = OPP_NETWORK;	printf("Playing in network game against %s.\n", netlink.dotted_ip);    } else if (game_type == GAME_COMPUTER) {	opponent_type = OPP_COMPUTER;	printf("Playing against the computer.\n");    } else {	printf("No game type selected.\n");	return 1;    }	    /* Initialize our random number generator. */    initrandom();    /* Create a mutex to protect the player data. */    player_mutex = SDL_CreateMutex();    if (player_mutex == NULL) {	fprintf(stderr, "Unable to create mutex: %s\n",		SDL_GetError());    }    /* Start our scripting engine. */    InitScripting();    if (LoadGameScript("pw.tcl") != 0) {	fprintf(stderr, "Exiting due to script error.\n");	return 1;    }    /* Fire up SDL. */    if (SDL_Init(SDL_INIT_VIDEO) < 0) {	printf("Unable to initialize SDL: %s\n", SDL_GetError());	return 1;    }    atexit(SDL_Quit);	    /* Set an appropriate 16-bit video mode. */    if (SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16,			 (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) |			 (doublebuf ? SDL_DOUBLEBUF : 0) |			 (fullscreen ? SDL_FULLSCREEN : 0)) == NULL) {	printf("Unable to set video mode: %s\n", SDL_GetError());	return 1;    }	    /* Save the screen pointer for later use. */    screen = SDL_GetVideoSurface();	    /* Set the window caption to the name of the game. */    SDL_WM_SetCaption("Penguin Warrior", "Penguin Warrior");	    /* Hide the mouse pointer. */    SDL_ShowCursor(0);    /* Initialize the status display. */    if (InitStatusDisplay() < 0) {	printf("Unable to initialize status display.\n");	return 1;    }		    /* Start the OpenAL-based audio system. */    InitAudio();    /* Initialize music and give the music system a file. */    InitMusic();    if (LoadMusic("reflux.ogg") < 0) {	/* If that failed, don't worry about it. */	printf("Unable to load reflux.ogg.\n");    }    /* Load the game's data into globals. */    LoadGameData();    /* Initialize the background starfield. */    InitBackground();    /* Start the network thread. */    if (game_type == GAME_NETWORK) {	network_thread = SDL_CreateThread(NetworkThread, NULL);	if (network_thread == NULL) {	    printf("Unable to start network thread: %s\n",		   SDL_GetError());	    return 1;	}    }	    /* Play! */    InitPlayer(&player);    InitPlayer(&opponent);    PlayGame();    /* Kill the network thread. */    if (game_type == GAME_NETWORK) {	SDL_KillThread(network_thread);    }    /* Close the network connection. */    if (game_type == GAME_NETWORK)	CloseNetgameLink(&netlink);    /* Unhide the mouse pointer. */    SDL_ShowCursor(1);	    /* Clean up the status display. */    CleanupStatusDisplay();    /* Unload data. */    UnloadGameData();	    /* Shut down our scripting engine. */    CleanupScripting();    /* Get rid of the mutex. */    SDL_DestroyMutex(player_mutex);    /* Shut down audio. */    CleanupMusic();    CleanupAudio();    return 0;}

⌨️ 快捷键说明

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