几次反弹后球停止移动

时间:2016-02-02 12:58:34

标签: java applet physics game-physics

好的,所以我一直试图让这个球自然反弹几个星期,现在看起来似乎并不合适。该程序应允许用户输入一定量的重力,然后根据该量使球反弹。它适用于前几次反弹,但停球是问题所在。我必须故意将其运动设置为0,否则它将无限地反弹到位但不会在x轴上移动。这个问题只发生在重力设置为15,其他数量和事情真的变坏的时候。球会自然弹跳,但永远在x轴上滚动。我从来没有上过物理课,所以问题可能出在物理代码中。有人知道问题在哪里吗?

这是代码我的代码 -

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;

import javax.swing.JOptionPane;

//key stuff
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;


public class StartingPoint extends Applet implements Runnable{

//key press
private static boolean wPressed = false;
public static boolean isWPressed() {
    synchronized (StartingPoint.class) {
        return wPressed;
    }
}
//for position of circle
int x = 0;
int y= 0;

//for position change
double dx = 2;
double dy = 2;

//for circle size
int rad = 11;

//image for update()
private Image i;
private Graphics gTwo;

//Physics
double grav = 15;
double engloss= .65;
double tc = .2;
double friction = .9;



@Override
public void init() {
    // sets window size
    setSize(800,600);


}

@Override
public void start() {
    //"this" refers to the implemented run method
    Thread threadOne = new Thread(this);
    //this goes to run()
    threadOne.start();

}

@Override
public void run() {

    String input = JOptionPane.showInputDialog( "How much gravity?" );
    grav=  Double.parseDouble(input);
    // sets frame rate
    while (true){
        //makes sure it doesn't go off screen x wise
        //right side
        if (x + dx > this.getWidth() - rad -1){
            x= this.getWidth() -rad -1; //blocks it from moving past boundary
            dx = -dx; //Reveres it 
        }
        //left side
        else if (x + dx < 1 + rad){
            x= 1+rad; //ball bounces from the center so it adjusts for this by adding one and rad to pad out the radius of the ball plus one pixel.
            dx = -dx; //Inverters its movement so it will bounce
        }
        //makes the ball move
        else{
            x += dx; // if its not hitting anything it keeps adding dx to x so it will move. 


        }



        //friction
        if(y == this.getHeight()-rad -1){
            dx *= friction; //every time the ball hits the bottom dx is decreased by 10% by multiplying by .9
            //Keeps it from micro bouncing for ever
            if (Math.abs(dy) < 4){ // if the speed of y (dy) is less than .4 it is set to 0

                dy= 0;

            }

            /**if (Math.abs(dx) < .00000000000000000001){ // if the speed of x (dx) is less than .00000000000000000001 it is set to 0, this value doesn't seem to matter
                dx = 0;


            }**/
        }


        //makes sure it doesn't go off screen y wise
        //down
        if (y > this.getHeight() - rad -0){ // TODO Check how getHieght is measured.
            y= this.getHeight() -rad -0;
            //makes ball loose speed.
            dy *= engloss;
            dy = -dy;

        }
        else {
            //velocity
            // tc makes grav smaller. Total of which is added to dy. To increase velocity as the ball goes down.
            dy += grav *tc;
            //gravity
            //new dy is decreased by tc + .5 multiplied by gravity and tc squared. This makes the ball bounce lower every time based on its speed
            y += dy*tc + .5*grav*tc*tc;
        }


        //frame rate
        repaint();
        try {
            Thread.sleep(17);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //end frame rate

}

@Override
public void stop() {

}

@Override
public void destroy() {

}

@Override
public void update(Graphics g) {
    //keeps it from flickering... don't know how though
    if(i == null){
        i = createImage(this.getSize().width, this.getSize().height);
        gTwo = i.getGraphics();
    }
    gTwo.setColor(getBackground());
    gTwo.fillRect(0, 0, this.getSize().width, this.getSize().height);

    gTwo.setColor(getForeground());
    paint(gTwo);

    g.drawImage(i, 0, 0, this);

    //do some thing with setDoubleBuffered


}

@Override
public void paint(Graphics g) {
    g.setColor(Color.BLUE);
    g.fillOval(x-rad, y-rad, rad*2, rad*2);
}




}

0 个答案:

没有答案