Привет, на данный момент я делаю простую 2d-игру в java, и теперь мой вопрос - вот какая у вас лучшая возможность для этого? JFrame, JPanel или Canvas? Я говорю о каждом 2d игра в Java, так что я не добавлял кодJFrame, JPanel или Canvas для игры (Java)?
0
A
ответ
0
Один популярный подход заключается в переопределении paintComponent в JPanel как так:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// put drawing code here
}
Вы можете вызвать это вызвав repaint
метод в другом месте JPanel, обычно в ответ на события Key для ввода пользователем или от Timer
для обновлений с фиксированным интервалом.
Вот некоторый код, который вы можете использовать, чтобы вы начали:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.WindowConstants;
public class GameFrame extends JFrame {
private static final long serialVersionUID = 1L;
public GameFrame() {
super("Game Frame");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(new GamePanel(), BorderLayout.CENTER);
pack();
setResizable(false);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new GameFrame();
frame.setVisible(true);
}
});
}
}
class GamePanel extends JPanel implements ActionListener, KeyListener {
private static final long serialVersionUID = 1L;
private static final Dimension PANEL_SIZE = new Dimension(640, 480);
private static final int REFRESH_RATE = 1000;
private static final int CHARACTER_WIDTH = 32;
private static final int CHARACTER_HEIGHT = 64;
private Timer timer = new Timer(REFRESH_RATE, this);
private int currentRow = 0;
private int currentCol = 0;
private int randomRow = 0;
private int randomCol = 0;
public GamePanel() {
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
timer.start();
}
public Dimension getPreferredSize() {
return PANEL_SIZE;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(randomCol, randomRow, CHARACTER_WIDTH, CHARACTER_HEIGHT);
g.drawRect(currentCol, currentRow, CHARACTER_WIDTH, CHARACTER_HEIGHT);
}
public void actionPerformed(ActionEvent e) {
int min = 0;
int maxRow = (int)PANEL_SIZE.getHeight() - CHARACTER_HEIGHT;
int maxCol = (int)PANEL_SIZE.getWidth() - CHARACTER_WIDTH;
Random rand = new Random();
randomRow = rand.nextInt((maxRow - min) + 1) + min;
randomCol = rand.nextInt((maxCol - min) + 1) + min;
repaint();
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
int rowIncrement = 0;
int colIncrement = 0;
if(code == KeyEvent.VK_LEFT) {
colIncrement--;
}
else if(code == KeyEvent.VK_RIGHT) {
colIncrement++;
}
else if(code == KeyEvent.VK_UP) {
rowIncrement--;
}
else {
if(code == KeyEvent.VK_DOWN) {
rowIncrement++;
}
}
if(isInBounds(rowIncrement, colIncrement)) {
currentRow += rowIncrement;
currentCol += colIncrement;
repaint();
}
}
private boolean isInBounds(int rowIncrement, int colIncrement) {
int top = currentRow + rowIncrement;
int left = currentCol + colIncrement;
int right = left + CHARACTER_WIDTH;
int bottom = top + CHARACTER_HEIGHT;
return (top >= 0 && left >= 0 && right <= PANEL_SIZE.getWidth() && bottom <= PANEL_SIZE.getHeight());
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
}
Смежные вопросы
- 1. Java - JPanel против Canvas
- 2. Очистить JPanel или JFrame
- 3. C# вручную создать окно, например, JFrame, JPanel/Canvas & Graphics
- 4. Когда использовать JFrame или JPanel
- 5. Как очистить JFrame или JPanel?
- 6. CardLayout, в JFrame или JPanel?
- 7. Java JFrame BufferStrategy против Canvas BufferStrategy
- 8. JScrollPane - в JFrame или JPanel?
- 9. Java, swing, JFrame и JPanel
- 10. Java, прозрачный JFrame под Canvas
- 11. Canvas или Swing для простой настольной игры в Java?
- 12. Удаление JPanel из JFrame
- 13. Java Swing JFrame запускает еще один JFrame для игры
- 14. Центрирование JPanel в JFrame
- 15. Java - JFrame, JPanel и Components Не показывать
- 16. Java - JFrame, JPanel, Layout и Clipping
- 17. Несколько JPanel или JFrame с MVC
- 18. метод repaint() в JFrame или Jpanel?
- 19. Закрытие окна JPanel из JFrame [Java]
- 20. Добавление JScrollPane в JFrame/JPanel
- 21. Преобразование JFrame в JPanel
- 22. Как визуализировать консоль java в JFrame/JPanel
- 23. «Расширяет JFrame» и JPanel?
- 24. Добавить JPanel в JFrame
- 25. Позиция a Jpanel В середине Jframe или другого Jpanel
- 26. Невозможно изменить цвет фона JFrame или JPanel
- 27. JPanel Меньше, чем JFrame
- 28. Как рисовать изображение в JPanel или JFrame?
- 29. JPanel in JFrame
- 30. Java Swing - Создание прокручиваемой JPanel внутри JFrame
ТНХА много к вам :) – Touko