gpt4 book ai didi

java - 尝试在简单的游戏中使用 KeyListener 移动对象

转载 作者:行者123 更新时间:2023-12-02 05:45:28 27 4
gpt4 key购买 nike

我正在尝试创建一个类似于打砖 block 的简单游戏。我能够弄清楚游戏的一些基本概念(移动球、碰撞检测等)

我尝试使用左右箭头键沿 x 方向移动平台对象。在使用一些 println 语句进行测试后, keyPressed 方法的 if 条件起作用,但我无法使用 keyListener 移动平台对象。这与 Platform 类中的 moveLeft 、 moveRight 方法有关,因为我尝试更改 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);
}

}

最佳答案

您的第一个问题是,在您的 moveRight()moveLeft() 方法中,您正在检查并更新 dx 的值,这没有在您的代码中任何有关平台绘制的地方使用。

例如

public void moveRight() {
if (dx + 1 < 20) {
dx += 1; // updating dx, but x is used to paint
}
}
public void moveLeft() {
if (dx - 1 > -20) {
dx -= 1; // updating dx, but x is used to paint
}
}

即使我们更改您的方法以使用 x 而不是 dx,您的第二个问题是增加或减少一个像素不会移动太多。然而,如果你按住左箭头键足够长的时间,平台就会慢慢地爬行。由于第三个问题:边界检查,当您按下正确的数组(首先)时,什么也不会发生。

移动方法中的边界检查基于 x 值 20,但 x 的初始值为 275 .

public void moveRight() {
if (x + 1 < 20) { // can't move very far from the left side of the screen
x += 1;
}
}
public void moveLeft() {
if (x - 1 > -20) { // goes left only a little bit off the screen
x -= 1;
}
}
<小时/>

您需要使用反射(reflect)小程序大小的值。该代码可以工作,但为了节省时间,我只是对边界值进行了硬编码。您实际上应该根据 tennisGame 的大小来计算它们:

public void moveRight() {
if (x < 520) { // enable moving to the edge of the screen
x += 10; // move a little faster
}
}
public void moveLeft() {
if (x > 0) { // enable moving to the edge of the screen
x -= 10; // move a little faster
}
}

关于java - 尝试在简单的游戏中使用 KeyListener 移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110034/

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