Не могу понять, как перекрывать изображения в Java - PullRequest
4 голосов
/ 26 сентября 2011

Поэтому я решил заняться программированием как хобби, и сейчас я работаю над созданием игрового автомата с помощью обучающих программ.Однако у меня возникли проблемы с перекрытием изображений.Я использовал фоторедактор для создания .png файла того, что я хочу сделать фоном с тремя прозрачными полями для аниматоров слотов.

Код для рисования фона:

  public class SlotMachineBackground extends JPanel
        {
          private ImageIcon image;

      public void paintComponent (Graphics g)
      {
        super.paintComponent (g);
        image = new ImageIcon ("/Users/Documents/slotmachine.png");
        image.paintIcon (this, g, 0,0);
      }
    }//end class

Затем я создал слот-аниматоры:

public class SlotAnimator extends JPanel implements ActionListener
{
  private Timer animator;
  private ImageIcon imageArray []= new ImageIcon [22];
  int currentFrame = 0;
  int slotNumber = 1;
  int box = 1;
  SlotMachine m = new SlotMachine ();
  String [] mP = m.returnTurn();

  public SlotAnimator (int delay)
  {
    for (int i = 1; i < 22; i += 2)
      imageArray [i] = new ImageIcon ("/Users/Documents/blank.gif");
    for (int i = 0; i < 21; i ++)
    {
      if (i == 0 || i == 8 || i== 12)
        imageArray [i] = new ImageIcon ("/Users/Documents/cherry.gif");
      if ( i == 2 || i == 6 || i == 16)
        imageArray[i] = new ImageIcon ("/Users/Documents/1bar.gif");
      if (i == 4)
        imageArray [i] = new ImageIcon ("/Users/Documents/seven.gif");
      if (i== 10 || i == 14)
        imageArray[i] = new ImageIcon ("/Users/Documents/2bar.gif");
      if (i == 18)
        imageArray[i] = new ImageIcon ("/Users/Documents/3bar.gif");
      if (i==20)
        imageArray [i] = new ImageIcon ("/Users/Documents/jackpot.gif");
    }

    animator = new Timer (delay, this);
    animator.start();

    }

  public void paintComponent (Graphics g)
  {  
    super.paintComponent (g);

    if (currentFrame >= imageArray.length)
    {
      animator.stop();
      ImageIcon im = m.findPicture (mP[box]);
      box++;
      im.paintIcon (this, g, 0, 0);
    }
    imageArray [currentFrame].paintIcon (this, g, 0, 0);
  }

  public void actionPerformed (ActionEvent e)
  {
    repaint();

     currentFrame ++;
  }
}//end class

Затем я попытался объединить их в JFrame:

public class SlotAnimatorTest 
{
  public static void main (String [] args)
  {
    JFrame frame = new JFrame (); 
    SlotMachineBackground b = new SlotMachineBackground ();


    SlotAnimator a0 = new SlotAnimator (45);
    SlotAnimator a1 = new SlotAnimator (90);
    SlotAnimator a2 = new SlotAnimator (180);


    frame.add (b);
    frame.add(a0);
    frame.setSize (1500,1500);
    frame.setVisible (true);

  }
}

Однако подходит только аниматор.Я в тупике, как вы можете сказать, я все еще любитель.В любом случае, заранее благодарю за любой совет !!

1 Ответ

7 голосов
/ 26 сентября 2011

В основном это вопрос макетов, и я предлагаю вам прочитать учебник по ним: Учебники по макету

В вашей ситуации JLayeredPane может работать хорошо.Он использует нулевую разметку по умолчанию, и поэтому вам нужно будет указать размеры и позиции вашего компонента, если вы будете использовать это, но вы также можете указать ему z-порядок ваших компонентов и, таким образом, сможете разместить игровой автомат внизшая позиция и вещи, которые идут сверху на более высоких позициях.Опять же, учебник поможет с подробностями: Учебник JLayeredPane

Кроме того, вы действительно не должны читать какие-либо файлы из метода paintComponent, особенно файл изображения, которое нене меняется - какой смысл перечитывать изображение, замедляя рисование каждый раз, когда вы перерисовываете изображение, когда изображение не меняется, и вы можете просто сохранить его в переменной в классе?Так что прочитайте его один раз в конструкторе класса, а затем сохраните его в переменной.

...