移动物体和计时器 [英] Moving objects and timers

查看:23
本文介绍了移动物体和计时器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个宽度为 500、高度为 400 的屏幕,我有一个带有一堆形状的矢量.例如,假设向量有 2 种不同的形状.我希望物体从屏幕底部随机弹出,达到一定的上升然后再下降(类似于游戏水果忍者,水果是我的形状).

I have a screen with say 500 width and 400 height, and I have a vector with a bunch of shapes. let say the vector has 2 different shapes for example. I want the object to randomly pop up from the bottom of the screen reach a certain ascent and then fall back down (similar to game fruit ninja, where the fruits are my shapes).

在我的主(视图)中,我有一个形状向量,我将其实例化了定时器,添加到数组中并使用 translate 函数将它们放置在屏幕的底部.我的计时器接收了一个动作监听器,它基本上改变了形状的平移,向上移动到上升然后向下移动,但我的问题是不管怎样,所有的形状都同时开始.

In my main (view) I have a vector of shapes of which i instantiate the timers, add to array and place them in the buttom of the screen using the translate function. My timer takes in an action listener which basically changes the translate of the shape to move up till ascent and then down, but my problem is that all the shapes start at the same time regardless.

像这样:

        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);

和我的动作监听器:

        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      
            }

    };

我遇到的问题是所有形状都遵循相同的计时器,并且同时开始弹出(无延迟)......

I'm running into problems that all shapes follow the same timer, and begin to pop up at the same time (no delay) ...

关于如何避免这种情况的任何建议,或者如果有不同的方法我应该尝试

Any suggestions on how to avoid this or if there is a different approach i should try

推荐答案

我想让物体从屏幕底部随机弹出,达到一定的上升然后再下降"

"I want the object to randomly pop up from the bottom of the screen reach a certain ascent and then fall back down"

请参阅下面的可运行示例.我所做的是将 radomDelayedStart 传递给 Shape.计时器的每个滴答声,randomDelayedStart 都会减少,直到它达到 0,这就是要绘制的标志升起的时候.大部分逻辑在Shape 类方法中,在TimerActionlistener 中调用.一切都在one Timer 中完成.对于上升,我只使用了硬编码 50,但您也可以将随机上升传递给 Shape.如果您有任何问题,请告诉我.我试图使代码尽可能清晰.

See the runnable example below. What I do is pass a radomDelayedStart to the Shape. Every tick of the timer, the randomDelayedStart decreases til it reaches 0, that's when the flag to be drawn in raised. Most of the logic is in the Shape class methods, which are called in the Timers Actionlistener. Everything is done in one Timer. For the ascent, I just used a hard coded 50, but you can also pass a random ascent to the Shape. Let me know if you have any questions. I tried to made the code as clear as possible.

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);
            }
        });
    }
}

这篇关于移动物体和计时器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆