Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Informatik in der Schule (http://www.informatikerboard.de/board/board.php?boardid=21)
--- Pong Geschwindigkeit des Balls (http://www.informatikerboard.de/board/thread.php?threadid=3980)


Geschrieben von Robert93 am 07.08.2018 um 10:58:

  Pong Geschwindigkeit des Balls

Meine Frage:
Hallo Leute,
Eigentlich nur ne kurze Frage:

ich habe hier ein Pong Spiel in Java programmiert, dass weitestgehend auch funktioniert. Allerdings wollte ich die Geschwindigkeit des Balls ändern. Diese wird über die BallMovement Klasse eingestellt. Und zwar unten bei der 4:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
package pack1;

import java.util.Timer;
import java.util.TimerTask;

public class BallMovement {
Timer move;
	public BallMovement() {
		move = new Timer();
		move.scheduleAtFixedRate(new TimerTask() {
			
			@Override
			public void run() {
				
				Var.ballx += Var.balldirx;
				Var.bally += Var.balldiry;
				
			}
		}, 0, 4);
	}

}


Ich habe die 4 mit einer Variable v (die in der Variablen Klasse Var steht) ausgetauscht. Also:

code:
1:
2:
3:
4:
5:
6:
7:
8:
	public void run() {
				
				Var.ballx += Var.balldirx;
				Var.bally += Var.balldiry;
				
			}
		}, 0, Var.v);
	}



Wenn ich den int Wert der Variable v in der Variablen Klasse manuell ändere, also: v=4, v=3, v=2 usw. dann ändert sich auch die Geschwindigkeit des Balles wie gewühscht. Nun wollte ich das mit der Kollision verbinden. Sobald eine Kollision mit einem Schläger stattfindet soll der Ball schneller werden (also Var.v--).

Hier die Kollisionsklasse:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
package pack1;

import java.util.Timer;
import java.util.TimerTask;

public class BallKollision {
Timer Kollision;
	public BallKollision() {
		Kollision = new Timer();
		Kollision.scheduleAtFixedRate(new TimerTask() {

			@Override
			public void run() {

				if(Var.bally+50 >= Var.screenheight) {
					Var.balldiry =-1;
				}
				
				if(Var.bally <= 0) {
					Var.balldiry = 1;
				}
				
				if(Var.ballx + 20 >= Var.screenwidth) {
					
					Var.ballx = Var.screenwidth/2 -10;
					Var.bally = Var.screenheight/2 -10;
					
					Var.balldirx = -1;
					Var.playerPoints +=1;
					
				}
				
				if(Var.ballx <= 0 ) {
					Var.ballx = Var.screenwidth/2 -10;
					Var.bally = Var.screenheight/2 -10;
					
					Var.balldirx = 1;
					Var.gegnerPoints +=1;
					
				}
				
				if(Var.ballx < Var.x + 25 && Var.ballx > Var.x && Var.bally-20 <= Var.y + 150 && Var.bally > Var.y) {
                                        Var.v--;
					Var.balldirx = 1;
				}
				
				if(Var.ballx < Var.gegnerx && Var.ballx > Var.gegnerx -20 && Var.bally-20 <= Var.gegnery + 150 && Var.bally > Var.gegnery) {
                                        Var.v--;
					Var.balldirx = -1;
				}
				
				
			}
			
		}, 0, 4);
	}

}


Die Kollsion funktioniert auch ohne Probleme. Und auch wenn ich v in der Konsole ausgebe, wird diese bei jeder Kollision um 1 verringert. Aber die Geschwindigkeit des Balls ändert sich nicht. Und das verstehe ich nicht. Kann mir jemand helfen?

Meine Ideen:
---



Geschrieben von as_string am 07.08.2018 um 15:25:

 

Der Schedule at fixed rate wird ja nur einmal angelegt und zwar mit der Zahl, die Du ihm in den Moment übergibst. Wenn Du einen Variablenwert reinreichst, wird der Zahlenwert kopiert und dem Schedule ist es danach egal, ob sich die Variable nochmal ändert oder nicht.

Gruß
Marco



Geschrieben von Robert93 am 07.08.2018 um 15:56:

 

@Marco: Okay danke, sowas ähnliches habe ich mir schon irgendwie gedacht. Wie löse ich denn dann dieses Problem? Wie würdest du das machen? Danke für deine Hilfe smile



Geschrieben von as_string am 11.08.2018 um 16:56:

 

Ich würde bei einer konstanten Auffrischungsrate bleiben, aber die Werte, die ich zu x und y addiere variieren. Addiere ich in jedem Schritt 2, ist es schneller. Ich würde mir dann auch Fließkomma-Zahlen für die Koordinaten merken und den Wert erst beim Zeichnen runden. Dann kannst Du auch 1,5 oder 0,5 zur Koordinate addieren.

Gruß
Marco


Forensoftware: Burning Board, entwickelt von WoltLab GmbH