Java actionPerformed 问题
Java actionPerformed questions
大家好我是 java 编程新手,我开始爱上制作简单的 JPanel 或 JFrame 游戏。但最近我开始挑战自己编写一个更复杂的游戏 "Doodle jump"。大多数人可能已经听说过这个游戏,你是一个不断跳到下一个平台的物体,如果你摔倒了,游戏就结束了。我已经制作了平台并根据跳线是否跌落或跳起使其向上或向下移动(如果 object/jumper 跳起来平台向下移动,如果 object/jumper 跌倒则平台向上移动最后,如果跳线一直往下掉,那么游戏结束时会向您显示 "You lost" 消息,我还做到了,如果您单击 space 栏,对象就会跳跃,并且 "A"和 "D" 按钮将 object/jumper 向右或向左移动。)。在完成所有这些工作后,我需要做的就是让跳线在降落在平台上时停止掉落。我不知道如何让它工作,我尝试在互联网上搜索它,但结果毫无用处。我别无选择,只能 post 在 Whosebug 上提出这个问题。
如果你想看一下我的代码,它在下面:
import java.awt.event.*;
import java.awt.*;
import java.util.Scanner;
import javax.swing.*;
public class DoodleJump extends JPanel implements ActionListener,KeyListener{
static JFrame f;
static int width=1200, height=930;
static int DoodleW=500, DoodleH=500;
static int DoodleW1=540, DoodleH1=530;
static int DoodleW2=500, DoodleH2=530;
static int DoodlePlatformWidth=200, DoodlePlatformHeight=400;
static int DoodlePlatformWidth1=400, DoodlePlatformHeight1=530;
static int DoodlePlatformWidth2=900, DoodlePlatformHeight2=874;
static int DoodlePlatformWidth3=345, DoodlePlatformHeight3=643;
static int DoodlePlatformWidth4=711, DoodlePlatformHeight4=957;
static boolean rightjumper,leftjumper;
static boolean jumper;
static boolean gameplay=true;
public void paintComponent (Graphics g){
g.setColor(Color.green);
g.fillRect(DoodlePlatformWidth, DoodlePlatformHeight,200,30);
g.fillRect( DoodlePlatformWidth1, DoodlePlatformHeight1,200,30);
g.fillRect( DoodlePlatformWidth2, DoodlePlatformHeight2,200,30);
g.fillRect( DoodlePlatformWidth3, DoodlePlatformHeight3,200,30);
g.fillRect( DoodlePlatformWidth4, DoodlePlatformHeight4,200,30);
g.setColor(Color.blue);
g.fillRect(DoodleW, DoodleH,50,50);
g.fillRect(DoodleW1, DoodleH1,10,50);
g.fillRect(DoodleW2, DoodleH2,10,50);
if (gameplay==false){
g.setColor(Color.red);
g.setFont(new Font("Rosewood Std Regular", Font.PLAIN, 100));
g.drawString("You Lost",200,110);
f.setBackground(Color.black);
}
}
public static void main(String a[]){
DoodleJump D = new DoodleJump();
f = new JFrame();
D.init();
f.add(D);
f.setSize(width,height);
f.setVisible(true);
f.repaint();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer t=new Timer(10,D);
t.start();
}
public void init (){
this.addKeyListener(this);
setFocusable(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (gameplay==true){
if (jumper==true){
DoodlePlatformHeight=DoodlePlatformHeight+20;
DoodlePlatformHeight1=DoodlePlatformHeight1+20;
DoodlePlatformHeight2=DoodlePlatformHeight2+20;
DoodlePlatformHeight3=DoodlePlatformHeight3+20;
DoodlePlatformHeight4=DoodlePlatformHeight4+20;
}
if (jumper==false){
DoodlePlatformHeight=DoodlePlatformHeight-10;
DoodlePlatformHeight1=DoodlePlatformHeight1-10;
DoodlePlatformHeight2=DoodlePlatformHeight2-10;
DoodlePlatformHeight3=DoodlePlatformHeight3-10;
DoodlePlatformHeight4=DoodlePlatformHeight4-10;
}
if (leftjumper==true){
DoodleW=(DoodleW-15);
DoodleW1=(DoodleW1-15);
DoodleW2=(DoodleW2-15);
}
if (rightjumper==true){
DoodleW=(DoodleW+15);
DoodleW1=(DoodleW1+15);
DoodleW2=(DoodleW2+15);
}
if (DoodlePlatformHeight>height){
DoodlePlatformWidth=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight=0;
}
if (DoodlePlatformHeight1>height){
DoodlePlatformWidth1=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight1=0;
}
if (DoodlePlatformHeight2>height){
DoodlePlatformWidth2=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight2=0;
}
if (DoodlePlatformHeight3>height){
DoodlePlatformWidth3=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight3=0;
}
if (DoodlePlatformHeight4>height){
DoodlePlatformWidth4=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight4=0;
}
if (DoodlePlatformHeight<0&&DoodlePlatformHeight2<0&&DoodlePlatformHeight3<0&&
DoodlePlatformHeight4<0){
gameplay=false;
}
f.repaint();
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode()==KeyEvent.VK_SPACE){
jumper=true;
}
if (e.getKeyCode()==KeyEvent.VK_A){
leftjumper=true;
}
if (e.getKeyCode()==KeyEvent.VK_D){
rightjumper=true;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode()==KeyEvent.VK_SPACE){
jumper=false;
}
if (e.getKeyCode()==KeyEvent.VK_A){
leftjumper=false;
}
if (e.getKeyCode()==KeyEvent.VK_D){
rightjumper=false;
}
}
}
如果有人能帮助我,那就太好了。谢谢大家!!!
主要思想是检查 2 个对象(形状)的交集。
平台没有移动并且有一个固定的形状——矩形(我们将其命名为platformRect)。跳转对象被移动(向下)并且也有一个形状 - 让我们说椭圆(并将其称为 movingEllipse)。
通过Timer我们改变了movingEllipse的y坐标(椭圆向下移动)。 W必须检测碰撞。
您可以使用形状 class' 方法 public boolean intersects(Rectangle2D r)
对于新的 Ellipse 位置,您检查它是否与 platformRect 相交。如果没有继续向下移动(减少Y),如果是(平台下方)停止Y更新。
大家好我是 java 编程新手,我开始爱上制作简单的 JPanel 或 JFrame 游戏。但最近我开始挑战自己编写一个更复杂的游戏 "Doodle jump"。大多数人可能已经听说过这个游戏,你是一个不断跳到下一个平台的物体,如果你摔倒了,游戏就结束了。我已经制作了平台并根据跳线是否跌落或跳起使其向上或向下移动(如果 object/jumper 跳起来平台向下移动,如果 object/jumper 跌倒则平台向上移动最后,如果跳线一直往下掉,那么游戏结束时会向您显示 "You lost" 消息,我还做到了,如果您单击 space 栏,对象就会跳跃,并且 "A"和 "D" 按钮将 object/jumper 向右或向左移动。)。在完成所有这些工作后,我需要做的就是让跳线在降落在平台上时停止掉落。我不知道如何让它工作,我尝试在互联网上搜索它,但结果毫无用处。我别无选择,只能 post 在 Whosebug 上提出这个问题。
如果你想看一下我的代码,它在下面:
import java.awt.event.*;
import java.awt.*;
import java.util.Scanner;
import javax.swing.*;
public class DoodleJump extends JPanel implements ActionListener,KeyListener{
static JFrame f;
static int width=1200, height=930;
static int DoodleW=500, DoodleH=500;
static int DoodleW1=540, DoodleH1=530;
static int DoodleW2=500, DoodleH2=530;
static int DoodlePlatformWidth=200, DoodlePlatformHeight=400;
static int DoodlePlatformWidth1=400, DoodlePlatformHeight1=530;
static int DoodlePlatformWidth2=900, DoodlePlatformHeight2=874;
static int DoodlePlatformWidth3=345, DoodlePlatformHeight3=643;
static int DoodlePlatformWidth4=711, DoodlePlatformHeight4=957;
static boolean rightjumper,leftjumper;
static boolean jumper;
static boolean gameplay=true;
public void paintComponent (Graphics g){
g.setColor(Color.green);
g.fillRect(DoodlePlatformWidth, DoodlePlatformHeight,200,30);
g.fillRect( DoodlePlatformWidth1, DoodlePlatformHeight1,200,30);
g.fillRect( DoodlePlatformWidth2, DoodlePlatformHeight2,200,30);
g.fillRect( DoodlePlatformWidth3, DoodlePlatformHeight3,200,30);
g.fillRect( DoodlePlatformWidth4, DoodlePlatformHeight4,200,30);
g.setColor(Color.blue);
g.fillRect(DoodleW, DoodleH,50,50);
g.fillRect(DoodleW1, DoodleH1,10,50);
g.fillRect(DoodleW2, DoodleH2,10,50);
if (gameplay==false){
g.setColor(Color.red);
g.setFont(new Font("Rosewood Std Regular", Font.PLAIN, 100));
g.drawString("You Lost",200,110);
f.setBackground(Color.black);
}
}
public static void main(String a[]){
DoodleJump D = new DoodleJump();
f = new JFrame();
D.init();
f.add(D);
f.setSize(width,height);
f.setVisible(true);
f.repaint();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer t=new Timer(10,D);
t.start();
}
public void init (){
this.addKeyListener(this);
setFocusable(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (gameplay==true){
if (jumper==true){
DoodlePlatformHeight=DoodlePlatformHeight+20;
DoodlePlatformHeight1=DoodlePlatformHeight1+20;
DoodlePlatformHeight2=DoodlePlatformHeight2+20;
DoodlePlatformHeight3=DoodlePlatformHeight3+20;
DoodlePlatformHeight4=DoodlePlatformHeight4+20;
}
if (jumper==false){
DoodlePlatformHeight=DoodlePlatformHeight-10;
DoodlePlatformHeight1=DoodlePlatformHeight1-10;
DoodlePlatformHeight2=DoodlePlatformHeight2-10;
DoodlePlatformHeight3=DoodlePlatformHeight3-10;
DoodlePlatformHeight4=DoodlePlatformHeight4-10;
}
if (leftjumper==true){
DoodleW=(DoodleW-15);
DoodleW1=(DoodleW1-15);
DoodleW2=(DoodleW2-15);
}
if (rightjumper==true){
DoodleW=(DoodleW+15);
DoodleW1=(DoodleW1+15);
DoodleW2=(DoodleW2+15);
}
if (DoodlePlatformHeight>height){
DoodlePlatformWidth=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight=0;
}
if (DoodlePlatformHeight1>height){
DoodlePlatformWidth1=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight1=0;
}
if (DoodlePlatformHeight2>height){
DoodlePlatformWidth2=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight2=0;
}
if (DoodlePlatformHeight3>height){
DoodlePlatformWidth3=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight3=0;
}
if (DoodlePlatformHeight4>height){
DoodlePlatformWidth4=(int) Math.floor(Math.random()*1201);
DoodlePlatformHeight4=0;
}
if (DoodlePlatformHeight<0&&DoodlePlatformHeight2<0&&DoodlePlatformHeight3<0&&
DoodlePlatformHeight4<0){
gameplay=false;
}
f.repaint();
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode()==KeyEvent.VK_SPACE){
jumper=true;
}
if (e.getKeyCode()==KeyEvent.VK_A){
leftjumper=true;
}
if (e.getKeyCode()==KeyEvent.VK_D){
rightjumper=true;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode()==KeyEvent.VK_SPACE){
jumper=false;
}
if (e.getKeyCode()==KeyEvent.VK_A){
leftjumper=false;
}
if (e.getKeyCode()==KeyEvent.VK_D){
rightjumper=false;
}
}
}
如果有人能帮助我,那就太好了。谢谢大家!!!
主要思想是检查 2 个对象(形状)的交集。
平台没有移动并且有一个固定的形状——矩形(我们将其命名为platformRect)。跳转对象被移动(向下)并且也有一个形状 - 让我们说椭圆(并将其称为 movingEllipse)。
通过Timer我们改变了movingEllipse的y坐标(椭圆向下移动)。 W必须检测碰撞。
您可以使用形状 class' 方法 public boolean intersects(Rectangle2D r)
对于新的 Ellipse 位置,您检查它是否与 platformRect 相交。如果没有继续向下移动(减少Y),如果是(平台下方)停止Y更新。