【发布时间】:2014-07-29 09:19:41
【问题描述】:
我正在尝试创建一个类似于打砖块的简单游戏。我能够弄清楚游戏的一些基本概念(移动球,碰撞检测等)
我正在尝试使用左右箭头键在 x 方向上移动平台对象。在使用一些 println 语句进行测试后,keyPressed 方法的 if 条件有效,但我无法使用 keyListener 移动平台对象。 Is 与 Platform 类中的 moveLeft 、 moveRight 方法有关,因为我尝试 d 来更改 dx 的值,所以我可能会看到平台中的一些运动。
这里有 3 个类。
import java.applet.*;
import java.awt.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class tennisGame extends Applet implements Runnable, KeyListener{
Ball b;
Platform p;
public void init() {
setSize(640, 480);
addKeyListener(this);
}
public void start () {
b= new Ball();
p= new Platform();
Thread thread = new Thread (this);
thread.start ();
}
public void paint(Graphics g) {
b.paint(g);
p.paint(g);
}
public void run(){
while (true){
b.update(this);
p.update(this,b);
repaint();
try {
Thread.sleep(20);
}
catch (InterruptedException e){
//e.printStackTrace();
}
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == e.VK_RIGHT){
System.out.println("Pressed RIGHT");
p.moveRight();
}
if(e.getKeyCode() == e.VK_LEFT){
System.out.println("Pressed LEFT");
p.moveLeft();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
import java.awt.*;
public class Ball{
private int x=0;
private int y=0;
private double dx=10;
private double dy=10;
private int width=20;
private int height=20;
private int radius=10;
public Ball() {
}
public void update(tennisGame tg){
if ( x + dx > tg.getWidth()-radius-1){
x = tg.getWidth()-radius-1;
dx= -dx;
}
else if ( x + dx < 0 + radius ){
x= 0 + radius;
dx= -dx;
}
else{
x+=dx;
}
if ( y + dy> tg.getHeight()-radius-1){
y = tg.getHeight()-radius-1;
dy= -dy;
}
else if ( y + dy < 0 + radius ){
y= 0 + radius;
dy= -dy;
}
else{
y+=dy;
}
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public double getDx() {
return dx;
}
public void setDx(int dx) {
this.dx = dx;
}
public void setDy(double dy) {
this.dy = dy;
}
public double getDy() {
return dy;
}
public int getRadius() {
return radius;
}
public void paint(Graphics g) {
g.setColor(new Color(0,0,250,250));
g.fillOval(x-radius,y-radius,width, height);
}
}
import java.awt.Color;
import java.awt.Graphics;
public class Platform {
private int x=275;
private int y=400;
int dx=0;
private int width=120;
private int height=20;
public void update(tennisGame tg,Ball b) {
checkForCollosion(b);
}
private void checkForCollosion(Ball b) {
int ballX= b.getX();
int ballY= b.getY();
int radius= b.getRadius();
if (ballY + radius > y && ballY + radius < y + height){
if (ballX > x && ballX < x + width){
double newDy= b.getDy()* -1 ;
b.setDy(newDy);
}
}
}
public void moveRight() {
if ( dx + 1 < 20){
dx+=1;
}
}
public void moveLeft() {
if ( dx -1 > -20){
dx-=1;
}
}
public void paint(Graphics g){
g.setColor(Color.red);
g.fillRect(x , y, width, height);
}
}
【问题讨论】:
-
那么,您的关键听众有什么问题?它在做什么?它应该做什么?只是转储你的代码并说“我被卡住了,为我写它”不会给你一个有用的答案。
-
我有另一段左右的信息描述了我的问题,哈哈,可能会意外删除它。但我正在尝试使用左右箭头键在 x 方向上移动平台,但对象不会移动。
-
您应该编辑您的问题以重新添加该段落。
-
已添加!提前致谢
标签: java applet awt keylistener