Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Open gl kysymys

Sivun loppuun

crafn [09.10.2005 20:50:56]

#

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ä...

Metabolix [09.10.2005 20:53:53]

#

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.

crafn [09.10.2005 21:04:42]

#

Nyt käytän WinApia...

Metabolix [09.10.2005 21:20:23]

#

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.

crafn [10.10.2005 15:07:58]

#

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

sqwiik [10.10.2005 15:54:37]

#

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;

crafn [10.10.2005 16:44:25]

#

Laitta tämmöstä erroria:
main.cpp:102: error: invalid conversion from `BOOL' to `unsigned char*'

Heikki [10.10.2005 16:58:43]

#

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.

Metabolix [10.10.2005 17:27:26]

#

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).

crafn [10.10.2005 17:36:43]

#

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

Metabolix [10.10.2005 17:41:15]

#

... ja käytät Dev-C++:aa? Katsopa vielä SDL-oppaasta, miten nuo kirjastot kuuluu lisätä.

crafn [10.10.2005 18:50:31]

#

Njoo...:)
Mites sit hiiren kordinaatit saahaan selville? :D:D:D

Megant [10.10.2005 18:57:08]

#

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.php?tunnus=sdl3#hiirenkasittely

crafn [10.10.2005 19:01:11]

#

En meinannu SDL:llä vaan vaan WinApilla :D

Megant [10.10.2005 19:06:48]

#

MR.Coodari:
Sitten kannattaa sanoa se.

Heikki [10.10.2005 19:32:04]

#

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

crafn [10.10.2005 19:50:56]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta