gpt4 book ai didi

java - 如何使用键绑定(bind)使矩形在屏幕上移动?

转载 作者:行者123 更新时间:2023-11-29 07:04:52 28 4
gpt4 key购买 nike

我正在尝试创建的游戏是贪吃蛇,到目前为止我已经弄清楚如何使用 paint(Graphics g) 一点点 JPanel,鼠标监听器现在我正在尝试创建一个矩形,它将在屏幕上移动并使用键绑定(bind)或键监听器,但我不知道我应该怎么做。

到目前为止,这是我的代码,它包含 2 个部分。第一部分称为 snake2,因为如果我不知道自己在做什么,我会用不同的东西制作同一个程序。 Snake 使用 frame,但是 Snake2 使用 JPanel(看起来更好……)

    import java.awt.*;

//required for MouseListener
import java.awt.event.*;

//requied for Graohics
import java.applet.*;
import javax.swing.*;

public class Snake2 extends JPanel
{
private Rectangle sampleObject;

public Snake2()
{
addMouseListener(new MouseListener());

}


/* create background */
public void paint (Graphics g)
{
Font angel = new Font("Angelic War", Font.BOLD, 60);
Font ith = new Font("Ithornît", Font.BOLD, 78);

setBackground(Color.darkGray);
g.setColor(Color.darkGray);
g.fillRect(0,0,700,850);
g.setColor(Color.gray);
g.fillRect(50,150,600,650);
g.setColor(Color.white);
g.drawRect(50,150,600,650);

g.drawString("Quit",52,116);
g.drawRect(50,100,30,20);

//g.setFont(angel);
//g.drawString("SNAKE",300,70);
g.setFont(ith);
g.drawString("SNAKE",280,90);
}

public void sprite (int x, int y, Graphics g){
g.setColor(Color.white);
g.fillRect(300,200,10,10);
}

public void start (int x, int y, Graphics g){
g.setColor(Color.white);
g.drawString("START GAME",300,425);
}
}


/* Tracks where mouse is clicked */
class MouseListener extends MouseAdapter
{
public void mouseReleased(MouseEvent me)
{
if (me.getX() >= 50 && me.getX() <= 80 && me.getY() >= 100 && me.getY() <= 120)
{
System.exit(0);
}

String str="Mouse Released at "+me.getX()+","+me.getY();
System.out.println(str);
}
}

第二部分是:

    import javax.swing.JFrame;
import java.awt.Dimension;

public class SnakeDisplay
{

public static void main ( String [ ] arguments )
{
JFrame frame = new JFrame ( "Snake" );
Snake2 panel = new Snake2 ( );


frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
frame.add ( panel );
frame.setContentPane ( panel );

frame.setPreferredSize ( new Dimension ( 700, 850 ) );
//frame.setLocationRelativeTo ( null );
frame.setVisible ( true );
frame.pack ( );
}
}

最佳答案

  1. 您应该覆盖 JPanel 中的 paintComponent 并在其中调用 super.paintComponent(g)
  2. 参见 How to Use Key Bindings tutorial .在这种情况下优先使用键绑定(bind)而不是 KeyListener
  3. pack() 然后 setVisible()
  4. 您应该为 x 和 y 位置设置全局变量,以便可以从您的 Action 中访问它们。然后在您的操作中,增加您的 x 或 y 并重新绘制

尝试运行这个例子

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyBidings extends JFrame {
int x = 0;
int y = 0;

DrawPanel drawPanel = new DrawPanel();

public KeyBidings(){
Action rightAction = new AbstractAction(){
public void actionPerformed(ActionEvent e) {
x +=10;
drawPanel.repaint();
}
};

InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = drawPanel.getActionMap();

inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction");
actionMap.put("rightAction", rightAction);

add(drawPanel);

pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}

private class DrawPanel extends JPanel {


protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GRAY);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.GREEN);
g.fillRect(x, y, 50, 50);
}

public Dimension getPreferredSize() {
return new Dimension(400, 200);
}
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
new KeyBidings();
}
});
}
}

enter image description here

这是你更关心的代码

    Action rightAction = new AbstractAction(){
public void actionPerformed(ActionEvent e) {
x +=10;
drawPanel.repaint();
}
};

InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = drawPanel.getActionMap();

inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction");
actionMap.put("rightAction", rightAction);

创建自定义 Action 并将该 Action 添加到 Action 映射,链接到输入映射击键。在操作中,根据方向增加或减少 x 和/或 y,然后重新绘制面板。


参见 Key binding tutorial | Graphics tutorial

关于java - 如何使用键绑定(bind)使矩形在屏幕上移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com