Перемещение 2d-символа работает только в 1 направлении

#c #opengl #character #move #key

#c #opengl #символ #переместить #Клавиша

Вопрос:

Хорошо, моя проблема в том, что я работаю над 2d-игрой (например, mario bros.) .. и я застрял на перемещении персонажа, я реализовал ключи.. и получил простой quad для тестирования перемещения.. но на самом деле это работает не так, как я хочу.

когда я нажимаю «a», мой квадрокоптер перемещается влево, когда я нажимаю «w», мой квадрокоптер перемещается вверх .. просто, но это работает, но если я нажимаю «d», мой квадрокоптер просто не перемещается вправо .. он просто каким-то образом исчезает, хотя я сделал это так же, как и левую клавишу .. и удаление левой клавиши, чтобы посмотреть, влияет ли это на движение x, не помогло

заранее спасибо.. надеюсь, у вас, ребята, есть идея.. я в замешательстве

— как я уже сказал .. другие клавиши работают .. но нажатие d не перемещает квадрокоптер — xpos — это GLfloat, я также пробовал float .. без изменений — нажатие d по какой-то причине приводит к исчезновению моего квадрокоптера


 if (active){        
                            if (keys[VK_ESCAPE])
            {
                done=TRUE;
            }
            if (keys['W'])
            {
                if(!toggle)
                {
                ypos=ypos 1.0;
                toggle=1;
                }
            }
            if (!keys['W'])
                {
                    ypos=0.0;toggle=0;
                }
            if (keys['A'])
            {
                    t_key=1;
                    xpos1=xpos1-0.1f; 
            }                
            if (keys['D'])          
            {
                    t_key=0;
                    xpos2=xpos2-0.1f;
            }   
            else                        
            {
                DrawWorld();                
                DrawChar();
                SwapBuffers(hDC);
            }
  

}


 int DrawChar(GLvoid){
glLoadIdentity();   // Reset The Current Modelview Matrix
GLfloat xtrans;
if(t_key){
    xtrans=xpos1;
    xpos2=xpos1;
}
else{
    xtrans=xpos2;
    xpos1=xpos2;
}
GLfloat ytrans=ypos;    
glTranslatef(0.0f,0.0f,-30.0f);     // move 5 units into the screen
glTranslatef(xtrans,ytrans,0.0f);
...
  

ЗАКЛЮЧЕНИЕ

если есть кто-то еще, у кого такие же проблемы … и он прочитал только несколько статей нехе вместо того, чтобы делать все уроки.. (он использовал if только для escape, что работает) вот что вы, вероятно, поняли неправильно.. поместите функции рисования и swapbuffers за пределы else и удалите их .. иначе это не сработает

и спасибо за решение с быстрым ответом:

 if (active){        
                        if (keys[VK_ESCAPE])
        {
            done=TRUE;
        }
        if (keys['W'])
        {
            if(!toggle)
            {
            ypos=ypos 1.0;
            toggle=1;
            }
        }
        if (!keys['W'])
            {
                ypos=0.0;toggle=0;
            }
        if (keys['A'])
        {
                t_key=1;
                xpos1=xpos1-0.1f; 
        }                
        if (keys['D'])          
        {
                t_key=0;
                xpos2=xpos2-0.1f;
        }
            DrawWorld();                
            DrawChar();
            SwapBuffers(hDC);
  

Ответ №1:

Почему у вас есть такой код:

 if (condition1) 
{
   instruction1
}
if (condition2)
{
   instruction2
} 
else 
{
   instruction3
}
  

Обратите внимание, что instruction3 будет выполнено, только если condition2 вычисляется как false . В вашем случае condition2 есть keys['D'] . Другими словами, если вы нажмете D , карта не будет обновлена. Может ли это быть проблемой?

Комментарии:

1. боже … теперь я чувствую себя по-настоящему смущенной ^^ Я просто удалил else, и это работает.. большое вам спасибо.. это всегда одно и то же … я думаю, что слишком сложно