Wciśniecie dwóch przycisków. Opengl.

0

Poszukuje jakiś kod albo instrukcje jak napisać w opengl obsługę 2 lub więcej klawiszy. Znalazłem kilka tematów podobnych lecz w żądnym nie znalazłem szczegółowej instrukcji, jedynie pomysł na stworzenie tablicy wypełnianej wartością false lub true i sprawdzanie jej. Chodzi mi o przemieszczanie obiektu po przekątnych a do tego są potrzebne 2 klawisze. Ma ktoś jakąś rade jak to napisać? Obiekt przy obsłudze oddzielnie tylko 4 strzałek na klawiaturze działa opornie i porusza sie jak powinien tylko po klikaniu a nie przyciskaniu cały czas.

0

Przechwytuj osobno komunikaty o wciśnięciu klawisza i o puszczeniu. A w międzyczasie w timerze wykonuj odpowiednie akcje z nimi związane. Robisz sobie 4 boole odpowiadające strzałkom. W timerze który sie wykonuje co 100ms sprawdzasz które boole są na true i wykonujesz odpiowiednie akcje na obiektach (przesuwanie w odpowiednią strone). No i samo wykrywanie przyciśnięcia klawisza. Jeśli program wykryje że strzałka do góry została wciśnieta, ustawiasz sobie boola na true (i timer wtedy bierze go pod uwagę) a gdy otrzymasz komunikat o puszczeniu strzałki do góry, to resetujesz tego boola.

0

Poszukuje jakiś kod albo instrukcje jak napisać w opengl obsługę 2 lub więcej klawiszy.

OpenGL jest do grafiki, nie do klawiszy.

To tak samo jakbyś zapytał jak napisać obsługę dwóch klawiszy w DirectSound. Albo w MySQL. Albo w libjpeg.

W czym więc chcesz napisać te klawisze?

Czego używasz do otwarcia okna: GLUT, SDL, WinAPI?

0

Działa rozwiązanie od misiakufal, praktycznie jak joystick - ktory jest jeszcze szybszy od klawiatury.

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "GL/freeglut.h"


bool LeftArrow= false;
bool RightArrow = false;;
bool UPArrow = false;
bool DownArrow = false;

static float flyinObject_x =0.0;
static float flyinObject_y =-6.7;
static float flyinObject_z =0.0;


int main(int argc, char** argv)
{ 
///***...
    glutKeyboardFunc(key);
    glutKeyboardUpFunc( keyup );
    glutSpecialFunc(SpecialInput);
    glutSpecialUpFunc(SpecialInputReleaseKey);
    glutSetKeyRepeat(1);
    glutTimerFunc(40,Timer,0);
///***...
}

void SpecialInput(int key, int x, int y)
{
    switch(key)
    {
    case GLUT_KEY_UP:
        //flyinObject_z+=+0.1;
        UPArrow = true;
        break;
    case GLUT_KEY_DOWN:
       // flyinObject_z+=-0.1;
        DownArrow = true;
        break;
    case GLUT_KEY_LEFT:
       // flyinObject_x+=+0.1;
        LeftArrow = true;
        break;
    case GLUT_KEY_RIGHT:
       // flyinObject_x+=-0.1;
       RightArrow = true;
        break;
    }
}


void SpecialInputReleaseKey(int key, int x, int y)
{
    switch(key)
    {
    case GLUT_KEY_UP:
        UPArrow = false;
        break;
    case GLUT_KEY_DOWN:
        DownArrow = false;
        break;
    case GLUT_KEY_LEFT:
        LeftArrow = false;
        break;
    case GLUT_KEY_RIGHT:
       RightArrow = false;
        break;
    }
}


GLvoid Timer( int value )
{
if (UPArrow==true){flyinObject_z+=+0.07;}
if(DownArrow==true){flyinObject_z+=-0.07;}
if (LeftArrow==true){flyinObject_x+=+0.07;}
if(RightArrow==true){flyinObject_x+=-0.07;};

glutTimerFunc(30, Timer, 0);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1