2D游戏开发与SDL2 + Lazarus + Pascal奇怪的bug

时间:2016-12-30 03:53:03

标签: windows pascal sdl-2 lazarus

我正在使用太空喷气机开展 MOBA 游戏,其中4个玩家团队互相竞争。 我正在使用 FPC 3.0 SDL2.0.5 和Windows 7的 Lazarus IDE 的最新版本。

游戏说明: 玩家可以通过使用鼠标指向目的地并按 ENTER 来飞行他的喷气式飞机。射流在x / y轴上移动4000 * 4000区域,输出窗口800 * 600。查看下面的.gif文件,它取自关卡的最高区域。看看喷射器的运动是多么平滑和流畅。(实际游戏更平滑,但我不想超过堆栈的图像大小限制。)

enter image description here

问题说明:当一架飞机飞到4000 * 4000区域的BOTTOM或RIGHT侧时,虽然Pascal控制台识别出输入,但它并没有顺利响应空间输入通常与其他方面一样。就好像它会跳过计算一样。请参阅下面的.gif文章,了解远处的效果。

enter image description here

什么不是错的:

  • 这不是操作系统。我在WinXP和Linux中都尝试过编译和播放,结果是一样的。
  • 不是PC。我在几台机器上试过了。
  • 这不是碰撞检测代码。我禁用它并产生相同的结果。
  • 这不是相机代码。我禁用它并产生相同的结果。
  • 不是按 ENTER 来提供目的地和移动代码。我逐行检查。我把它改写了。它总是一样的。

我认为发生了什么:我认为事实只发生了BOTTOM和RIGHT导致了某种程度上它试图拉伸(?)水平纹理......这样的事情。有什么想法吗?

抱歉我的英语不好。

编辑:这是我的照相机跟随我的喷码。

   //UP                                                           //<--------clip blit  //
  if (shipy <= wheight/2)then                                                              //
   begin                                                          //
       cliprect^.x:= shipx-round(wwidth/2);                                                          //
       cliprect^.Y:=1;                                                                   //
   end;                                                                                  //
  //DOWN                                                                         //
  if ( shipy >= 4000-(wheight/2) ) then                                                         //
     begin                                                    //
         cliprect^.x:= shipx-round(wwidth/2);                                                        //
       cliprect^.Y:= 4000 - wheight-1;                                                               //
    end;                                                                                 //
  //LEFT                                                                       //
   if(shipx <=wwidth/2) then                                                              //
      begin                                                       //
        cliprect^.x:=1;                                                                  //
       cliprect^.Y:= shipy-round(wheight/2);                                                          //
        end;                                                                             //
   //RIGHT                                                                              //
   if (shipx >=(4000-(wwidth/2))) then                                                          //
    begin                                                         //
      cliprect^.x:=4000-wwidth-1;                                                                 //
      cliprect^.Y:= shipy-round(wheight/2);                                                           //
      end;                                                                               //
                                                                                         //
                                                                                         //
                                                                                         //
     //=========CORNERS=========//                                                        //
                                                                                         //
                                                                                         //
     //UP - LEFT                                                                   //
      if (shipy <= wheight/2) AND   (shipx <= wwidth/2) THEN                                 //
       BEGIN                                                                             //
                                                                 //
        cliprect^.x:=1;                                                                  //
        cliprect^.Y:=1;                                                                  //
       END;                                                                              //
                                                                                         //
      //UP - RIGHT                                                                    //
         if (shipy <= wheight/2) AND   (shipx >=4000-(wwidth/2)) THEN                           //
       BEGIN                                                                             //
                                                                  //
        cliprect^.x:=4000-wwidth-1;                                                               //
        cliprect^.Y:=5;                                                                  //
       END;                                                                              //
                                                                                         //
       //DOWN LEFT                                                                 //
         if (shipy >= 4000-(wheight/2)) AND   (shipx <=wwidth/2) THEN                           //
       BEGIN                                                                             //
                                                                  //
        cliprect^.x:=1;                                                                  //
        cliprect^.Y:=4000-wheight-1;                                                               //
       END;                                                                              //
                                                                                         //
                                                                                         //
       //DOWN- RIGHT                                                                    //
        if (shipy >= 4000-(wheight/2)) AND   (shipx >=4000-(wwidth/2)) THEN                         //
       BEGIN                                                                             //
                                                                  //
        cliprect^.x:=4000-wwidth-1;                                                               //
        cliprect^.Y:=4000-wheight-1;                                                               //
       END;                                                                              //
                                                                                         //
                                                                                         //
                                                                                         //
                                                                                         //
                                                                                        //
   if (shipy >wheight/2) AND ( shipy < 4000-(wheight/2)) AND  (shipx > wwidth/2) AND  (shipx < 4000-(wwidth/2)) then      //
    begin                                                                               //
   cliprect^.x:=shipx-round(wwidth/2);                                                             //
   cliprect^.Y:=shipy-round(wheight/2);                                                            //
                                                             //
      end;                                         //<--------------CAMERA----------//

0 个答案:

没有答案