studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java swing animation timer affinetransform

java - para - manual de programacion android pdf



Objetos móviles y temporizadores (1)

Tengo una pantalla con 500 de ancho y 400 de alto, y tengo un vector con muchas formas. digamos que el vector tiene 2 formas diferentes, por ejemplo. Quiero que el objeto aparezca aleatoriamente desde la parte inferior de la pantalla para llegar a un cierto ascenso y luego volver a caer (similar al juego ninja de la fruta, donde los frutos son mis formas).

En mi principal (vista) tengo un vector de formas del cual instanciar los temporizadores, agregar a la matriz y colocarlos en el botón de la pantalla usando la función traducir. Mi temporizador tiene un oyente de acción que básicamente cambia el traductor de la forma para avanzar hasta el ascenso y luego hacia abajo, pero mi problema es que todas las formas comienzan al mismo tiempo independientemente.

Algo como esto:

Shape f = new Shape(new Area(new Ellipse2D.Double(0, 50, 50, 50))); f.translate(0, 400); f.timer = new Timer( 10 , taskPerformer); f.timer.start(); vector.add(f); Shape f2 = new Shape(new Area(new Rectangle2D.Double(0, 50, 50, 50))); f2.translate(200, 400); f2.timer = new Timer( 10 , taskPerformer); f2.timer.setInitialDelay(5000); f2.timer.start(); vector.add(f2);

y mi oyente de acción:

Random generator = new Random(); ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { //...Perform a task... for (Shape s : model.getShapes()) { // Scale object using translate // once reached ascent drop down // translate to diffrenet part of the bottom of the screen // delay its timer } update(); //basically repaints } };

Me encuentro con problemas de que todas las formas siguen el mismo temporizador y comienzan a aparecer al mismo tiempo (sin demora) ...

Cualquier sugerencia sobre cómo evitar esto o si hay un enfoque diferente, debería intentarlo


"Quiero que el objeto salte al azar desde la parte inferior de la pantalla alcance un cierto ascenso y luego vuelva a caer"

Vea el ejemplo ejecutable a continuación. Lo que hago es pasar un radomDelayedStart a la Shape . Cada tic-tac del temporizador, randomDelayedStart disminuye hasta que llega a 0, es cuando se levanta la bandera que se va a dibujar. La mayor parte de la lógica está en los métodos de clase Shape , que se llaman en el Timer Actionlistener del Timer . Todo se hace en un Timer . Para el ascenso, acabo de usar 50 codificados, pero también puedes pasar un ascenso aleatorio a la Shape . Hazme saber si tienes alguna pregunta. Traté de hacer el código lo más claro posible.

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public class RandomShape extends JPanel { private static final int D_HEIGHT = 500; private static final int D_WIDTH = 400; private static final int INCREMENT = 8; private List<Shape> shapes; private List<Color> colors; private Timer timer = null; public RandomShape() { colors = createColorList(); shapes = createShapeList(); timer = new Timer(30, new ActionListener() { public void actionPerformed(ActionEvent e) { for (Shape shape : shapes) { shape.move(); shape.decreaseDelay(); repaint(); } } }); JButton start = new JButton("Start"); start.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { timer.start(); } }); JButton reset = new JButton("Reset"); reset.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { shapes = createShapeList(); timer.restart(); } }); JPanel panel = new JPanel(); panel.add(start); panel.add(reset); setLayout(new BorderLayout()); add(panel, BorderLayout.PAGE_START); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Shape shape : shapes) { shape.drawShape(g); } } @Override public Dimension getPreferredSize() { return new Dimension(D_WIDTH, D_HEIGHT); } private List<Color> createColorList() { List<Color> list = new ArrayList<>(); list.add(Color.BLUE); list.add(Color.GREEN); list.add(Color.ORANGE); list.add(Color.MAGENTA); list.add(Color.CYAN); list.add(Color.PINK); return list; } private List<Shape> createShapeList() { List<Shape> list = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 20; i++) { int randXLoc = random.nextInt(D_WIDTH); int randomDelayedStart = random.nextInt(100); int colorIndex = random.nextInt(colors.size()); Color color = colors.get(colorIndex); list.add(new Shape(randXLoc, randomDelayedStart, color)); } return list; } class Shape { int randXLoc; int y = D_HEIGHT; int randomDelayedStart; boolean draw = false; boolean down = false; Color color; public Shape(int randXLoc, int randomDelayedStart, Color color) { this.randXLoc = randXLoc; this.randomDelayedStart = randomDelayedStart; this.color = color; } public void drawShape(Graphics g) { if (draw) { g.setColor(color); g.fillOval(randXLoc, y, 30, 30); } } public void move() { if (draw) { if (y <= 50) { down = true; } if (down) { y += INCREMENT; } else { y -= INCREMENT; } } } public void decreaseDelay() { if (randomDelayedStart <= 0) { draw = true; } else { randomDelayedStart -= 1; } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame(); frame.add(new RandomShape()); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }