当前位置: 首页 > 面试题库 >

如何使用箭头键在屏幕上移动图形?

邓光耀
2023-03-14
问题内容

我正在尝试创建一个简单游戏的开始。我要做的第一件事是将图形导入到我的代码中,然后在屏幕上移动它。我能够在屏幕上画一个球并四处移动,但是当我从文件导入图形时,无法四处移动。我想念什么或做错什么?

import javax.swing.*;
import java.awt.Graphics;
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Game extends JPanel implements ActionListener, KeyListener {

    Timer t = new Timer(5, this);
    double x = 0, y = 0, velX = 0, velY = 0;
    private ImageIcon image;


    public Game(){
        setBackground(Color.WHITE);
        t.start();
        addKeyListener(this);
        this.setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        image = new ImageIcon ("ship.gif");

    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        ImageIcon i = new ImageIcon("C:\\Users\\Bryan\\Pictures\\ship.gif");
        i.paintIcon(this, g, 0, 0);

    }

    public void actionPerformed(ActionEvent e){
        repaint();
        x += velX;
        y += velY;

        if(x<0){
            velX = 0;
            x = 0;
        }

        if(x>750){
            velX = 0;
            x = 750;
        }

        if(y<0);{
            velY = 0;
            y = 0;
        }

        if(y>550){
            velY = 0;
            y = 550;
        }
    }

    public void up(){
        velY = -1.5;
        velX = 0;
    }

    public void down(){
        velY = 1.5;
        velX = 0;
    }

    public void left(){
        velX = -1.5;
        velY = 0;
    }

    public void right(){
        velX = 1.5;
        velY = 0;
    }

    public void keyPressed(KeyEvent e){
        int code = e.getKeyCode();

        if (code == KeyEvent.VK_UP){
            up();
        }

        if (code == KeyEvent.VK_DOWN){
            down();
        }

        if (code == KeyEvent.VK_LEFT){
            left();
        }

        if (code == KeyEvent.VK_RIGHT){
            right();
        }
    }

    public void keyTyped(KeyEvent e){}

    public void keyReleased(KeyEvent e){

//      velX = 0;
//      velY = 0;
        int code = e.getKeyCode();

        if (code == KeyEvent.VK_UP){
            velY = 0;
        }
        if (code == KeyEvent.VK_DOWN){
            velY = 0;
        }
        if (code == KeyEvent.VK_LEFT){
            velX = 0;
        }
        if (code == KeyEvent.VK_RIGHT){
            velX = 0;
        }
    }

}

我的司机是在另一个班级,如下所示:

import java.awt.Color;

import javax.swing.JFrame;

public class GameDriver {

    public static void main(String[] args) {

        JFrame f = new JFrame();
        Game  g = new Game();
        f.add(g);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800,600);

    }
}

问题答案:

这里有两个大问题:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    ImageIcon i = new ImageIcon("C:\\Users\\Bryan\\Pictures\\ship.gif");
    i.paintIcon(this, g, 0, 0);
}
  1. 您正在从中读取文件paintComponent(...)永远 不要这样做,因为这会不必要地减慢绘图速度。可能在构造函数中读取一次图像,然后在图形中使用存储的image变量。该方法的paintComponent应该是绘画 只是 ,它应该是瘦肉,平均和 快速
  2. 您在0处绘制, 始终 在0处绘制。如果要移动某些内容,请在变量位置绘制,然后更改该变量持有的值并重新绘制。

另外:您应该使用按键绑定在Swing应用程序中接受按键,因为这将有助于解决焦点问题。

例如,请在此答案中查看我的代码。



 类似资料:
  • 我现在正在实验JavaFX,教自己如何使用箭头键移动文本和项。我做了一个程序,如果按下箭头键,就可以简单地在舞台上移动文本。 我想使一个圆圈移动我的窗格,而不是文本。要使用箭头键移动我的圆圈,我必须做哪些更改?

  • 对于使用箭头键,首先必须存储它以分析它。这就是为什么我使用来存储它。但是当我尝试运行这段代码时,当我按下向上键时,它显示,当我按下回车键时,这个删除并退出程序,而不打印和

  • 我正在尝试用Windowbuilder创建一个小程序,它只需在JPanel中绘制一个红色矩形(称为car1),并通过按箭头键来移动它;为了做到这一点,我将一个改变x位置的方法与箭头相关联,并调用Repait方法,但矩形根本不移动——因此,我可能会把KeyEvent和/或Repait搞砸。 每次按正确的箭头键移动并刷新面板时,我应该怎么做才能使矩形移动并刷新面板?

  • 我试图使一个简单的平铺移动系统,以便当一个方向被按下一个平移过渡播放,以平稳地移动一个平铺的字符。我遇到的问题是,当我播放动画时,图像的过渡很好,但过渡完成后,图像跳到比预期更远的地方。如果我把代码的一部分拿出来完成,那么动画就会完美地播放,但在那之后按下方向会导致图像从以前的地方移动,而不是当前的位置。 这是代码

  • 问题内容: 我正在尝试通过keyEvent向左移动一个圆圈。到目前为止,圆已在窗口上绘制,但不会向左移动!我觉得问题是我在容器中添加了Window()构造函数。在控制台上没有输出告诉我它正在工作。因此,我认为它甚至不会到达KeyEvent类。这是我的代码: 问题答案: 实际上,这是您要添加到的内容,但重点是,因此,当您键入内容时,该内容将转到与类无关的内容。因此,为了克服它,你只需要调用的类的对象

  • 问题内容: 我在JScrollPane中有一个JTextArea组件,并且文本区域不可编辑。我想使用向上和向下箭头键滚动文本区域(即,按箭头键将文本区域滚动一行)。任何想法如何实现这一目标? 问题答案: 是的,键绑定是必经之路,但是您不一定总是需要创建自己的动作。Swing组件带有您经常可以重用的默认操作。 有关这些操作的完整列表,请参见键绑定。 现在您知道了动作名称,您可以将其绑定到keyStr