2015-09-14 3 views
1

Я пытаюсь создать простую игру в стиле stickman, где работает stickman. Я добавил 2 фотографии; 1, где он стоит и 1, где он бежит. Сделали JFrame и попытались переключаться между изображениями в нем, добавив первый рис, затем удалите его и добавьте другой.Нужна помощь, чтобы переключаться между изображениями в игре stickman

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Spil extends JFrame { 
private static String path_for_image = "index.jpeg"; 
private static String path2_for_image = "run.jpeg"; 

@SuppressWarnings("deprecation") 
public void run(){ 
    JFrame frame = new JFrame("STICKMAN"); 
    frame.setVisible(true); 
    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    ImageIcon image = new ImageIcon(path_for_image); 
    JLabel label = new JLabel(image); 

    ImageIcon image2 = new ImageIcon(path2_for_image); 
    JLabel label2 = new JLabel(image2); 

    while(true){ 
     add(label); 
     label.move(10, 0); 
     if(label.isEnabled()){ 
      remove(label); 
      add(label2); 
     } else { 
      remove(label2); 
      add(label); 
     } 
    } 
} 
} 

^^ Здесь я сделать JFrame и код ниже мой основной класс:

EDIT:

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Spil extends JFrame { 
private static String path_for_image = "index.jpeg"; 
private static String path2_for_image = "run.jpeg"; 

@SuppressWarnings("deprecation") 
public void run(){ 
    JFrame frame = new JFrame("STICKMAN"); 
    frame.setVisible(true); 
    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    ImageIcon image = new ImageIcon(path_for_image); 
    JLabel label = new JLabel(image); 

    ImageIcon image2 = new ImageIcon(path2_for_image); 
    JLabel label2 = new JLabel(image2); 

    while(true){ 
     frame.add(label); 
     label.move(10, 0); 
     if(label.isEnabled()){ 
      frame.remove(label); 
      frame.add(label2); 
     } else { 
      frame.remove(label2); 
      frame.add(label); 
     } 
    } 
} 

}

public class Main { 

public static void main(String[] args){ 
    Spil run = new Spil(); 
    run.run(); 
} 
} 

Проблема заключается в том, что JFrame появляется, но без фотографий

+0

Вы пробовали 'перекрасить()' ИНГ ваш JFrame? –

+0

измените значок изображения, вместо этого добавьте remove jlable.and, в чем смысл делать это за какое-то время? –

+0

@FastSnail Метка добавляется в оператор while. –

ответ

1

использования свинга таймер

есть куча проблем в коде

1) add(label); должно быть frame.add(label); у вас есть расширяет класс с рамкой .Но вы создали рамки локального varible и использовал it.so добавить добавит ваш класс/jframe вместо frame.so ваш фрейм не имеет lable. либо вы можете удалить ключевое слово extends, либо использовать класс Spil в качестве jframe, тогда вам не нужно создавать другую переменную кадра. JFrame frame = new JFrame("STICKMAN"); ) .См пример 2, как сделать с помощью extends jframe

2) label.isEnabled() всегда верно, так что вы никогда не выполнится еще block.to isEnable быть ложным должно быть отключено.

3) удаление и добавление jlables действительно неэффективно, вы можете легко изменить значок изображения.

4) бесконечный цикл будет блокировать Edt и FreeZ вашего gui.swing таймер будет обрабатывать это без блокировки EDT

5) анимации нужна временная промежуток, если вы очень быстро это действительно не выглядит nice.in в этом примере у меня установлен временной промежуток до 10 millisecond. вы можете изменить скорость своей анимации, изменив значение 10.

свинг таймер прост в использовании и идеально подходит для вашего требования.

пример 1 без расширяет JFrame


import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.Timer; 

public class Spil { 

    private static final ImageIcon img1 = new ImageIcon("index.jpeg"); 
    private static final ImageIcon img2 = new ImageIcon("run.jpeg"); 

    boolean bool = false; 

    public void run() { 
     JFrame frame = new JFrame("STICKMAN"); 
     frame.setVisible(true); 
     frame.setSize(300, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel label = new JLabel(img1); 

     frame.add(label); 
     Timer t = new Timer(10, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       if (bool) { 
        label.setIcon(img1); 
       } else { 
        label.setIcon(img2); 
       } 
       bool=!bool; 
      } 
     }); 
     t.start(); 

    } 

    public static void main(String[] args) { 
     Spil run = new Spil(); 
     run.run(); 
    } 
} 

пример 2/продолжается JFrame


import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.Timer; 

public class Spil extends JFrame { 

    private static final ImageIcon img1 = new ImageIcon("index.jpeg"); 
    private static final ImageIcon img2 = new ImageIcon("run.jpeg"); 

    boolean bool = false; 

    public void run() { 
     super.setTitle("STICKMAN"); 

     JLabel label = new JLabel(img1); 
     add(label); 

     Timer t = new Timer(10, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       if (bool) { 
        label.setIcon(img1); 
       } else { 
        label.setIcon(img2); 
       } 
       bool = !bool; 
      } 
     }); 
     t.start(); 

    } 

    public static void main(String[] args) { 
     Spil run = new Spil(); 
     run.setSize(400,300); 
     run.setVisible(true); 
     run.run(); 
    } 
} 
Смежные вопросы