Ruch postaci po przekątnej (SDL/Opengl)

0

A więc mam problem z wprowadzeniem ruchu po przekątnej postaci. Gdy wcisne np strzalke i jakikolwiek inny klawisz to postac Od razu sie zatrzymuje, tak jakby zmienna event przechowywala tylko 1 wcisniety klawisz. Jak zrobic aby po wcisnieciu strzalki np w prawo i do gory postac szla po przekatnej?
Będę ogromnie wdzieczny za pomoc
To moj kod: funkcja zwracajaca zdarzenia, glowna petla odbierajaca zdarzenia, i funkcja do wsywietlania w ktorej jest tez opisane czy klawisz strzalki zostal wcisniety.

SDL_Event &ClassProgram::ReturnEvent(){
return event;
}

void ClassProgram::ProcessEvents(){
if(End) return;
while(SDL_PollEvent(&event) && event.type != SDL_MOUSEMOTION){
if(event.type == SDL_QUIT){
End = true;
break;
}
}
}

void ClassProgram::menu(){
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);

Screen = SDL_SetVideoMode(ScrWidth, ScrHeight, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_GL_MULTISAMPLEBUFFERS);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

glClearColor(0, 0, 0, 0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glViewport(0, 0, ScrWidth, ScrHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, ScrWidth, ScrHeight, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
object_laduj1.Load();

End = false;
while(!End){
ProcessEvents();
Draw(&ReturnEvent());
}
SDL_FreeSurface(Screen);
}

void ClassProgram::Draw(SDL_Event *GameEvent){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if(GameEvent->key.state == SDL_PRESSED && GameEvent->key.keysym.sym == SDLK_RIGHT) pos_x1 +=3;
else if(GameEvent->key.state == SDL_PRESSED && GameEvent->key.keysym.sym == SDLK_LEFT) pos_x1-=3;
if(GameEvent->key.state == SDL_PRESSED && GameEvent->key.keysym.sym == SDLK_UP) pos_z1 -=3;
else if(GameEvent->key.state == SDL_PRESSED && GameEvent->key.keysym.sym == SDLK_DOWN) pos_z1+=3;

object_laduj1.Draw(80, 80, 80, 80, pos_x1, pos_z1+pos_y1, 80, 80, false, 44);

SDL_GL_SwapBuffers();
}
0

Musisz analizować nie tylko KEYDOWN zaś KEYUP również.
obejrzy drugi przykład:
http://gpwiki.org/index.php/SDL:Tutorials:Practical_Keyboard_Input

0

Heh no tak, szczerze to nie chodzi o to że nie umiem sprawić by postać szła po przekątnej. Rzeczywisty problem jest nieco bardziej skomplikowany ;p. Ma ktoś może jakąś swoją grę napisaną w SDL'u? Niech sprawdzi czy mu się nie zacina gdy wciska szybko na przemian shift i ctrl ^^ -> to wlasnie problem... zacina sie ;p
Przy takim rozwiazaniu jak mi podales (za ktore jestem oczywiscie wdzieczny) jednak ten problem pozostaje :/. Szczerze to chyba w wielu grach napisanych w SDL'u ten blad wystepuje tylko autorzy o nim nie wiedza

0

Zależy jak rozwiązałeś obsługę tych Shift i Ctrl.
Chodzi o to że nie zawsze na jeden KEYDOWN SHIFT przepada jeden KEYUP SHIFT.
Jeżeli to uwzględnisz to będzie działać jak należy.

0

Nigdy bym na to nie wpadl o.O Wielkie dzieki za te info, moglbys jeszcze mi pomoc co zrobic z tymi keyupami i keydownami aby gra sie nie scinala podczas naciskania shift i ctrl szybko na przemian? Bo jakos nic mi do glowy nie przychodzi :|

0

Dokładnie tak jak w tutorialu, link podałem w jednym z poprzednich postów.
Jedynie co musisz ustawiać/zdejmować flagi ShiftWcisniety CtrlWcisniety.
Po ustawieniu/zdjęciu obu dopiero to analizować.
Pamiętając że może zaistnieć sytuacja, np:
Shift-Down
Ctrl-Down
Shift-Up
Shift-Down
Ctrl-Up
Shift-Up

0

eh nie mam pojęcia jak to zrobić :/. Jak sie ustawia/zdejmuje flagi? Próbowałem jakoś w ten sposób:

if(GameEvent->key.type == SDL_KEYDOWN && GameEvent->key.keysym.sym == SDLK_RSHIFT) GameEvent->key.type = SDL_KEYUP;
if(GameEvent->key.type == SDL_KEYDOWN && GameEvent->key.keysym.sym == SDLK_RCTRL) GameEvent->key.type = SDL_KEYUP;

ale nadal nie wychodzi. Próbowałem jakoś ten stan kierować za pomocą SDL_GetKeyState(NULL) też nie wychodziło. Szczerze mówiąc to wlasnie w ogole nie wiem jak obchodzic sie z tymi flagami

0

Flagi to są zmienne typu bool.
Ustawić flag = przypisać wartość true

0

A moglbym prosic o jakis dokladny schemat jak zaprojektować te instrukcje itd? Bo jak na razie to mi same chyba bzdury wychodza ;p, dodalem jeszcze zmienna keystate ktora przechowujewartosc flagi nacisnietego klawisza i jakos kombinowalem z tym ale nadal nic ;/

if(GameEvent->key.type == SDL_KEYDOWN && GameEvent->key.keysym.sym == SDLK_RSHIFT) shift = true;
if(GameEvent->key.type == SDL_KEYDOWN && GameEvent->key.keysym.sym == SDLK_RCTRL) ctrl = true;
if(shift == true && ctrl == true){
keystate[SDLK_RSHIFT] = false; keystate[SDLK_RCTRL] = false; 
shift = false; ctrl = false;
GameEvent->key.type = SDL_KEYUP;
}
0

Powiem może wprost, jak na razie to są dla ciebie za wysokie progi.
Może poczytaj jakiś kurs programowania, zrób kilka prostszych zadań w trybie konsolowym.
Wtedy, może, za jakiś pół roku zaczniesz w połowie rozumieć co do ciebie mówię.
Jak na razie nie rozumiesz prawie nic.

0

Myslisz ze Od razu bez praktyki rzucilem sie na Opengl/SDL? Napisalem weza, kolko i krzyzyk i wiselca w konsoli :P i mam juz jej dosc. Poza tym w konsoli nie mozna sie nauczyc prawie nic co mogloby pomoc w tworzeniu gier w bibliotekach graficznych. Cóż szukalem jakisch info dotyczacych tych flag itp ale nic nie znalazlem ;/. Może zapodasz jakis keyword odnoszący sie do mojego problemu? Bylbym wdzieczny ^^

0

wpisz w google:
SDL Tutorials Practical Keyboard Input

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.