Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: katse suuntaan kulkeminen

Sivun loppuun

mika132 [20.12.2009 20:10:10]

#

Eli kun SDL_gfx:llä tehdään kääntyminen. Eli esim käännytään 45 astetta (osaan tehdä) niin mennään siihen suuntaan eikä vain yksittäisiin neljään suuntaan.

Eli jos painetaan W nappulaa se menee siihen suuntaan mihin katse näyttää? En tarvitse muuta kuin sen koodin miten kuva saadaan liikkumaan katse suuntaan.

Spongi [20.12.2009 20:35:40]

#

x += cos(suunta) * nopeus;
y += sin(suunta) * nopeus;

Edit. Ja suunta tietty radiaaneina. (rad = kulma * pi / 180)

Teuro [20.12.2009 20:41:53]

#

Ja y-suunta on tosiaan erilainen, kuin normaalissa koordinaatistossa. Eli nopeus vaikka negatiivisena, jolloin liike menee oikein.

mika132 [20.12.2009 20:55:32]

#

hmm... Eli nyt koodini heittää windows ID 5 erroria (eli "Käyttö estetty").

Kun käynnistän pelin se aukeaa päästyäni huoneeseen kolme se yhtäkkiä vain kaatuu ja heittää tuon errorin ja kysyy "Break" tai "Continue" Continuesta tulee sama uudestaan ja Break katkaisee pelin. Eli missä tuossa koodissa menee nyt pieleen? Alusutkset on tehty erillisessä tiedostossa, jota en tähän nyt laittanut.

if (huone==3)
{

	temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1);
	SDL_FreeSurface(autona_oma);
	PiirraKuva(rata_1, naytto, 0, 0);
	PiirraKuva(temp, naytto, oma_x, oma_y);
	SDL_Flip(naytto);


	nappi = SDL_GetKeyState(NULL);
	if (nappi[SDLK_UP])
	{
		oma_x += cos((double) suunta) * nopeus;
		oma_y += sin((double) suunta) * nopeus;
	}
	if (nappi[SDLK_LEFT])
	{
		suunta+=1;
	}
	if (nappi[SDLK_RIGHT])
	{
		suunta-=1;
	}
}

Teuro [20.12.2009 21:04:47]

#

Tuleeko kaatuminen heti huoneeseen 3 siirtymisen jälkeen? Onko temp varmasti SDL_Surface* tyyppinen? Voiko autona_oma pinnan varmasti vapauttaa tuossa? Toimiiko Piirrakuva funktio varmasti oikein? Onnistuuko alustukset varmasti?

Teuro [20.12.2009 21:13:57]

#

Tietokone suorittaa koodiasi uskomattoman nopeasti, joten sinun oisi hyvä odotella hetken aikaa vaikkapa SDL_Delay(150) funktion avulla 150 on siis millisekuntien määrä, joka odotellaan.

EDIT: jaha mika132 poistikin viestinsä, mutta vastaus liittyy liian nopeaan pyörimiseen.

mika132 [20.12.2009 21:15:46]

#

Autoni kulkusuunnalla ei ole mitään tolkkua kun sain tuon toimimaan.
Auto saattaa ajaa suoraan sitten hieman hipaisen vasemmalle niin auto menee jo kylki edellä luoteeseen painan oikealle niin se menee jo täyttä vaihtia etelään. Suomeksi se ei mene ihan nyt sinne mihin keula osoittaa vaan välillä menosuuntaan on keulasta kulma tai kylki tai takapää.

if (huone==3)
{
	temp = rotozoomSurface(autona_oma, suunta, 1, 1);
	PiirraKuva(rata_1, naytto, 0, 0);
	PiirraKuva(temp, naytto, oma_x, oma_y);
	SDL_Flip(naytto);


	nappi = SDL_GetKeyState(NULL);
	if (nappi[SDLK_UP])
	{
		oma_x += cos((double) suunta) * nopeus;
		oma_y -= sin((double) suunta) * nopeus;
	}
	if (nappi[SDLK_LEFT])
	{
		suunta+=1;
	}
	if (nappi[SDLK_RIGHT])
	{
		suunta-=1;
	}
}

Teuro [20.12.2009 21:20:21]

#

Huomaa, että sin ja cos funktiot haluavat suunnan radiaaneina ja rotoZoomSurface asteina. En tuosta nopeasti katsottuna löytänyt tuon muunnosfunktion käyttöä mistään. Huomaa lisäksi, että asteet menevät välille 0 - 359 ja radiaanit välille 0 - 6.28 (noin)

mika132 [20.12.2009 21:25:46]

#

Juu laitoin tuon, mutta ongelmaksi tulee se mikä minulla oli aikaisemmin kun minulla oli tuo koodi. (Tai sitten teen väärin). Mutta siis autollani on nyt vain seitsemän kulmaa. Eli se menee "nykimällä" (Kaakkoon, Lounaaseen, Länteen, Luode, Luoteen ja pohjoisen väliin, Pohjoiseen.)

double rad2deg(double rad){
    return ((rad * 180) / 3.1415927);
}

		if (huone==3)
		{
            temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1);
			PiirraKuva(rata_1, naytto, 0, 0);
			PiirraKuva(temp, naytto, oma_x, oma_y);
			SDL_Flip(naytto);


			nappi = SDL_GetKeyState(NULL);
			if (nappi[SDLK_UP])
			{
				oma_x += cos((float) suunta) * nopeus;
				oma_y -= sin((float) suunta) * nopeus;
			}
			if (nappi[SDLK_LEFT])
			{
				suunta+=1;
				SDL_Delay(150);
			}
			if (nappi[SDLK_RIGHT])
			{
				suunta-=1;
				SDL_Delay(150);
			}
		}

Legu [20.12.2009 21:37:49]

#

No ei taida ihan olla oikea paikka tuolle SDL_Delaylle... Ota ne siis pois.

Laitahan tuo suunta += 1 muotoon suunta += 0.01 (niin ja suunta liukuluvuksi) vaikka näin aluksi ja kokeilet mitä tapahtuu. Oikeastihan tuo sitten tehdään niin että tuo kulman lisäys samoin kuin paikan lisäys riippuu siitä, kuinka nopeasti peli pyörii kyseisellä koneella, jotta sitten peli pyörii "reaaliajassa" kaikilla koneilla.

Teuro [20.12.2009 21:37:52]

#

mika132 kirjoitti:

Juu laitoin tuon,

Tuon?

mika132 kirjoitti:

mutta ongelmaksi tulee se mikä minulla oli aikaisemmin kun minulla oli tuo koodi. (Tai sitten teen väärin).

Oli mikä koodi missä?

mika132 [20.12.2009 22:18:37]

#

Ei näytä selityksestä tulevan mitään joten:

Jos voisitte tästä ladata lähdekoodin ja testata mitä tapahtuu kääntäessä niin ymmärrätte mitä ajan takaa

Legu [20.12.2009 22:35:46]

#

temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1);
PiirraKuva(rata_1, naytto, 0, 0);
PiirraKuva(temp, naytto, oma_x - temp->w / 2, oma_y - temp->h / 2);
SDL_FreeSurface(temp);
SDL_Flip(naytto);

Spongi [20.12.2009 22:35:55]

#

Käytä mieluummin floattia noiden paikkojen ilmottamiseen. Ja suosittelisin oikeasti opettelemaan usean tiedoston käyttö oikeaoppisesti, tuollanen includettaminen on pahasta.

mika132 [20.12.2009 23:10:53]

#

Kiitos! Kiitos paljon! =)

Vielä ihan pieni kysymys miten pystyin tarkistamaan, että jos jokin tietty nappula nousee niin tehdään jotain?

			if (nappi[SDL_KEYUP])
			{
				nopeus-=0.01;
				oma_x += cos((float) suunta) * nopeus;
				oma_y -= sin((float) suunta) * nopeus;
			}

tuo ei ainakaan pudota nopeutta pikku hiljaa vaan nopeus pysää kuin seinään. Syykin luultavasti on se, että ei se tiedä mikä nappula nousee ylös, joten miten sainkaan sen tietyn napin tarkastettua. Se on ihan kielen päällä, mutta ei muisti millään mieleen. :)

Legu [20.12.2009 23:31:09]

#

Ei sitä noin voi tehdä. En viitsi perustella sen kummemmin, kun tuskin siitä mitään ymmärtäisit..

Jotenkin tähän tyyliin ehkä:

if (nappi[SDLK_UP]) {
  nopeus += KIIHTYVYYS;
  if (nopeus > MAKSIMI_NOPEUS) {
    nopeus = MAKSIMI_NOPEUS;
  }
} else {
  nopeus -= HIDASTUVUUS;
  if (nopeus < 0.0) {
    nopeus = 0.0;
  }
}
oma_x += cos(suunta) * nopeus;
oma_y -= sin(suunta) * nopeus;
piirra_ruma_bussi(oma_x, oma_y);

Sitten jos tuosta hyvän haluaisi, niin laittaisi sitten kertoimiksi vielä kuluneen ajan niin kuin edellä jo mainitsin, mutta senhän voit itse varmasti sitten tehdä...

mika132 [21.12.2009 00:06:36]

#

Noniin nyt olen onnistunut luomaan Proto kisaenginen ja olen siihen tyytyväinen ja opein pari asiaakin, mutta ongelmana on, että SDL ns. Kameran liikuttaminen on vaikeaa joten nyt pyydän suoraa kommentoitua OpenGL kameran liikutus koodia mikä seuraa SDL ladattua kuvaa. Olisin enemmän kuin kiitollinen.

Legu [21.12.2009 00:34:42]

#

Et sinä nyt rupea mitään OpenGL:ää tähän sotkemaan.
Kameran liikuttaminen tarkoittaa siis käytännössä sitä, että piirrettäviä asioita siirretään näytöllä vastakkaiseen suuntaan (esim. taustakuvaa ja muita ei kameran mukana liikkuvia). Se objekti, mitä kamera seuraa (sinun tapauksessasi ruma bussi), pysyy keskellä ruutua ja siis tausta sitten piirretään bussin koordinaattien vastaiseen kohtaan.

Eli:

PiirraKuva(tausta, taustan_paikka_x(varmaan 0) - bussin_paikka_x, tausta_y(=0) - bussi_y);
PiirraKuva(bussi, ruudunleveys / 2, ruudunkorkeus / 2);

mika132 [21.12.2009 02:34:37]

#

Kun aloin liittämään botti engineä peliin niin kohtasin ongelman. Olen luultavasti vain liian väsynyt ja katsonut koodia niin paljon, että en huomaa jotain pientä virhettä, mutta ongelma on:
AI pelaaja (temp-2) ei ole missään pelikentällä.
HUOM! Vain osa koodista

#include "data/start.lu" //alustukset
#include "data/functions.lu" // funktioita
#include "data/tekoaly.lu" //tekoäly minkä sisältö alempana

		if (huone==4)
		{
			temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1);
			temp_1 = rotozoomSurface(mittari_itse, rad2deg(suunta_nopeus), 1, 1);
			temp_2 = rotozoomSurface(autona, rad2deg(vas_1_suunta), 1, 1);
			PiirraKuva(rata_1, naytto, 450-oma_x, -780-oma_y);
			PiirraKuva(mittari, naytto, 0, 0);
			PiirraKuva(temp, naytto, 1024 / 2 - temp->w / 2, 768 / 2 - temp->h / 2);
			PiirraKuva(temp_1, naytto, 69 - temp_1->w / 2, 52 - temp_1->h / 2);
			PiirraKuva(temp_2, naytto, vas_x_1 / 2 - temp_2->w / 2, vas_y_1 / 2 - temp_2->h / 2);
			SDL_FreeSurface(temp);
			SDL_FreeSurface(temp_1);
			SDL_FreeSurface(temp_2);
			SDL_Flip(naytto);

			nappi = SDL_GetKeyState(NULL);
			if (nappi[SDLK_LEFT])
			{
				if (nopeus >= 6)
				{
					suunta+=0.02;
				}
				if (nopeus >= 3.01 && nopeus <= 5.99)
				{
					suunta+=0.05;
				}
				else if (nopeus <= 3)
				{
					suunta+=0.1;
				}
			}
			if (nappi[SDLK_RIGHT])
			{
				if (nopeus >= 6)
				{
					suunta-=0.02;
				}
				if (nopeus >= 3.01 && nopeus <= 5.99)
				{
					suunta-=0.05;
				}
				else if (nopeus <= 3)
				{
					suunta-=0.1;
				}
			}
			if (nappi[SDLK_DOWN])
			{
				nopeus -= JARRUJENTEHO;
				if (nopeus < 0.0)
				{
					nopeus = 0.0;
				}
			}
			if (nappi[SDLK_UP])
			{
				nopeus += KIIHTYVYYS;
				if (nopeus > MAKSIMI_NOPEUS)
				{
					nopeus = MAKSIMI_NOPEUS;
				}
			}
			else
			{
				nopeus -= HIDASTUVUUS;
				if (nopeus < 0.0)
				{
					nopeus = 0.0;
				}
			}

			oma_x += cos((float) suunta) * nopeus;
			oma_y -= sin((float) suunta) * nopeus;
			Tekoaly();

			vas_x_1 += cos((float) vas_1_suunta) * vas_1_nopeus;
			vas_y_1 -= sin((float) vas_1_suunta) * vas_1_nopeus;
			suunta_nopeus=-nopeus/7;
		}

tekoaly.lu:

void Tekoaly(void) {
	vas_1_nopeus += 0.1;

	if (vas_x_1 >= 1800 && vas_x_1 <= 2255 && vas_y_1 >= 1712 && vas_y_1 <= 1960) {
		if (vas_1_nopeus >= 3)
		{
			vas_1_nopeus-=0.8;
		}
		else if (vas_1_nopeus <= 2.99)
		{

		}
	}
	else if (vas_x_1 >= 2345 && vas_x_1 <= 2750 && vas_y_1 >= 1712 && vas_y_1 <= 1960)
	{

	}

}

Sivun alkuun

Vastaus

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

Tietoa sivustosta