使用 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 中使用箭头键移动一些形状 - 它缩小而不是移动