所以我想用Java从头开始制作一个像游戏一样简单的Pong。我目前正在移动两个桨。但是,我一开始就陷入困境。我试图设置两个桨的起始位置,但是我不能。我试图通过设置自定义布局来尝试,但是后来我想通过移动它们来不断改变它们的位置。
我有以下代码:
package com.kristof;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("gEngine");
Player playerOne = new Player();
Player playerTwo = new Player();
frame.add(playerOne.getMyPanel());
frame.add(playerTwo.getMyPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.RED);
frame.setSize(1280, 720);
frame.setResizable(false);
frame.setVisible(true);
}
public static class Player {
private JPanel myPanel;
public Player() {
this.myPanel = new MyPanel();
}
public JPanel getMyPanel() {
return myPanel;
}
}
static class MyPanel extends JPanel {
public MyPanel() {
setBackground(Color.BLACK);
}
@Override
public void paintComponent(Graphics g) {
// let the component be painted "natural"
super.paintComponent(g);
// Do custom painting
g.setColor(Color.WHITE);
g.fillRect(50, getHeight() / 2, 20, 120);
}
}
}
我已经尝试通过在setLocation
上调用myPanel
方法来更改其位置,但这没有用。
因此您创建了一个Player类,但是在该类中没有播放器的位置。
由于桨将仅上下移动,我们只需要用于更改y坐标的方法。
static class Player{
int x;
int y;
Player(int x){this.x=x;}
void moveUp(){y--;}
void moveDown(){y++;}
void drawPlayer(Graphics2D g){
g.fillRect(x,y,40,120);
}
}
现在在扩展JPanel的类(在您的情况下为MyPanel
中,我们可以将新创建的Player
类作为输入(通过将其放入构造函数中)] >>
我们还可以创建一个计时器,以便帧定期刷新。通过在时钟中添加players[0].moveDown;
,第一个桨叶将每帧向下移动
在绘画方法中,我们可以遍历播放器并通过使用drawPlayer
类中的Player
方法来显示它们。
MyPanel(Player[] players) { this.players = players; setBackground(Color.BLACK); new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { repaint(); players[0].moveDown; } }, 300, 1000 / 60); } @Override public void paint(Graphics g) { super.paintComponent(g); g.setColor(Color.WHITE); for(Player p : players){ p.drawPlayer((Graphics2D) g); } }
现在放在一起,我们只需要在启动程序时创建播放器。
Player[] players = new Player[]{ new Player(100), new Player(1000) }; frame.add(new PongWindow(players));
这是代码的外观:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("gEngine");
Player[] players = new Player[]{
new Player(100),
new Player(1000)
};
frame.add(new PongWindow(players));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.RED);
frame.setSize(1280, 720);
frame.setResizable(false);
frame.setVisible(true);
}
static class Player{
int x;
int y;
Player(int x){this.x=x;}
void moveUp(){y+= -8;}
void moveDown(){y+= 8;}
void drawPlayer(Graphics2D g){
g.fillRect(x,y,40,120);
}
}
static class PongWindow extends JPanel {
//private JPanel panel = new JPanel();
Player[] players;
PongWindow(Player[] players) {
this.players = players;
setBackground(Color.BLACK);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
players[0].moveDown();
}
}, 300, 1000 / 60);
}
@Override
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
for(Player p : players){
p.drawPlayer((Graphics2D) g);
}
}
}
}