使用 Java Applet 使用箭头键移动球

Posted

技术标签:

【中文标题】使用 Java Applet 使用箭头键移动球【英文标题】:Moving a ball with arrow keys using Java Applet 【发布时间】:2018-10-11 09:10:21 【问题描述】:

我正在学习 Java 语言并尝试制作一个简单的迷宫游戏。我可以在屏幕上绘制一个球和对象,但我不能使用箭头键移动球。这是我的代码:

 import java.applet.*;
 import java.awt.*;
 import java.awt.event.KeyEvent;
 import javax.swing.*;
 import java.awt.event.*;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;


public class game extends Applet implements ActionListener, KeyListener 
/**
 * 
 */
private static final long serialVersionUID = 1L;

double x = 0, y = 0;

static int MoveX = 210; 
static int MoveY = 800; 

 public void up()
        MoveY = -2;
        MoveX = 0;
    

    public void down()
        MoveY = 2;
        MoveX = 0;
    

    public void left()
       MoveX = -2;
        MoveY = 0;
    

    public void right()
        MoveX = 2;
        MoveY = 0;
    



public void paint(Graphics g)
    //g.drawLine(200+10,150-10, 200+190, 150-10);
    //g.drawLine(200+30,200-30, 200+190, 200-30);
    g.setColor(Color.BLUE);


    g.fillRect(200+10, 150-10, 200+40, 150-10);
    g.fillRect(300+40, 150-10, 300+70, 150-10);


    g.fillRect(200+10, 200-10, 200+10, 200-10);
    g.fillRect(200+10, 230-10, 200+10, 230-10);
    g.fillRect(200+10, 260-10, 200+10, 260-10);
    g.fillRect(200+10, 290-10, 200+10, 290-10);
    g.fillRect(200+10, 320-10, 200+10, 320-10);
    g.fillRect(200+10, 350-10, 200+10, 350-10);
    g.fillRect(200+10, 380-10, 200+10, 380-10);




    g.fillRect(600+300, 90-10, 100+100, 150-10);
    g.fillRect(600+300, 150-10, 100+100, 210-10);
    g.fillRect(600+300, 210-10, 100+100, 270-10);
    g.fillRect(600+300, 270-10, 100+100, 330-10);


    g.fillRect(600+100,400, 200, 180);
    g.fillRect(600+30,400, 200, 180);


    g.fillRect(1000+300, 90-10, 100+100, 150-10);
    g.fillRect(1000+300, 150-10, 100+100, 210-10);
    g.fillRect(1000+300, 210-10, 100+100, 270-10);
    g.fillRect(1000+300, 270-10, 100+100, 330-10);
    g.fillRect(1000+300, 330-10, 100+100, 390-10);
    g.fillRect(1000+300, 390-10, 100+100, 350-10);

    g.setColor(Color.RED); 
    int size =90;
    g.fillOval(MoveX, MoveY, size, size); 







public void keyPressed(KeyEvent e) 
    // TODO Auto-generated method stub
     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 keyReleased(KeyEvent e) 
    // TODO Auto-generated method stub

    int code = e.getKeyCode();

    if (code == KeyEvent.VK_UP)
        MoveY = 0;
    
    if (code == KeyEvent.VK_DOWN)
        MoveY = 0;
    
    if (code == KeyEvent.VK_LEFT)
        MoveX = 0;
    
    if (code == KeyEvent.VK_RIGHT)
        MoveX = 0;
    


public void keyTyped(KeyEvent e) 
    // TODO Auto-generated method stub


public void actionPerformed(ActionEvent e) 
    // TODO Auto-generated method stub
     repaint();
        x += MoveX;
        y += MoveY;

        if(x<0)
            MoveX = 0;
            x = 0;
        

        if(x>750)
            MoveX = 0;
            x = 750;
        

        if(y<0);
            MoveY = 0;
            y = 0;
        

        if(y>550)
            MoveY = 0;
            y = 550;
        
   


  

Applet 成功启动并绘制了对象。我按了方向键,但球没有动。如何触发 KeyListener 方法?

非常感谢!

【问题讨论】:

1) 为什么要编写小程序?如果是老师指定的,请参考Why CS teachers should stop teaching Java applets。 2) 见Java Plugin support deprecated 和Moving to a Plugin-Free Web。 3) 为什么使用 AWT? .. .. 请参阅 this answer 以了解放弃 AWT 组件以支持 Swing 的许多充分理由。 @AndrewThompson 这是我的作业。我是一名计算机工程专业的学生。顺便说一句,我会把文章的链接发给我的教授:) 【参考方案1】:

您需要在您的 Applet 实例上设置密钥侦听器:

public void init() 
    addKeyListener(this);

但什么都不会发生,因为您没有重新绘制 Applet。用户按键后,您需要重新绘制:

repaint();

你的up()down()等函数的逻辑也不对。当您调用up() 函数时,球的位置将设置为0,-2,当您调用down() 函数时,球的位置将设置为0,2。您应该调整现有的球位置,而不是将其设置为固定坐标。

【讨论】:

请注意,Applet(默认情况下)不可聚焦。即使它制成焦点,它也不一定具有输入焦点。两者都是小程序接收关键事件所必需的。因此,此答案本身不会解决报告的问题。【参考方案2】:

我已经解决了这个问题。以下是代码链接:

Mini maze game

【讨论】:

以上是关于使用 Java Applet 使用箭头键移动球的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中使用箭头键移动一些形状 - 它缩小而不是移动

QwtPicker:通过箭头键禁用光标移动

如何配置 QTreeView 以在使用箭头键移动时保留多项选择

使用箭头键以连续形式在记录中移动

无法使用箭头键在诅咒中移动光标 (C)

vi/vim使用总结