Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使对象独立移动?(爪哇)_Java_Multithreading_Object_Graphics_Jframe - Fatal编程技术网

Java 如何使对象独立移动?(爪哇)

Java 如何使对象独立移动?(爪哇),java,multithreading,object,graphics,jframe,Java,Multithreading,Object,Graphics,Jframe,一个物体应该如何自己移动?我下面的项目是一个简单的乒乓球游戏翻拍的当前代码。我已经成功地通过用户输入让左桨移动,但我不知道如何编程Ball对象和AI桨对象独立移动。我怀疑我需要很多线程,但是我应该把它们放在哪里,如何从线程中更新我的对象 也许我把球和桨的物体放错了位置 主类: package com.N00744323.pingpong; import javax.swing.JFrame; public class Display { static JFrame frame

一个物体应该如何自己移动?我下面的项目是一个简单的乒乓球游戏翻拍的当前代码。我已经成功地通过用户输入让左桨移动,但我不知道如何编程Ball对象和AI桨对象独立移动。我怀疑我需要很多线程,但是我应该把它们放在哪里,如何从线程中更新我的对象

也许我把球和桨的物体放错了位置

主类:

package com.N00744323.pingpong;

import javax.swing.JFrame;

public class Display 
{   
    static JFrame frame;
    public static void main(String[] args) 
    {
        frame = new JFrame("Ping Pong");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(new GUI());

        frame.pack();
        frame.setVisible(true);
    }
}
package com.N00744323.pingpong;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class GUI extends JPanel
{
    private static final long serialVersionUID = 1L;

    final private int WIDTH = 750, HEIGHT = 500;

    private Paddle p1, p2;
    private Ball b;

    public GUI()
    {   
        addKeyListener(new DirectionListener());
        p1 = new Paddle(1);
        p2 = new Paddle(2);
        b = new Ball();
        setBackground(Color.black);

        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
    }

    public int getWIDTH()
    {
        return WIDTH;
    }
    public int getHEIGHT()
    {
        return HEIGHT;
    }

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

        page.setColor(Color.black);
        page.fillRect(0, 0, WIDTH, HEIGHT);

        page.setColor(Color.white);
        page.fillRect(p1.getLocX(), p1.getLocY(), p1.getWIDTH(), p1.getHEIGHT());
        page.fillRect(p2.getLocX(), p2.getLocY(), p2.getWIDTH(), p2.getHEIGHT());

        page.fillOval(b.getLoc()[0], b.getLoc()[1], b.getSIZE()*2, b.getSIZE()*2);
    }

    private class DirectionListener implements KeyListener
    {
        public void keyPressed(KeyEvent e) 
        {
            int key = e.getKeyCode();
            if(key == (KeyEvent.VK_UP))
            {
                p1.setLocY(-3);
                System.out.println("Up!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    p1.setLocY(3);
                    System.out.println("Down!");
                }
            repaint();
        }

        public void keyReleased(KeyEvent e) 
        {
            int key = e.getKeyCode();

            if(key == (KeyEvent.VK_UP))
            {
                System.out.println("Up stopped!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    System.out.println("Down stopped!");
                }
        }

        public void keyTyped(KeyEvent e) 
        {
            int key = e.getKeyCode();

            if(key == (KeyEvent.VK_UP))
            {
                p1.setLocY(-2);
                System.out.println("Up!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    p1.setLocY(2);
                    System.out.println("Down!");
                }

            repaint();
        }
    }
}
package com.N00744323.pingpong;

public class Paddle
{
    final private int WIDTH = 10, HEIGHT = 45;
    private int locY, locX;

    public Paddle(int player)
    {
        if(player == 1)
        {
            locY = (500/2) - HEIGHT;
            locX = 20;
        }
        if(player == 2)
        {
            locY = (500/2) - HEIGHT;
            locX = 750-WIDTH-20;
        }
    }

    public void setLocY(int locY)
    {
        if(locY + this.locY >= 0 && this.locY + locY <= 500 - HEIGHT)
            this.locY += locY;
    }

    public int getLocY()
    {
        return locY;
    }

    public int getLocX()
    {
        return locX;
    }

    public int getWIDTH()
    {
        return WIDTH;
    }

    public int getHEIGHT()
    {
        return HEIGHT;
    }
}
package com.N00744323.pingpong;

public class Ball
{
    final private int SIZE = 5;
    private int x, y;

    public Ball()
    {
        x = (750/2) - SIZE*2;
        y = (500/2) - SIZE*2;
    }

    public int getSIZE()
    {
        return SIZE;
    }

    public int[] getLoc()
    {
        int[] pos = {x, y};
        return pos;
    }

    public void setLoc(int[] pos)
    {
        x = pos[0];
        y = pos[1];
    }
}
GUI框架类:

package com.N00744323.pingpong;

import javax.swing.JFrame;

public class Display 
{   
    static JFrame frame;
    public static void main(String[] args) 
    {
        frame = new JFrame("Ping Pong");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(new GUI());

        frame.pack();
        frame.setVisible(true);
    }
}
package com.N00744323.pingpong;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class GUI extends JPanel
{
    private static final long serialVersionUID = 1L;

    final private int WIDTH = 750, HEIGHT = 500;

    private Paddle p1, p2;
    private Ball b;

    public GUI()
    {   
        addKeyListener(new DirectionListener());
        p1 = new Paddle(1);
        p2 = new Paddle(2);
        b = new Ball();
        setBackground(Color.black);

        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
    }

    public int getWIDTH()
    {
        return WIDTH;
    }
    public int getHEIGHT()
    {
        return HEIGHT;
    }

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

        page.setColor(Color.black);
        page.fillRect(0, 0, WIDTH, HEIGHT);

        page.setColor(Color.white);
        page.fillRect(p1.getLocX(), p1.getLocY(), p1.getWIDTH(), p1.getHEIGHT());
        page.fillRect(p2.getLocX(), p2.getLocY(), p2.getWIDTH(), p2.getHEIGHT());

        page.fillOval(b.getLoc()[0], b.getLoc()[1], b.getSIZE()*2, b.getSIZE()*2);
    }

    private class DirectionListener implements KeyListener
    {
        public void keyPressed(KeyEvent e) 
        {
            int key = e.getKeyCode();
            if(key == (KeyEvent.VK_UP))
            {
                p1.setLocY(-3);
                System.out.println("Up!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    p1.setLocY(3);
                    System.out.println("Down!");
                }
            repaint();
        }

        public void keyReleased(KeyEvent e) 
        {
            int key = e.getKeyCode();

            if(key == (KeyEvent.VK_UP))
            {
                System.out.println("Up stopped!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    System.out.println("Down stopped!");
                }
        }

        public void keyTyped(KeyEvent e) 
        {
            int key = e.getKeyCode();

            if(key == (KeyEvent.VK_UP))
            {
                p1.setLocY(-2);
                System.out.println("Up!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    p1.setLocY(2);
                    System.out.println("Down!");
                }

            repaint();
        }
    }
}
package com.N00744323.pingpong;

public class Paddle
{
    final private int WIDTH = 10, HEIGHT = 45;
    private int locY, locX;

    public Paddle(int player)
    {
        if(player == 1)
        {
            locY = (500/2) - HEIGHT;
            locX = 20;
        }
        if(player == 2)
        {
            locY = (500/2) - HEIGHT;
            locX = 750-WIDTH-20;
        }
    }

    public void setLocY(int locY)
    {
        if(locY + this.locY >= 0 && this.locY + locY <= 500 - HEIGHT)
            this.locY += locY;
    }

    public int getLocY()
    {
        return locY;
    }

    public int getLocX()
    {
        return locX;
    }

    public int getWIDTH()
    {
        return WIDTH;
    }

    public int getHEIGHT()
    {
        return HEIGHT;
    }
}
package com.N00744323.pingpong;

public class Ball
{
    final private int SIZE = 5;
    private int x, y;

    public Ball()
    {
        x = (750/2) - SIZE*2;
        y = (500/2) - SIZE*2;
    }

    public int getSIZE()
    {
        return SIZE;
    }

    public int[] getLoc()
    {
        int[] pos = {x, y};
        return pos;
    }

    public void setLoc(int[] pos)
    {
        x = pos[0];
        y = pos[1];
    }
}
拨片对象类:

package com.N00744323.pingpong;

import javax.swing.JFrame;

public class Display 
{   
    static JFrame frame;
    public static void main(String[] args) 
    {
        frame = new JFrame("Ping Pong");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(new GUI());

        frame.pack();
        frame.setVisible(true);
    }
}
package com.N00744323.pingpong;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class GUI extends JPanel
{
    private static final long serialVersionUID = 1L;

    final private int WIDTH = 750, HEIGHT = 500;

    private Paddle p1, p2;
    private Ball b;

    public GUI()
    {   
        addKeyListener(new DirectionListener());
        p1 = new Paddle(1);
        p2 = new Paddle(2);
        b = new Ball();
        setBackground(Color.black);

        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
    }

    public int getWIDTH()
    {
        return WIDTH;
    }
    public int getHEIGHT()
    {
        return HEIGHT;
    }

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

        page.setColor(Color.black);
        page.fillRect(0, 0, WIDTH, HEIGHT);

        page.setColor(Color.white);
        page.fillRect(p1.getLocX(), p1.getLocY(), p1.getWIDTH(), p1.getHEIGHT());
        page.fillRect(p2.getLocX(), p2.getLocY(), p2.getWIDTH(), p2.getHEIGHT());

        page.fillOval(b.getLoc()[0], b.getLoc()[1], b.getSIZE()*2, b.getSIZE()*2);
    }

    private class DirectionListener implements KeyListener
    {
        public void keyPressed(KeyEvent e) 
        {
            int key = e.getKeyCode();
            if(key == (KeyEvent.VK_UP))
            {
                p1.setLocY(-3);
                System.out.println("Up!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    p1.setLocY(3);
                    System.out.println("Down!");
                }
            repaint();
        }

        public void keyReleased(KeyEvent e) 
        {
            int key = e.getKeyCode();

            if(key == (KeyEvent.VK_UP))
            {
                System.out.println("Up stopped!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    System.out.println("Down stopped!");
                }
        }

        public void keyTyped(KeyEvent e) 
        {
            int key = e.getKeyCode();

            if(key == (KeyEvent.VK_UP))
            {
                p1.setLocY(-2);
                System.out.println("Up!");
            }
            else    
                if(key == (KeyEvent.VK_DOWN))
                {
                    p1.setLocY(2);
                    System.out.println("Down!");
                }

            repaint();
        }
    }
}
package com.N00744323.pingpong;

public class Paddle
{
    final private int WIDTH = 10, HEIGHT = 45;
    private int locY, locX;

    public Paddle(int player)
    {
        if(player == 1)
        {
            locY = (500/2) - HEIGHT;
            locX = 20;
        }
        if(player == 2)
        {
            locY = (500/2) - HEIGHT;
            locX = 750-WIDTH-20;
        }
    }

    public void setLocY(int locY)
    {
        if(locY + this.locY >= 0 && this.locY + locY <= 500 - HEIGHT)
            this.locY += locY;
    }

    public int getLocY()
    {
        return locY;
    }

    public int getLocX()
    {
        return locX;
    }

    public int getWIDTH()
    {
        return WIDTH;
    }

    public int getHEIGHT()
    {
        return HEIGHT;
    }
}
package com.N00744323.pingpong;

public class Ball
{
    final private int SIZE = 5;
    private int x, y;

    public Ball()
    {
        x = (750/2) - SIZE*2;
        y = (500/2) - SIZE*2;
    }

    public int getSIZE()
    {
        return SIZE;
    }

    public int[] getLoc()
    {
        int[] pos = {x, y};
        return pos;
    }

    public void setLoc(int[] pos)
    {
        x = pos[0];
        y = pos[1];
    }
}

谢谢

我很感激你把这个建议扔到这里,但是我该怎么办呢?我应该把它放在哪里?如果有的话,我对它有什么作用?上次我写代码在屏幕上移动球时,Java还没有被发明出来。但无论如何,您可以通过处理“键”事件来移动拨片以响应用户输入。你希望球随着时间的推移而移动。听起来您可能想为某种计时器事件编写一个处理程序。这就是我所知道的。你需要的是一个游戏循环,用run方法创建新线程,更新游戏对象的状态并调用GUI的重新绘制,所有这些都在无限循环中。@kamil,如果你要告诉一个noob创建一个与Swing交互的新线程,那么你可能还应该告诉他们关于
SwingUtilities.invokeLater()
。Andrew,大多数Swing方法只能在Swing的事件分派线程(EDT)中调用。invokeLater(Runnable r)是其他线程在EDT中调用函数的方式。