# Ball mit schwerkraft hüpfen lassen



## Pikkolini (12. Jan 2010)

Also ich möchte einen Ball hüpfen lassen, der immer langsamer wird bis er wieder auf den Boden fällt und dabei schneller wird. Ich habe auch schon einen Versuch gestartet, ist aber glaub ich nicht wirklich richtig, da ich noch nicht so viel Erfahrung hab. Ich poste den Codeausschnitt mal:

```
public void run() {
		while (true) {
			if (up == true) {
				Main.setY_pos1(-1);
			}
			if (up == false) {
				Main.setY_pos1(1);
			}
			if (Main.getY_pos1() == 100)
			{
				up = false;
				plus = -1;
			}
			if (Main.getY_pos1() == 250) {
				up = true;
				plus = 1;
			}
			if (Main.getSpeed() > 1) {
				Main.setSpeed(plus);
			}
			try {
				Thread.sleep(Main.getSpeed());
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
}
```

Abgesehen davon, das sich der Ball sehr langsam bewegt, schafft er es einmal hoch und wieder runter, auch mit Geschwindigkeitsänderung. Nur wenn er wieder am untersten Punkt ist, wird er aufeinmal sehr schnell und der gnaze Rest spielt verrückt. Vielleicht liegt es daran, dass ich nebenbei einen anderen Thread am laufen habe. Weiß irgendjemand, wo der Fehler ist, oder hat einen anderen Ansatz? it wäre es zum Beispiel viel lieber, wenn alles in einem Thread laufen würde.
Ich danke für alle Antworten!


----------



## Alex1102 (12. Jan 2010)

Hi. Wenn ich dich richtig verstehe möchtest Du eigentlich eine Simulation schreiben. 
Schon mal die Formeln dazu aufgestellt?
In deinem Fall wirkt die Erdanziehungskraft (Fg = m * g) auf denn Ball, falls dieser natürlich nicht in der 
Schwärelösigkeit herum fliegt.

Hier kannst Du die Beschleunigung (a) etnehmen.
Wie kommt man jetzt auf die Positionen vom Ball die man eigentlich haben möchte?

Dazu existieren verschieden Simulations-Verfahren die einfachste ist Euler: 
Einschrittverfahren ? Wikipedia.

Um es besser zu verstehen hier ein sehr gutes Skript von einem Prof. der es hervorragend erklärt: 
http://mitarbeiter.hs-heilbronn.de/~vstahl/simu/skript.pdf

Falls es Dir etwas unklar ist helfe gerne weiter.


----------



## Pikkolini (12. Jan 2010)

Danke, ich werde es mir morgen angucken habe jetzt leider keine Zeit mehr.


----------



## Gast2 (13. Jan 2010)

Ich würde da eher Formeln verwenden die dir abhängig von der vergangenen Zeit die neue Position des Balls berechnen.
Wurfparabel ? Wikipedia
Dann isses auch egal ob der Thread mal ein wenig länger schläft, oder ihm sonst was dazwischen kommt. Du musst dir dann nur merken wann zu zuletzt aktualisiert hast und dementsprechend die neue position berechen. (im Wiki-Artikel die formeln für x= und y=).


----------



## Pikkolini (13. Jan 2010)

EikeB hat gesagt.:


> Ich würde da eher Formeln verwenden die dir abhängig von der vergangenen Zeit die neue Position des Balls berechnen.
> Wurfparabel ? Wikipedia
> Dann isses auch egal ob der Thread mal ein wenig länger schläft, oder ihm sonst was dazwischen kommt. Du musst dir dann nur merken wann zu zuletzt aktualisiert hast und dementsprechend die neue position berechen. (im Wiki-Artikel die formeln für x= und y=).



Das hab ich auch schon mal gemacht nur dann springt der Ball nachher unschön von einem Punkt zum anderen, anstatt "flüssig" zu laufen.


----------



## beginner99 (13. Jan 2010)

Wir hatten sowas mal in einer übung. Hier mal das wichtige:


```
/**
     * Move this ball according to its position and speed and redraw.
     **/
    public void move()
    {
        // remove from canvas at the current position
        erase();
            
        // compute new position
        ySpeed += GRAVITY;
        yPosition += ySpeed;
        xPosition +=2;

        // check if it has hit the ground
        if(yPosition >= (groundPosition - diameter) && ySpeed > 0) {
            yPosition = (int)(groundPosition - diameter);
            ySpeed = -ySpeed + ballDegradation; 
        }

        // draw again at new position
        draw();
    }
```

GRAVITY anspassen, dass es für dich gut aussieht. ballDegradation simuliert balltyp zb gummiball.


----------



## Pikkolini (13. Jan 2010)

beginner99 hat gesagt.:


> ballDegradation simuliert balltyp zb gummiball.



Ich habs mal an mein Programm angepasst und mein Ball erscheint jetzt gar nicht mehr. Der rest des Programmes spielt wieder verrückt. Kannst du mir nochmal näher erläutern was mein bei ballDegradation einsetzen kann/soll? Ich hab mit ein paar Werten rumprobiert, aber das Programm lief ja gar nicht mehr.


----------



## Pikkolini (13. Jan 2010)

Und noch eine Frage nebenbei. Wie ermittelt man in einem JApplet die Breite eines Bildes? Bisher hat es imemr geklappt nur in dem Applet jetzt komm ich irgendwie nicht weiter ???:L

Hier mal der Code wie ich es Versucht habe:


```
Image bild1 = Toolkit.getDefaultToolkit().getImage("ball1.png");
MediaTracker mt = new MediaTracker(this);
mt.addImage(bild1, 0);
try {
    	mt.waitForID(0);
} catch (InterruptedException ex) {
    	ex.printStackTrace();
}
radius1 = bild1.getWidth(rootPane);
System.out.println(radius1);
```

Bei getWidth() habe ich auch mal this und null probiert, aber Java rückt immer -1 raus. Was muss ich bei getWidth machen damit es klappt?


----------



## Pikkolini (14. Jan 2010)

So habe gerade rausgefunden, dass der Bild garnicht lädt, trotz MediaTracker. Eine exception kommt auch nicht. Bei meinen anderen Programmen funktioniert es, die sind aber kein JApplet, kann es daran vielleicht liegen?
Danke für alle Antworten, auch zum anfänglichen Problem.

EDIT: Ok, ich habs mal mit einem absoluten Pfad versucht und es klappt . Jetzt muss ich mal gucken was ich für nen relativen Pfad brauche.
Aber mit dem hüpfen brauch ich noch hilfe.


----------



## OliverKroll (21. Jan 2010)

Hallo Pikkolini, hier ist die Hilfe beim Hüpfen:

```
package pack1;

import java.applet.*;
import java.awt.Graphics;

public class Hauptprogramm
extends Applet
implements Runnable
{
	double x,y;
	double vy;
	double ay;
	
	public void start()
	{
		x=100;
		y=50;
		vy=0;
		ay=0.03;
		
		(new Thread(this)).start();
	}
	
	public void paint(Graphics g)
	{
		g.fillOval((int)x,(int)y,50,50);
	}
	
	public void run()
	{
		while(true)
		{
			vy+=ay;
			y+=vy;
			
			if(y>=150)
			{
				vy=-vy;
			}
			
			repaint();
			
			try
			{
				Thread.sleep(10);
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}
```


----------

