试着做一个简单的跳跃

时间:2016-08-27 18:07:16

标签: java android

我正在努力学习如何制作没有游戏引擎的2D游戏,无论如何我已经创建了一个背景滚动,现在我的目标是让我的角色跳跃。但问题是每当我启动我的应用程序时,角色会上下旋转,它就会消失在后台。

这是我的角色代码

public class Deer extends GameCharacter {

private Bitmap spritesheet;
private double dya;
private boolean playing;
private long startTime;
private boolean Jump;
private Animate Animation = new Animate();

public Deer(Bitmap res, int w, int h, int numFrames) {

    x = 20;
    y = 400;
    dy = 0;
    height = h;
    width = w;

    Bitmap[] image = new Bitmap[numFrames];
    spritesheet = res;

    for (int i = 0; i < image.length; i++)
    {
        image[i] = Bitmap.createBitmap(spritesheet, i*width, 0, width, height);
    }

    Animation.setFrames(image);
    Animation.setDelay(10);
    startTime = System.nanoTime();

}

public void setJump(boolean b){
    Jump = b;
}

public void update()
{
    long elapsed = (System.nanoTime()-startTime)/1000000;
    if(elapsed>100)
    {
    }
    Animation.update();

    if(Jump){
        dy = (int)(dya+=5.5);

    }
    else{
        dy = (int)(dya+=5.5);
    }

    if(dy>14)dy = 14;
    if(dy>14)dy = -14;

    y += dy*2;
    dy = 0;
}


public void draw(Canvas canvas)
{
    canvas.drawBitmap(Animation.getImage(),x,y,null);
}
public boolean getPlaying(){return playing;}
public void setPlaying(boolean b){playing = b;}
public void resetDYA(){dya = 0;}
}

x - 角色的水平位置 y - 角色的垂直位置 dx - 角色的水平加速度 dy - 角色的垂直加速度

   public boolean onTouchEvent(MotionEvent event) {
      if(event.getAction()==MotionEvent.ACTION_DOWN) {
        if(!deer.getPlaying()) {
            deer.setPlaying(true);
        }
        deer.setJump(true);
        return true;
    }

    return super.onTouchEvent(event);
}

1 个答案:

答案 0 :(得分:0)

我无法确定这是否是唯一的问题,因为您有其他可疑代码,但看起来无论如何都会跳转。

if(Jump){
    dy = (int)(dya+=5.5);
} else {
    dy = (int)(dya+=5.5);
}

如果Jumptrue,则设置垂直加速度。但如果Jumpfalse,您还可以将垂直加速度设置为相同的值。您也不会在代码中显示Jump设置为false的内容。

另一个奇怪的代码是:

if(dy>14)dy = 14;
if(dy>14)dy = -14;

此处,如果您将dy>14设置为14.然后立即检查dy>14。当然,这次是false。但是因为这两个条件是相同的,所以第二个条件永远不会通过,因为前一个条件确保它不会被激活。唯一的另一种选择是他们都失败了。我,你永远无法进入第二个if

<小时/> 除此之外, 我不确定您为什么采用这种方法。您可以简单地依靠具有恒定加速度的物理方程,给出初始速度,检查与地面的碰撞(或至少是原始高度),然后让它运行。例如:

// These are the variables you need.
int x = 200, y0 = 0, y = 0, velocity = 15;
double t = 0.0, gravity = -9.8;

// This is the statement that should run when you update the GUI.
// It is the fundamental equation for motion with constant acceleration.
// The acceleration is the gravitational constant.
y = (int) (y0 + velocity * t + .5 * gravity * t * t);
if (y < 0) {
    y = y0 = 0; 
    //Stop jumping!
    Jump = false; 
} else {
    // Swap the y values.
    y0 = y;
    // Increase the time with the frame rate.
    t += frameRate;
}
// Draw the character using the y value

关于这一点最好的部分是你不必担心何时达到最大高度,因为等式会自动降低你。它看起来更自然,好像机械是真实的。尝试一下。

你可以玩的

一个简单的Swing示例 。请注意,值不同,以处理组件绘制到屏幕的方式。通常情况下,您可以通过转换处理它,但这样做可以完成任务。

public class Main {

    static Timer timer;

    Main() {
        JFrame frame = new JFrame("Hello sample");
        frame.setSize(new Dimension(550, 550));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel panel = new MyPanel();
        frame.add(panel);
        frame.setVisible(true);
        timer = new Timer(5, (e) -> panel.repaint());
        timer.start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Main::new);
    }

    class MyPanel extends JPanel {
        int x = 200, y0 = 300, y = 0, w = 200, h = 200, v = -8;
        double t = 0.0, gravity = 9.8;
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            y = (int) (y0 + v * t + .5 * gravity * t * t);
            if (y > 300) {
                y = y0 = 300;
                // To prevent it from stopping comment the timer.stop() and 
                // uncomment the t = 0.0 statements.
                //t = 0.0;
                timer.stop();
            } else {
                y0 = y;
                t += .025;
            }
            g.drawOval(x, y, w, h);
        }
    }
}