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.
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.
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
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/
Ja tietysti sinun kannattaa sitten luoda oma vektori-luokkasi, eikä laittaa jokaiselle ukkelille samaa koodia. ;)
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 ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.