【问题标题】:slow down rectangle in SDL2/CSDL2/C中的减速矩形
【发布时间】:2015-01-04 15:07:35
【问题描述】:

你好,我尝试在我的程序中设置一个真正的重力,所以当我不按键时,较小的矩形应该会变慢。这是我尝试过的代码,但没有发生任何事情(在这方面):

 #include <stdio.h>
#include <SDL2/SDL.h>

int main()
{

  //Request successful execute
  if(SDL_Init(SDL_INIT_EVERYTHING)!=0)
  {
    printf("fehler");
    return 1;
  }

  //create window 800x600
  SDL_Window *win;
  win = SDL_CreateWindow("test",100,100,800,600,SDL_WINDOW_SHOWN);

  //create renderwindow with vysnc enabled
  SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

  if(ren==NULL)
  {
    printf("Fehler");
    SDL_Quit();
    return 1;
  }


  //boolean data type not supported
  int gameRunning = 1;

 SDL_Event event;
 const Uint8 *keystate=SDL_GetKeyboardState(NULL);

//create rectangle which is the whole window
 SDL_Rect rect={
    0,0,800,600
  };
  //smaller rectangle 
  SDL_Rect rect2={
    10,10,50,50
  };

  float v_x = 0;
  float v_y = 0;
  float speedup = 1.f;

//while loop to hold the window opened
  while (gameRunning)
  {
    if (SDL_PollEvent(&event))//close the window 
    {
      if (event.type == SDL_QUIT)
      {
          gameRunning = 0;
      }
    }
    //color of the first rectangle(red)
    SDL_SetRenderDrawColor(ren, 255,0,0,255);
    SDL_RenderClear(ren);
    SDL_RenderFillRect( ren, &rect );

    //second rectangle (blue)
    SDL_SetRenderDrawColor(ren, 0,0,255,255);
    SDL_RenderFillRect( ren, &rect2 );
    //change/update the render
    SDL_RenderPresent(ren);


    if(keystate[SDL_SCANCODE_LSHIFT])
    {
      if (keystate[SDL_SCANCODE_A] ) 
      {
        v_x -= speedup;
      }
      if (keystate[SDL_SCANCODE_D] ) 
      {
        v_x += speedup;
      }
      if (keystate[SDL_SCANCODE_S] ) 
      {
        v_y += speedup;
      }
      if (keystate[SDL_SCANCODE_W] ) 
      {
        v_y -= speedup;
      }
    }
    else if(SDL_KEYDOWN)
    {
      if (keystate[SDL_SCANCODE_A] ) 
      {
        v_x -= 0.1f;
      }

      if (keystate[SDL_SCANCODE_D] ) 
      {
        v_x += 0.1f;
      }

      if (keystate[SDL_SCANCODE_S] ) 
      {
        v_y += 0.1f;
      }

      if (keystate[SDL_SCANCODE_W] ) 
      {
        v_y -= 0.1f;
      }
    }
     else
     {  //make slower(doesnt work)


           v_x= -v_x * 1.f;
           v_y= -v_y * 1.f;
            if(v_x<0.005f || v_y<0.005f)
            {
              v_x=0;
              v_y=0;
            }

     }

    rect2.x += v_x;
    rect2.y += v_y;

    if(rect2.x<0)
      v_x= -v_x * 0.8f;
    else if(rect2.x>=(800-50))
      v_x= -v_x * 0.8f;

    if(rect2.y<0)
      v_y= -v_y * 0.8f;
    else if(rect2.y>=(600-50))
      v_y= -v_y * 0.8f;


  }
  //give heap free
  SDL_DestroyRenderer(ren);
  SDL_DestroyWindow(win);

  SDL_Quit();
    return 0;
}

我的想法是每帧都覆盖重力 v_x 和 v_y。有什么问题?当矩形碰到边界时,v_x/v_y 变得更慢,这是相同的代码。 PS:我使用 C 和 lib SDL2。

当前代码部分:

else if(event.type==SDL_KEYDOWN)
{
  if (keystate[SDL_SCANCODE_A] ) 
  {
    v_x -= 0.1f;
  }

  if (keystate[SDL_SCANCODE_D] ) 
  {
    v_x += 0.1f;
  }

  if (keystate[SDL_SCANCODE_S] ) 
  {
    v_y += 0.1f;
  }

  if (keystate[SDL_SCANCODE_W] ) 
  {
    v_y -= 0.1f;
  }
}

 //make slower(doesnt work)

     else
     {
       v_x-=0.0000005;
       v_y-=0.0000005;
        if(v_x<0.000005f || v_y<0.000005f)
        {
          v_x=0;
          v_y=0;
        }
     }

【问题讨论】:

  • else if(SDL_KEYDOWN) 中的 SDL_KEYDOWN 不是一个值吗?您是否应该检查某个事件的该值?比如说if (event==SDL_KEYDOWN)
  • 这部分运行正常,例如当我按 w,a,s,,d 时我可以控制 rect2。
  • 重点是else if(SDL_KEYDOWN) 始终为真,因此以后的else 永远不会运行。
  • 好吧,这听起来合乎逻辑,但是当我将其更改为 event==SDL_KEYDOWN 时。现在我收到错误:invalid operands to binary == (have ‘SDL_Event’ and ‘int’) .SDL_KEYDOWN 必须是 int 。我应该将这个 int 与什么进行比较?
  • 应该是event.type == SDL_KEYDOWN

标签: c move sdl-2 rect


【解决方案1】:

您的第一个问题是:

else if (SDL_KEYDOWN)

这始终是正确的,因此从未到达 else 分支。这应该是:

else if (event.type == SDL_KEYDOWN)

下一个问题是你的速度减慢代码(注意:空格是免费的,更容易阅读):

v_x -= 0.0000005;
v_y -= 0.0000005;

if (v_x < 0.000005f || v_y < 0.000005f)
{
    v_x = 0;
    v_y = 0;
}

这仅在您的初始速度为正时才有效。如果任一速度为负,则立即将两者都设置为 0。有几种方法可以正确执行此操作,但最简单的方法是显式检查:

const float MIN_SPEED = 0.000005f; // Add to top of function or as a global

...

if (v_x > MIN_SPEED)
   v_x -= MIN_SPEED;
else if (v_x < -MIN_SPEED)
   v_x += MIN_SPEED;
else
   v_x = 0;

并对v_y 进行同样的检查。

【讨论】:

  • 非常感谢,但为什么我可以在按住 L-SHIFT 的同时移动矩形?移动的价值(速度)很小吗?不,当我按住键时,else-case 不应该做任何事情。编辑:当我将“正常”速度的值提高到 0.5 而不是 0.1 时,现在我可以正确移动矩形。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多