【问题标题】:Completed my frogger game, having trouble with precision of my collision system完成了我的青蛙游戏,我的碰撞系统的精度有问题
【发布时间】:2015-12-03 23:48:37
【问题描述】:

所以我正在创建一个青蛙游戏,我几乎得到了一切,但我遇到了一个小问题,我拥有的碰撞系统非常不一致,我一直试图找出什么,但我不能完全弄清楚它是什么。我希望它在碰到矩形时立即停止。任何帮助都会得到帮助。

import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
public class frogger
{
   static double frogX = .5;
   static double frogY = .02;
   static double frogW = .02;
   static double frogH = .02;
   static double halfWidth = .05;
   static double halfHeight = .02;

   static double speeds[] = {.02, .03, .035 , .040, .043, .046, .060, .070};

   static Rectangle2D.Double[] rectangles = {new Rectangle2D.Double(.45 , .12 , .1 , .04), new Rectangle2D.Double(.45 , .27 , .1 , .04), new Rectangle2D.Double(.45 , .42 , .1 , .04),
   new Rectangle2D.Double(.45 , .57 , .1 , .04), new Rectangle2D.Double(.45 , .72 , .1 , .04), new Rectangle2D.Double(.45 , .87 , .1 , .04), new Rectangle2D.Double(.45 , .92 , .1 , .04)};

   public static void drawscene()
   {
      StdDraw.clear();
      StdDraw.setPenColor(StdDraw.GREEN);
      StdDraw.filledRectangle(frogX, frogY, frogW, frogH);      
      StdDraw.setPenColor(StdDraw.RED);
      for(int i = 0; i < rectangles.length; i++)
      {
      StdDraw.filledRectangle(rectangles[i].x + halfWidth, rectangles[i].y - halfHeight, halfWidth, halfHeight);
      }
      StdDraw.show(1000/24);  
   }



   public static void updateDirection() 
   {

     for(int i = 0; i < rectangles.length; i++){
         rectangles[i].x += speeds[i];
     }

     for(int i = 0; i < rectangles.length; i++){
         if(rectangles[i].x + halfWidth >= .98 || rectangles[i].x + halfWidth <= .02){
             speeds[i] *= -1;
         }
     }



      if (StdDraw.isKeyPressed(KeyEvent.VK_UP))
      {
          frogY += .01;
      }
      else if(StdDraw.isKeyPressed(KeyEvent.VK_DOWN))
      {
         frogY -= .01;
      }
      else if(StdDraw.isKeyPressed(KeyEvent.VK_LEFT))
      {
          frogX -= .01;
      }
      else if(StdDraw.isKeyPressed(KeyEvent.VK_RIGHT))
      {
          frogX += .01;
      }

   }

   public static void main(String[] args)  
   {
      outerloop: 
      while(true)
      {
         frogger.drawscene();
         frogger.updateDirection();
         if (frogX  >= 1 )
         { 
            break;
         }
         if (frogX  <= 0)
         {

            break;
         }   
         if(frogY >= 1)
         {
            break;
         }

         Rectangle2D.Double frog = new Rectangle2D.Double(frogX - frogW, frogY + frogH, frogW * 2, frogH * 2);

         for(int i = 0; i < rectangles.length; i++){
             if(frog.intersects(rectangles[i])){
                 break outerloop;
             }
         }

      }

      // put whatever you want to display at the end of the game here


   }
}

【问题讨论】:

    标签: java collision-detection rectangles


    【解决方案1】:

    所以,我几乎可以肯定这与 Java 中双精度和浮点数的不准确性有关:

    Why not use double or float to represent currency?

    我从未在这里使用过您正在使用的库。当您需要更高精度时,推荐的解决方案通常是使用 BigDecimal 类。但是,我不能说我确定你会如何使用这个库来做到这一点。

    【讨论】:

    • 是的,我正在使用 StdDraw.java,但我已经下载了 std.lib 并将其放入我的 jgrasp 中
    • 只是出于好奇,你有没有让这个工作呢?我有一段时间没有玩过这样的游戏了。我拿走了您的代码并将您的所有doubles 转换为BigDecimals,使用BigDecimal 函数执行所有操作,这似乎在某种程度上解决了不准确性。但是,我没有时间思考您的碰撞逻辑(即碰撞逻辑没有按我预期的那样执行)。
    • 嗯,我的想法是它在哪里绘制矩形检查青蛙是否与矩形发生碰撞,这使得碰撞真正组成,我试图找出大十进制类,但我们'从来没有了解过它,所以我对如何实现它感到困惑
    • @kyle 我将从这个程序的一个更简单的版本开始,然后从那里构建它。您当前的程序有多个具有不同长度和高度的矩形,以不同的速度在不同的方向移动。所有这些变量都会使您调试情况的工作变得更加困难。我建议从一只“青蛙”和一个固定的“障碍物”开始,它们的高度和宽度都很容易在你的脑海中计算(即长度和宽度为 0.5 而不是 0.592)。移动青蛙时将它们的坐标打印到System.out。看看你能从中推断出什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多