大家好我是java编程的新手,我开始爱上制作简单的JPanel或JFrame游戏。但是最近我开始挑战自己写一个更复杂的游戏,叫做#34; Doodle jump"。由于你们大多数人可能已经听说过这个游戏,你们不断跳到下一个平台,如果你摔倒,游戏就会结束。我已经制作了平台,并根据跳线是否下降或跳起来上下移动(如果物体/跳线向上跳跃,平台向下移动,如果物体/跳线下降,则平台向上移动,最后如果跳线一直向下,那么游戏结束时会向你显示一条"你丢失了#34;消息,我也认为如果你点击空格键,对象会跳跃并且#34; A&#34 ;和" D"按钮将对象/跳线向右或向左移动。)。在完成所有工作之后,我需要的是让跳线在落在平台上时停止下降。我不知道如何使它工作,我尝试在互联网上搜索,但结果是无用的。我别无选择,只能在stackoverflow上发布这个问题。
如果你想查看我的代码,那么它就在下面:
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;
}
}
}
如果有人可以帮助我,那就太棒了。谢谢大家!!!
答案 0 :(得分:2)
主要思想是检查2个对象(形状)的交集。
平台没有被移动并且具有固定的Shape - Rectangle(让它命名为platformRect)。跳转对象移动(向下)并且还有一个形状 - 让我们说椭圆(并称之为movingEllipse)。
通过计时器,我们改变movingEllipse的y坐标(椭圆向下移动)。 W必须检测碰撞。
你可以使用Shape class&#39;方法public boolean intersects(Rectangle2D r)
对于新的Ellipse位置,您可以检查它是否与platformRect相交。如果没有继续向下移动(减少Y),如果是(在下面的平台)停止Y更新。