Здравствуйте, я уже задавал этот вопрос на другом форуме, но там молчат. А мне ну очень охота бросить на общий суд свой ход мыслей по поводу игровой анимации в JAVA. Я решил для начало поиграться на Swing'овских панелях. Суть проста и стара как мир: создание объекта анимации для ПРОСТЫХ игр. В интернете полно примеров, но мне охота услышать рассматривается ли-то, что мне в голову пришло как вариант анимации или нет. Если нет, то почему? Три класса: 1 - Стартавый Код | import java.awt.Color; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener;
import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JFrame;
public class Start {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLayout(null); f.setSize(650,650); int rep = 100; final Animation a = new Animation(); a.addPart(new ImageIcon("src/1.png").getImage(), rep); a.addPart(new ImageIcon("src/2.png").getImage(), 10); a.addPart(new ImageIcon("src/3.png").getImage(), rep); a.addPart(new ImageIcon("src/4.png").getImage(), 10); a.addPart(new ImageIcon("src/5.png").getImage(), rep); a.addPart(new ImageIcon("src/4.png").getImage(), 10); a.addPart(new ImageIcon("src/3.png").getImage(), rep); a.addPart(new ImageIcon("src/2.png").getImage(), 10); final PaintPanel p = new PaintPanel(); p.setBorder(BorderFactory.createLineBorder(Color.black)); p.setLayout(null); p.setBounds(10,10,600,600); a.setBounds(0,0,100,100); p.add(a); f.add(p);
p.addMouseMotionListener(new MouseMotionListener(){ public void mouseDragged(MouseEvent arg0) { a.setLocation(arg0.getX()-50, arg0.getY()-50); } public void mouseMoved(MouseEvent arg0) {} }); for(int i=0; i<600; i+=100){ for(int j=0; j<600; j+=100){ if(i!=0 || j!=0){ Animation a1 = new Animation(); a1.addPart(new ImageIcon("src/1.png").getImage(), rep); a1.addPart(new ImageIcon("src/2.png").getImage(), rep); a1.addPart(new ImageIcon("src/3.png").getImage(), rep); a1.addPart(new ImageIcon("src/4.png").getImage(), rep); a1.addPart(new ImageIcon("src/5.png").getImage(), rep); a1.setBounds(i,j,100,100); p.add(a1); } } } f.setVisible(true);
}
} |
2- Анимашка Код | import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList;
import javax.swing.JPanel;
public class Animation extends JPanel{ private static final long serialVersionUID = 1L; private ArrayList<Part> parts = new ArrayList<Part>(); private long curTime = System.currentTimeMillis(); private int currentPart = 0; public Animation(){ this.setOpaque(false); }
/** * Дабавляет сцену * @param img Картинка сцены * @param time Длительность показа сцены */ public void addPart(Image img, long time){ parts.add(new Part(img, time)); } /** * @return Возвращает актуальную по времени картинку */ private Image getImage(){ if(parts.size() == 1){ currentPart = 0; return parts.get(currentPart).img; }else if(parts.size() > 1){ if((curTime + parts.get(currentPart).time)<=System.currentTimeMillis()){ currentPart++; if(currentPart == parts.size()){ currentPart = 0; } curTime = System.currentTimeMillis(); } return parts.get(currentPart).img; } return null; } public void paint(Graphics g){ super.paint(g); g.drawImage(getImage(), 0, 0, null); } /** * Вспомогательный класс * */ private class Part{ Image img; // Картинка сцены long time; // Длительность показа сцены public Part(Image img, long time){ this.img = img; this.time = time; } } } |
3- проигрователь анимаций Код | import javax.swing.JPanel;
public class PaintPanel extends JPanel{ private static final long serialVersionUID = 1L; /** * Панэль на каторую добавляются анимашки */ public PaintPanel(){ /** * Трэд для перересовки анимашек */ new Thread(){ public void run(){ while(true){ repaint(); // Обнавить "перересовать" панэль полностью try { Thread.sleep(10); } catch (InterruptedException e) {} } } }.start(); } } |
Присоединённый файл ( Кол-во скачиваний: 3 )
a.zip 10,60 Kb
|