Moikka pitkästä aikaa!
Olen palannut lomiltani ohjelmoinnin pariin, ja nyt aikomuksissani on ohjelmoida ohjelma, jolla voi piirtää suorakulmioita hiiren avulla. Ohjelmassa on muutakin, mutta kyseinen ongelmani koskee tätä ominaisuutta.
Suorakulmioita pitäisi pystyä piirtämään hiirellä painamalla vasenta nappia pohjassa ja vetämällä hiirtä, jolloin muodostuu suorakulmio aloituspaikan ja kursorin koordinaattien välille. Tiedätte idean, jos olette esimerkiksi pelanneet strategiapelejä, joissa yksiköitä voi valita rajaamalla alue kartasta. Tämän tyylistä haen, mutta en tiedä, kuinka SDL:llä käsitellään hiiren painalluksia, kun napit ovat pohjassa.
Onko vinkkejä?
SDL_GetMouseState():lla saat selville mitä hiiri tekee, laittelet sitten vaan talteen tiedot kun nappi on painettu pohjaan ja päästetty irti.
Hiiren käsittely toimii yleensä sulavammin, jos tarkkailet SDL:n mouse eventtejä. SDL_GetMouseState
:ssa on se ongelma, että yksittäiset klikkaukset voivat jäädä huomaamatta, koska ko. funkkaria ei välttämättä kutsuta juuri sillä hetkellä, kun hiiri on pohjassa. Tuossa tapauksessa SDL_GetMouseState
kuitenkin toimii varmaan riittävän hyvin.
Tämä saattaa kuulostaa hölmöltä, mutta miten SDL_GetMouseState():n avulla voi huomata, ettei käyttäjä enää paina vasenta nappia? Olen ymmärtänyt, että kyseinen funktio kertoo vain, onko hiiren X nappi pohjassa. Jos hiiren ensimmäinen nappi painetaan pohjaan ja myöhemmin otetaan pois, miten tiedän, että se on otettu pois, jos voin vain tutkia painalluksia?
Burton kirjoitti:
Tämä saattaa kuulostaa hölmöltä, mutta miten SDL_GetMouseState():n avulla voi huomata, ettei käyttäjä enää paina vasenta nappia? Olen ymmärtänyt, että kyseinen funktio kertoo vain, onko hiiren X nappi pohjassa.
Jos nappi on ollut aikaisemmin pohjassa ja ei ole enää, niin siitä voi päätellä, että sen pohjaan painaminen on jossain välissä täytynyt lopettaa.
Jos käsittelet ohjelman saamat viestit SDL_PollEvent-funktion avulla, saat erilliset viestit, kun nappi menee alas, kun hiiri liikkuu ja kun nappi nostetaan ylös. Toinen vaihtoehto on käyttää yllä mainittua funktiota tilan selvittämiseen ohjelman joka kierroksella. Tässä vielä esimerkki molemmista tavoista:
#include <SDL.h> void aloita_laatikko(int alku_x, int alku_y); // tallenna arvot void jatka_laatikkoa(int loppu_x, int loppu_y); // piirrä laatikko (alku - loppu) void lopeta_laatikko(int loppu_x, int loppu_y); // valitse alue (alku - loppu) void tapa_a() { int silmukka = 1; SDL_Event e; while (silmukka) { while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_MOUSEBUTTONDOWN: aloita_laatikko(e.button.x, e.button.y); break; case SDL_MOUSEMOTION: jatka_laatikkoa(e.motion.x, e.motion.y); break; case SDL_MOUSEBUTTONUP: lopeta_laatikko(e.button.x, e.button.y); break; } } } } void tapa_b() { int silmukka = 1; int napit, vanhat_napit, x, y; while (silmukka) { SDL_PumpEvents(); vanhat_napit = napit; napit = SDL_GetMouseState(&x, &y); if (napit) { if (vanhat_napit) { jatka_laatikkoa(x, y); } else { aloita_laatikko(x, y); } } else { if (vanhat_napit) { lopeta_laatikko(x, y); } else { /* ei nappeja */ } } } }
Kiitos erittäin paljon, Metabolix! Tämä valaisi suuresti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.