【问题标题】:My boolean method java我的布尔方法 java
【发布时间】:2013-03-05 09:52:15
【问题描述】:

我已经做了很多寻找这个问题的答案,并进行了一些编辑,但我无法让它工作。我认为我的布尔方法 getColor() 有问题。我试图在不同类的循环中使用它。

我的 getColor 方法,来自 AvatarPanel 类

    public boolean setColor(boolean good)
{

    if (good == true)
        what--;
        avatars.get(0).setBackground(colors.get(what));
    repaint();
    if (good == false)  
        what++;
        avatars.get(0).setBackground(colors.get(what));
    repaint();

    return good;
}

这是我试图在其中使用 getColor 的 Background 类中的 attackPerformed 方法。我不确定我是否写错了其中一个方法,或者 attackPerformed 是否需要一个侦听器。游戏仍然正常运行并且工作正常。我只是想要一些帮助,以确保这些内容至少写得正确。

我认为显示后台构造函数可能是一个好主意,因为我认为它需要调用attackPerformed。我不知道我需要在哪里调用attackPerformed,尽管我很确定它会在后台构造函数中。 attackPerformed 方法如下图,构造函数在顶部。

public class Background extends JPanel implements Constants, ActionListener
{
   private static final long serialVersionUID = 1L;

   private final Color BACK_COLOR = Color.GRAY;

   private ArrayList<Sprite> sprites;

   private Avatar avatar;

   /** Constructor  */
   public Background()
   {

       sprites = new ArrayList<Sprite>();
       reset(0);
       setBackground(BACK_COLOR);


       KeyboardFocusManager manager =KeyboardFocusManager.getCurrentKeyboardFocusManager();
       manager.addKeyEventDispatcher(new KeyEventDispatcher()
       {
        public boolean dispatchKeyEvent(KeyEvent event)
        {
            int x = 0, y = 0;
            double angle = 0;
            Point p = avatar.getPosition();

            switch (event.getKeyCode())
            {
            case KeyEvent.VK_DOWN:
                y=6;
                angle=270;
                break;

            case KeyEvent.VK_UP:
                y = -6;
                angle = 90;
                break;

            case KeyEvent.VK_LEFT:
                x = -6;
                break;

            case KeyEvent.VK_RIGHT:
                x = 6;
                angle = 180;
                break;
            }

            avatar.setParameters();
            p.x += x;
            p.y += y;
            avatar.setPosition(p);
            avatar.setAngle(angle);

            if (!getBounds().contains(avatar.getBounds()))
            {
                avatar.restore();
                Toolkit.getDefaultToolkit().beep();
                return true;
            }
            repaint();
            return true;            
        }



    });
    Timer timer = new Timer(15, this);
    timer.start();



} //end of constructor  



public void attackPerformed()
{
    for(Sprite s : sprites)
    {
        AvatarPanel panel = new AvatarPanel();
        Rectangle r = new Rectangle(sprites.get(0).getBounds());
        Rectangle p = new Rectangle(sprites.get(1).getBounds());

            if(r.intersects(p))
            {
                panel.setColor(false);
            }               
    }   
}


public void actionPerformed(ActionEvent e)
{
    for (Sprite s : sprites)
    {
        if (s instanceof Move)
        {
            s.setParameters();
            for (int i=0; i<3; i++)
            {
                ((Move)s).nextPosition();
                if (!getBounds().contains(s.getBounds()))
                {
                    ((Move) s).moveFailed();
                }
                else break;
            }
        }
    }
    repaint();
}




public @Override void paintComponent(Graphics g)
{
   super.paintComponent(g); /* Let the parent class do its painting */

   for (Sprite sprite: sprites)
   {
       sprite.draw(g);
   }
 }

public void reset(int level)
{
    Sprite sprite = null;

    int x, y, angle;
    double scale, min, max;

    sprites.clear();
    int[] figures = FIGURES[level];
    for (int f=0; f<figures.length; f++)
    {
        for (int i=0; i<figures[f]; i++)
        {
            x = (int)(Math.random()*600 + 100);
            y = (int)(Math.random()*400 + 100);

            switch (f)
            {
                case 0:
                    sprite = avatar = new Avatar(x,y);
                    break;
                case 1:

                    sprite = new Predator(x,y);
                    break;
                case 2:
                    sprite = new Mine(x,y);
                    break;
                case 3:
                    sprite = new Shield(x,y);
                    break;
            }

            angle = (int)(Math.random()*360);
            sprite.setAngle(angle);

            min = sprite.getMinScaleFactor();
            max = sprite.getMaxScaleFactor();
            scale = Math.random() * (max - min) + min;
            sprite.setScale(scale);

            sprites.add(sprite);
            repaint();
        }
    }
}

}

【问题讨论】:

  • 您是否缺少 setColor 中的一些 {}?当您执行 if 语句时,如果您没有使用 {} 中包含的语句块来执行该语句,它只会有条件地运行第一个语句。所以现在,唯一有条件的就是你的 what-- 和 what++ 行。每次调用 setColor 时,都会执行两个 setBackground 和 repaint 步骤。
  • 在 setColor 方法中,使用正确的缩进级别或花括号。
  • return 语句在哪里?它接缝了您的 setColor 方法的一部分。
  • 是的,我在 set color 上的复制粘贴一定漏掉了一个括号。
  • 我在 setColor 上修复了我的复制粘贴以显示返回

标签: java methods boolean


【解决方案1】:

我强烈建议使用方括号,因为 repaint() 方法会在 if 语句之外执行。因为,布尔值只能有两个可能的值,你可以使用 'else' 而不是第二个 if...

public boolean setColor(boolean good)
{
    if (good == true)
    {
        what--;
        avatars.get(0).setBackground(colors.get(what));
        repaint();
    }
    else 
    {    
        what++;
        avatars.get(0).setBackground(colors.get(what));
        repaint();
    }

【讨论】:

    【解决方案2】:

    看起来你的 if 和 else 情况非常相似。 您可以将其简化为。

    public boolean setColor(boolean good)
    {
        what+=good?-1:+1;
        avatars.get(0).setBackground(colors.get(what));
        repaint();
        return good;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2021-09-28
      • 1970-01-01
      • 2018-06-23
      • 2017-09-12
      • 2015-11-10
      • 1970-01-01
      相关资源
      最近更新 更多