Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Pieni 2D-tasohyppely

Uniquebum [13.08.2010 17:53:25]

#

Otsikko kertoo käytännössä kaiken. En löytänyt yhtään tämän kaltaista opasta niin päätin itse – vaikkakin vielä aloittelija itsekin olenkin – yrittää auttaa muita aloittelijoita. Oppaassa käyn läpi gravitaation, hypyn, liikkumisen, ns. collision checkin ja muuta pientä.

Peli tarvitsee tiedostot Head.bmp (ukko), Ruoho.bmp (tausta), Coin.bmp (kolikko) ja Coin.wav (kolikon ääni).

Peli käyttää kirjastoja SDL ja SDL_mixer.

//KIRJASTOT
#include <SDL.h>
#include <SDL_mixer.h>
#include <time.h>


//////////////////////////
//Käytettävät vakiot
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
const int SCREEN_BPP = 32;

/////////////////////////
//Käytettävät funktiot (joista lisää myöhemmin)
int AlustaKaikki();
void ExitOhjelma();
void KuvanPiirto(SDL_Surface *Piirto, SDL_Surface *Naytto, int x, int y);
void OhjausJne();
void RandomKolikko(int x, int y);
void OsumaKolikkoon();
void Gravity();


/////////////////////////
//Määritellään käytettävät pinnat ja ääni
SDL_Surface *Naytto;
SDL_Surface *Head;
SDL_Surface *RuohoTausta;
SDL_Surface *Kolikko;


Mix_Chunk *KolikkoSound;


//////////////////////////////////////////////
//Käytettäviä yleisiä muuttujia suojattuna structuressa. Lähinnä sen takia laitoin
//struct rakenteeseen ettei tule päällekkäisyyksiä yleisten ja paikallisten muuttujien nimien suhteen.
struct YleisiaMuuttujia
{
	bool KolikkoShow;
	bool Exit;
	bool Kolikko;
	bool OsumaMaahan;
	bool Hyppy;

	int KolikkoX;
	int KolikkoY;

	double HeadX;
	double HeadY;
	double HyppyNopeus;
}Program;
/////////////////////////////////////
//MAIN FUNKTIO
int main(int argc, char *argv[])
{
	//Alustetaan kaikki tässä funktiossa
	AlustaKaikki();

	//Alkuarvot kaikille muuttujille
	Program.Hyppy = false;
	Program.OsumaMaahan = false; //Voimme hypätä vain jos osumme maahan ja emme ole hypänneet (eli Hyppy == false)
	Program.Exit = false;
	Program.HeadX = 200;
	Program.HeadY = 540;
	Program.Kolikko = false;
	Program.KolikkoX = 400;
	Program.KolikkoY = 400;
	Program.KolikkoShow = true;


	//Random generaattoria varten
	srand( time(NULL) );

	//Näppäimiä varten
	SDL_Event NappiEventti;

	//MAIN LOOPPI
	while (Program.Exit == false)
	{
		SDL_PollEvent(&NappiEventti);


		//Piirretään kuvat
		KuvanPiirto(RuohoTausta, Naytto, 0, 0);
		KuvanPiirto(Head, Naytto, Program.HeadX, Program.HeadY);
		if ( Program.KolikkoShow == true)
		{
			RandomKolikko(Program.KolikkoX, Program.KolikkoY);
		}

		OhjausJne();

		OsumaKolikkoon();

		Gravity();

		SDL_Flip(Naytto);

		//Tsekataan onko UP painettu eli ollaanko hyppäämässä ja liikutetaan päätä ylöspäin alkunopeudella -3,
		if (Program.Hyppy == true)  //hidastetaan hiljalleen kunnes lopulta etumerkki vaihtuu ja aletaan pudota
		{
			Program.HeadY -= Program.HyppyNopeus;
			Program.HyppyNopeus -= 0.01;
			Program.OsumaMaahan = false;
		}
	}


	ExitOhjelma();
	return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//COLLISION CHEKKI KOLIKON KANSSA & RANDOM GENERAATTORI KOLIKON UUDELLE PAIKALLE & JA KIVA PIKKU SOUNDI SIIHEN VÄLIIN
void OsumaKolikkoon()
{	//Tässä alla olevassa IFissä laitetaan pieni neliö kolikon ympärille johon päällä osuttua kolikko vaihtaa paikkaa ja soitetaan pikku ääni
	if ( Program.HeadX >= (Program.KolikkoX-50) && Program.HeadX <= (Program.KolikkoX + 30) && Program.HeadY >= (Program.KolikkoY - 35) && Program.HeadY <= (Program.KolikkoY + 30))
	{
		Program.KolikkoShow = false;
		Mix_PlayChannel(0, KolikkoSound, 0);
		Program.KolikkoX = (rand() % 740 + 1);
		Program.KolikkoY = (rand() % 540 + 1);
		Program.KolikkoShow = true;
	}
}
////////////////////////////////////////////////////////////////////////////
//KOLIKON PIIRTO UUTEEN PAIKKAAN JOS KOLIKKO ON KERÄTTY ELI KOLIKKO = FALSE
void RandomKolikko(int x, int y)
{
	if ( Program.Kolikko == false)
	{
	KuvanPiirto(Kolikko, Naytto, x, y);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//Ei kyllä itseasiassa painovoima mut lähinnä chekki et onko head maassa ja toimenpiteet sen mukaan
void Gravity()
{
	if ( Program.HeadY >= 540 )
	{
		Program.HeadY = 539; //Kun tullaan takas maahan päällä hypyn jälkeen niin laitaaan se 1 pikseli ylöspäin jolloin funktio
		Program.Hyppy = false; //ei lähe looppaamaaan ja päästään hyppäämään uudestaan.
		Program.OsumaMaahan = true;
		Program.HyppyNopeus = 3;
	}
}
////////////////////////////
//OHJAUS JNE
void OhjausJne()
{
	//Tarvittavat asiat nappien syöttöön koneelle
	Uint8* NapinPainallus;
	NapinPainallus = SDL_GetKeyState(NULL);

	//LIIKKUMINEN, HYPPY JA BOUNDARY CHECK
	if ( NapinPainallus[SDLK_UP] )
	{
		if ( Program.OsumaMaahan == true ) //Tsekataan osutaanko maahan...
		{
			Program.Hyppy = true; //Jos osutaan niin sillon voidaan hypätä
		}
	}

	if ( NapinPainallus[SDLK_RIGHT] ) //Jos painetaan oikeaa nappia niin...
	{
		if ( Program.HeadX < 740 )	//Tarkistetaan että Head kuvan X koordinaatti on alle 740 jolloin ei mennä ulos ruudusta
		{
			Program.HeadX += 1; //Liikutetaan päätä jos edelliset ehdot toteutui
		}
	}

	if ( NapinPainallus[SDLK_LEFT] )
	{
		if ( Program.HeadX > 0 )
		{
			Program.HeadX -= 1;
		}
	}
	if ( NapinPainallus[SDLK_ESCAPE] ) { Program.Exit = true; } //Escillä pois ohjelmasta
}
/////////////////////////////////////
//ALUSTAA OHJELMAN
int AlustaKaikki()
{
	//Alustaa SDL:n
	if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
	{
		fprintf(stderr, "Virhe alustaessa peliä \n", SDL_GetError);
		ExitOhjelma();
		return 1;
	}
	//Alustaa Mixin jolla saadaan ääni tuotettua
	if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) < 0)
	{
		fprintf(stderr, "Virhe alustaessa ääntä /n", SDL_GetError);
		ExitOhjelma();
		return 1;
	}

	//Tekee meille ikkunan johon laittaa kuvat ja muut sälät
	Naytto = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_HWSURFACE|SDL_DOUBLEBUF);


	Kolikko = SDL_LoadBMP("Coin.bmp"); // Ladataan Coin kuva ja yksi rivi alempana asetetaan valkoinen väri läpinäkyväksi.
	SDL_SetColorKey(Kolikko, SDL_SRCCOLORKEY, SDL_MapRGB(Kolikko->format, 255, 255, 255));

	KolikkoSound = Mix_LoadWAV_RW(SDL_RWFromFile("Coin.wav", "rb"), 0); //Ladataan kolikon ääni

	RuohoTausta = SDL_LoadBMP("Ruoho.bmp");

	Head = SDL_LoadBMP("Head.bmp");
	SDL_SetColorKey(Head, SDL_SRCCOLORKEY, SDL_MapRGB(Head->format, 255, 255, 255));

	return 0;
}
////////////////////////////////////////////////////////
//OHJELMAN LOPETUSFUNKTIO/PUDOTTAA TAVARAT MUISTISTA
void ExitOhjelma()
{
	SDL_FreeSurface(Kolikko);
	SDL_FreeSurface(RuohoTausta);
	SDL_FreeSurface(Head);
	Mix_FreeChunk(KolikkoSound);
	Mix_CloseAudio();
	SDL_Quit();
}
/////////////////////////////////
//KUVAN PIIRTOFUNKTIO
void KuvanPiirto(SDL_Surface *Piirto, SDL_Surface *Naytto, int x, int y)
{
	SDL_Rect Alue;
	Alue.x = x;
	Alue.y = y;
	SDL_BlitSurface(Piirto, NULL, Naytto, &Alue);
}

Metabolix [18.02.2012 15:20:40]

#

Tämä koodi ei ole millään mittapuulla mallikelpoinen. Koodi on monelta osin huonosti kirjoitettu ja jopa buginen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta