Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL: Sprite seuraamaan hiirtä

Anonyymi [23.09.2006 20:11:00]

#

Terve,

Olen tässä nyt parin päivän ajan tutustunut SDL:n saloihin ja käynyt läpi tutoriaaleja täältä ja mureakuhasta. Olen koittanut muokata https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=sdl3 löytyvään koodiin sellaista hommaa että kun liikutan hiirtä ruudulla niin sprite lähtisi menemään sitä kohti. Tässä muutaman tunnin yrityksen jälkeen en ole saanut sitä toimimaan joten jospa joku osaisi neuvoa miten sellainen tehdään.

Tarkoituksena olisi tehdä pieni pelitesti jossa ukkeli (laatikko) liikkuisi aina hiiren osoittamaan suuntaan kun painetaan ylöspäin olevaa nuolinäppäintä ja periaatteessa ukkeli strafettaisi sivulle kun painetaan nuolinäppäintä sivulle. Eli ukkelin etupuoli osoittaisi aina hiiren kursoria kohti.

pukki [23.09.2006 22:01:59]

#

Ensimmäisenä tuli mieleen, että lasket vaikka bresenhamin (googleta) algoritmilla reitin kohti hiiren kursoria ja tallennat sen muistiin ja sitten liikuttelet niitä tallennettuja koordinaatteja pitkin.

En ole nyt kovin viitseliäällä tuulella, joten joudut onkimaan käytännöt yksityiskohdat muualta :p

Metabolix [24.09.2006 11:58:16]

#

Systeemihän toimii joka tapauksessa niin, että jossakin ovat ukkelin koordinaatit ja jossakin ukkelin suuntavektori. Hiiren koordinaatit varmaankin osaat hankkia (SDL_GetMouseState). Näistä kun vähennät ukkelin koordinaatit, saat matkan (x, y), joka pitäisi liikkua, jotta ukkeli pääsisi hiiren luo. Tämän kun jakaa (sekä x- että y-komponentin) Pythagoraan lauseen avulla saatavalla pituudellaan, on lopputuloksena yhden mittainen vektori, joka osoittaa ukkelista kohti hiirtä. Koordinaatteja pitää tietenkin säilyttää liukulukuina, jotta ajatus toimisi tässä muodossa, ja nykyaikana on melko turhaa ruveta kokonaisluvuilla kikkailemaan nopeutuksen toivossa.

struct t_xy {
    float x, y;
};

t_xy ukkeli, ukkelin_suunta;

int hiiri_x, hiiri_y;
SDL_GetMouseState(&hiiri_x, &hiiri_y);
ukkelin_suunta.x = hiiri_x - ukkeli.x;
ukkelin_suunta.y = hiiri_y - ukkeli.y;

if (napit[SDLK_UP]) {
    ukkeli.x += frameen_kulunut_aika * ukkelin_suunta.x;
    ukkeli.y += frameen_kulunut_aika * ukkelin_suunta.y;
} else if (napit[SDLK_DOWN]) {
    ukkeli.x -= frameen_kulunut_aika * ukkelin_suunta.x;
    ukkeli.y -= frameen_kulunut_aika * ukkelin_suunta.y;
} else if (napit[SDLK_LEFT]) {
    ukkeli.x += frameen_kulunut_aika * ukkelin_suunta.y;
    ukkeli.y -= frameen_kulunut_aika * ukkelin_suunta.x;
} else if (napit[SDLK_RIGHT]) {
    ukkeli.x -= frameen_kulunut_aika * ukkelin_suunta.y;
    ukkeli.y += frameen_kulunut_aika * ukkelin_suunta.x;
}

Tuosta ajastussysteemistä (frameen_kulunut_aika) on lisää esimerkiksi aiheissa https://www.ohjelmointiputka.net/keskustelu/11433-framerate ja https://www.ohjelmointiputka.net/keskustelu/10625-hyppyfysiikassa-ongelma

Mazzimo [24.09.2006 17:34:37]

#

Ja tietysti sinun kannattaa sitten luoda oma vektori-luokkasi, eikä laittaa jokaiselle ukkelille samaa koodia. ;)

Anonyymi [25.09.2006 12:27:31]

#

Kiitoksia Metabolix ja muut, nyt ukko juoksee hiiren perässä ja strafekin toimii :) Ei tuo tosiaan kovin kummonen homma näytä olevan, en vaan osannut ajatella sitä oikein.
Nyt vaan kattomaan osaako tehdä toi äijä ampua jotain ;)

Vastaus

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

Tietoa sivustosta