Njoo, on ilmennyt uusi ongelma... :D
Siis miten voidaan tuolla opengl:llä tarkistaa onko jotain näppäintä painettu.
Oon yrittäny ettii googlella ja putkasta mut ei oo löytyny oikee mitää. :)
Ja hiiri on kans yksi ongelma, et miten laitetaan hiirelle x ja y kordinaatit opengl:llä...
OpenGL on vain grafiikkakirjasto, eli siitä ei liity mitään syötteeseen liittyen. Eli kerropa, mitä muuta käytät (WinAPI, SDL, Xlib, ..?), niin saat jonkinlaista apua.
Nyt käytän WinApia...
WM_KEYDOWNiin, että nappi alhaalla ja WM_KEYUPiin, että ei ole. Napit taulukkoon char Napit[256], ja koodit ovat VK_NAPIN_NIMI (esim. VK_ESCAPE), kirjaimilla merkin char-koodi ('A', 'B' jne.) ja ne löytyvät viestin wParam-attribuutista. lParam-attribuutin bitit 16-23 sisältävät scan-koodin, jos haluat mieluummin sitä käyttää. Ne taas menevät vähän mutkikkaammin, yleensä jossakin määrin näppäimen sijainnin mukaisesti.
Toinen tapa selviää tästä makrosta:
#define Nappi_Alhaalla(VK_KOODI) ((unsigned)GetAsyncKeyState(VK_KOODI) & 0x8000 ? 1 : 0)
Kolmas tapa on GetKeyboardState, joka hakee 256-alkioiseen unsigned char
-tauluun kaikkien näppäinten koodit kerralla.
Eli siis, koitin tälleen:
int keyboard; keyboard = GetKeyboardState(NULL); if(keyboard == 29){ return 0; }
Mitä pitäs muuttaa et saisin sen toimii oikein. :D
Kuten sanottu, se palauttaa taulun eikä yksittäistä lukua -_-
Noin kait jotenkin (en ole juurikaan WinAPIin tutustunut)
unsigned char * napit; napit = GetKeyboardState(NULL); if(napit[VK_ESCAPE])return 0;
Laitta tämmöstä erroria:
main.cpp:102: error: invalid conversion from `BOOL' to `unsigned char*'
Näyttää siltä että GetKeyboardState() palauttaa BOOL-taulukon ja yrität laittaa sitä unsigned charriin, mikä ei onnistu. En tiedä noista WinAPI-hommista, mutta kokeile vaikka BOOL *napit tms.
Itse suosittelisin kyllä SDL:ää käytettäväksi OpenGL:n kanssa, jolloin syötteiden luku hoituisi SDL-oppaan 3. osan ohjeilla (SDL:n ja OpenGL:n yhteiskäytöstä kertoo Cone3D:n opassarja.
Anteeksi epäselvä selostus :) Näin se toimii:
// "unsigned char" on sama kuin BYTE unsigned char Napit[256]; GetKeyboardState(Napit); if (Napit[VK_ESCAPE]) exit(0);
Palautusarvo kertoo vain, että funktio onnistui (tai ei onnistunut, joissakin harvoissa tapauksissa).
Nohnih... Nyt mä laitoin SDL:llä ikkunat sun muut ja piirtämisen hoidan Opengl:llä mut tuli virhe:
[Linker error] undefined reference to `WinMain@16'
Koodi on täs:
#include <SDL/SDL.h> #include <gl/gl.h> int main(int argc, char *argv[]) { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "Voi voi voi sdl:n alustus meni pieleen: %s\n", SDL_GetError()); return 0; } SDL_Surface * screen; screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); int mx, my, mouse; float theta=0.0; while (1) { SDL_Event tapahtuma; SDL_PollEvent(&tapahtuma); mouse=SDL_GetMouseState(&mx, &my); Uint8* keyboard; keyboard=SDL_GetKeyState(NULL); glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glRotatef (theta, 1.0f, 1.0f, 1.0f); glBegin (GL_LINE_LOOP); glColor4f(1.0,0.0,0.0, 0.0); glVertex4f (0.0f, 1.0f, 0.0f, 1.0f); glColor4f(0.0,1.0,0.0, 0.0); glVertex4f (0.87f, -0.5f,0.0f ,1.0f); glColor4f(0.0,1.0,0.0, 0.0); glVertex4f (0.3f, -0.0f,0.0f ,1.0f); glColor4f(0.0,0.0,1.0, 0.0); glVertex4f (-1.0f, -0.10f, 0.5f, 1.0f); glColor4f(0.0,1.0,2.0, 0.0); glVertex4f (0.1f, 0.1f, 0.5f, 1.0f); glEnd (); glPopMatrix (); glFlush( ); theta += 1.0f; if(keyboard[SDLK_ESCAPE]) break; SDL_Delay(1); } SDL_Quit(); return 0; }
Edit: Kiitti Metabolix :D
... ja käytät Dev-C++:aa? Katsopa vielä SDL-oppaasta, miten nuo kirjastot kuuluu lisätä.
Njoo...:)
Mites sit hiiren kordinaatit saahaan selville? :D:D:D
Tuossa koodissasi on jo hiiri-funktio.
int mx,my,mouse;//hiiren x,y ja napit mouse=SDL_GetMouseState(&mx, &my); //otetaan selville
https://www.ohjelmointiputka.net/oppaat/opas.
En meinannu SDL:llä vaan vaan WinApilla :D
MR.Coodari:
Sitten kannattaa sanoa se.
Tuo SDL-pätkäsi on myös virheellinen. Ensinnäkin, ikkunaa luotaessa tarvitaan lippu SDL_OPENGL. Kaksoispuskuroitaessa taas käytetään flippaukseen funktiota SDL_GL_SwapBuffers();
Itselläni on tällainen hallintaluokka (hieman muokattu versio Cone3D:n oppaista) käytössä, voit vilkaista: http://mbnet.fi/heikki_m/ogl_sdl.txt
Kiitos paljon, mut toi WinMain@16 vieläkin kiusaa enkä ymmärrä mitä se meinaa :D
Yritän ettii googlella.:)
Edit: Löyty neuvo täältä ohjelmointiputkasta. Mulla oli ne
-lmingw32 -lSDLmain -lSDL -mwindows vääräs jäjestukses :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.