Guten Tag,
ich bin gerade dabei Pong zu programmieren und bin eigentlich auch ziemlich schnell voran gekommen, aber jetzt habe ich ein Problem und finde den Fehler einfach nicht.
Da ich Informatik erst seit ein paar Monaten in der Schule habe, benutzen wir eine vereinfachte Sprache, bzw. die ganzen Befehle sind verdeutscht, also nicht wundern ^^
Das Problem ist das Abprallen an den Banden und den Schlägern. Ich hatte es schon hinbekommen, dass der Ball an den Banden ordentlich abprallt, aber als ich dann die Schläger hinzugefügt habe, funktionierte auch das nicht mehr.
Ich könnte mir vorstellen, dass meine Berechnung der XKoordinate und YKoordinate des Balls falsch ist, das ist aber nur eine Vermutung.
Wenn ich das Programm starte, dann prallt der Ball irgendwo in der Luft ab und manchmal scheint es so, als würde der Ball durchgehend kollidieren und somit auch immer wieder den Winkel erneut verändern.
Ich weiß jetzt nicht genau, welcher Code wichtig ist, ich verschicke auch gerne den ganzen Projektordner.
Es wäre echt super nett von euch, wenn ihr mir helfen könntet
MfG Mesion
Das ist das Hauptprogramm
Delphi-Quellcode:
//Steuerung von Schlaeger1
Schlaeger1.Hochsteuerung:='w';
Schlaeger1.Runtersteuerung:='s';
//Steuerung von Schlaeger2
Schlaeger2.Hochsteuerung:='o';
Schlaeger2.Runtersteuerung:='l';
//Steuerung von derBall
derBall.Reset:='r';
//Festlegung der Startkoordinaten der beiden Schlaeger
Schlaeger1.XKoordinate:=(dasFeld.XKoordinate);
Schlaeger1.YKoordinate:=dasFeld.YKoordinate;
Schlaeger2.XKoordinate:=(dasFeld.Breite+dasFeld.XKoordinate-Schlaeger2.Breite);
Schlaeger2.YKoordinate:=dasFeld.YKoordinate;
//Verschiebungs des Balls an die richtige Position
derBall.XKoordinate:=(dasFeld.XKoordinate+(dasFeld.Breite/2));
derBall.YKoordinate:=(dasFeld.YKoordinate+(dasFeld.Laenge/2));
derBall.meinStift.bewegeBis(derBall.XKoordinate,derBall.YKoordinate);
derBall.ZwischenspeicherX:=derBall.XKoordinate;
derBall.ZwischenspeicherY:=derBall.YKoordinate;
//Verschiebung der beiden Schlaeger an die richtige Position
Schlaeger1.meinStift.bewegeBis(dasFeld.XKoordinate,dasFeld.YKoordinate);
Schlaeger2.meinStift.bewegeBis(Schlaeger2.XKoordinate,dasFeld.YKoordinate);
//Das Spiel startet beim Mausklick
repeat
until dieMaus.istGedrueckt;
//repeat-Schleife zum Wiederholen
repeat
//Zeichnen der Objekte
dasFeld.zeichneDich;
Schlaeger1.zeichneDich;
Schlaeger2.zeichneDich;
//Animation von dem Ball
derBall.loescheDich;
derBall.bewegeDich;
derBall.zeichneDich;
dieUhr.warte(1000);
//Kollisionssystem von Schlaeger1
If ((derBall.XKoordinate) >= (Schlaeger1.XKoordinate))
and ((derBall.YKoordinate) >= (Schlaeger1.YKoordinate))
and ((derBall.YKoordinate) <= (Schlaeger1.YKoordinate+Schlaeger1.Breite)) then
begin
derBall.Winkel:=360-derBall.Winkel-180;
If (derBall.Winkel>=360) then
begin
derBall.Winkel:=derBall.Winkel-360;
end;
If (derBall.Winkel<0) then
begin
derBall.Winkel:=derBall.Winkel+360;
end;
end;
//Kollisionssystem von Schlaeger2
If ((derBall.XKoordinate) >= (Schlaeger2.XKoordinate))
and ((derBall.YKoordinate) >= (Schlaeger2.YKoordinate))
and ((derBall.YKoordinate) <= (Schlaeger2.YKoordinate+Schlaeger2.Laenge)) then
begin
derBall.Winkel:=360-derBall.Winkel+180;
If (derBall.Winkel>=360) then
begin
derBall.Winkel:=derBall.Winkel-360;
end;
If (derBall.Winkel<0) then
begin
derBall.Winkel:=derBall.Winkel+360;
end;
end;
//Kollisionssystem von den Aussenwänden
If ((derBall.YKoordinate) <= (dasFeld.gibYKoordinate)) or
((derBall.gibYKoordinate) >= (dasFeld.gibYKoordinate+dasFeld.Laenge)) then
begin
derBall.Bandenkollision;
end;
//Steuerung der beiden Schläger
If (dieTastatur.wurdeGedrueckt) then
begin
//Hochsteuerung von Schlaeger1
If (dieTastatur.zeichen=Schlaeger1.Hochsteuerung) then
begin
Schlaeger1.loescheDich;
Schlaeger1.bewegeHoch;
If (Schlaeger1.YKoordinate)<(dasFeld.YKoordinate) then
begin
Schlaeger1.YKoordinate:=(dasFeld.YKoordinate+Schlaeger2.zSpeed);
end;
end;
//Runtersteuerung von Schlaeger1
If ((dieTastatur.zeichen)=(Schlaeger1.Runtersteuerung)) then
begin
Schlaeger1.loescheDich;
Schlaeger1.bewegeRunter;
If ((Schlaeger1.YKoordinate)>(dasFeld.YKoordinate+dasFeld.Laenge-Schlaeger1.Laenge)) then
begin
Schlaeger1.YKoordinate:=(dasFeld.YKoordinate+dasFeld.Laenge-Schlaeger1.Laenge-Schlaeger1.zSpeed);
end;
end;
//Hochsteuerung von Schlaeger2
If dieTastatur.zeichen=Schlaeger2.Hochsteuerung then
begin
Schlaeger2.loescheDich;
Schlaeger2.bewegeHoch;
If Schlaeger2.YKoordinate<dasFeld.YKoordinate then
begin
Schlaeger2.YKoordinate:=(dasFeld.YKoordinate+Schlaeger2.zSpeed);
end;
end;
//Runtersteuerung von Schlaeger2
If dieTastatur.zeichen=Schlaeger2.Runtersteuerung then
begin
Schlaeger2.loescheDich;
Schlaeger2.bewegeRunter;
If ((Schlaeger2.YKoordinate)>(dasFeld.YKoordinate+dasFeld.Laenge-Schlaeger1.Laenge)) then
begin
Schlaeger2.YKoordinate:=(dasFeld.YKoordinate+dasFeld.Laenge-Schlaeger1.Laenge-Schlaeger2.zSpeed);
end;
end;
//Resetfunktion von dem Ball
If dieTastatur.zeichen=derBall.reset then
begin
derBall.loescheDich;
derBall.Winkel:=(random(360));
derBall.XKoordinate:=(dasFeld.XKoordinate+(dasFeld.Breite/2));
derBall.YKoordinate:=(dasFeld.YKoordinate+(dasFeld.Laenge/2));
derBall.meinStift.bewegeBis(derBall.XKoordinate,derBall.YKoordinate);
derBall.ZwischenspeicherX:=derBall.XKoordinate;
derBall.ZwischenspeicherY:=derBall.YKoordinate;
end;
//Den Tastaturspeicher ausleeren
dieTastatur.weiter;
end;
until dieMaus.doppelklick;
Und das der Befehl ,,bewegeDich'' von dem Ball:
Delphi-Quellcode:
meinStift.dreheBis(Winkel);
meinStift.bewegeUm(zSpeed);
ZwischenspeicherY:=(((ZwischenspeicherY)+(Winkel-180)/90)*zSpeed);
YKoordinate:=Round(ZwischenspeicherY);
ZwischenspeicherX:=((ZwischenspeicherX)+(zSpeed-(Winkel-180)/180)*zSpeed);
XKoordinate:=Round(ZwischenspeicherX);