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更新。