Moin,
habe zur Zeit folgendes Problem:
Ich versuche den Klassiker Pong mit Pascal nachzuprogrammieren.
Das Spiel hat bei mir zwei Modi, "klassisch" und "auf Zeit".
Zum Verständnis:
Die beiden Balken und der Ball sind Shapes.
Der "auf Zeit"-Modus ist soweit implementiert. In jenem Modus spielt der Spieler auf Zeit gegen den Gegner-Balken, der immer den Ball abfängt.
Mein Problem liegt nun im "klassisch"-Modus. Da im "auf Zeit"-Modus der Ball
immer im selben Winkel von den Wänden abprallt (und so auch praktisch immer das gleiche Bewegungsmuster hat), wollte ich ihm hier mit einem zufälligen Wert für die horizontale Geschwindigkeit an den Leib rücken.
Jedoch scheint dieser Wert immer gleich 0 zu sein, da der Ball sich nur hoch und runter bewegt.
Ich habe es mit Random() und RandomRange versucht.
Hier der Code der Timer-Prozedur, die die Steuerung des Balles übernimmt:
Delphi-Quellcode:
//Sorgt für die Bewegung des Balls und achtet auf die Spielregeln
procedure TForm1.tmrBewegerTimer(Sender: TObject);
begin
//vZufallLinks := RandomRange(6, 24);
//vZufallRechts := RandomRange(6, 24);
//Falls der Ball steht
if (vBallSteht = True) then
begin
//shpBall.Top := shpBall.Top + 1; //Spielt dem Spieler bei Spielbeginn den Ball zu
vBallAufschlag := True;
vBallSteht := False;
end;
//Falls der Aufschlag kommt; zum Spieler!
if (vBallAufschlag = True) then
begin
vAnfang := Now;
tmrZaehler.Enabled := True;
shpBall.Top := (shpBall.Top + 12);
if (shpBall.Top = shpSP1.Top) then
begin
if (shpBall.Left >= shpSP1.Left) and (shpBall.Left <= (shpSP1.Left + 100)) then
begin
vBallNachOben := True;
vBallAufschlag := False;
vZufall := Random(2);
if (vZufall = 1) then
begin
vBallNachRechts := True;
vBallNachLinks := False;
end
else
begin
vBallNachRechts := False;
vBallNachLinks := True;
end;
end;
end;
end;
//Falls der Ball nach unten fliegen soll
if (vBallNachUnten = True) then
begin
shpBall.Top := (shpBall.Top + 12);
if (shpBall.Top = shpSP1.Top) then
begin
if (shpBall.Left >= shpSP1.Left) and (shpBall.Left <= (shpSP1.Left + 100)) then
begin
vBallNachOben := True;
vBallNachUnten := False;
if (vBallNachLinks = True) then
begin
vBallNachRechts := False;
end
else
begin
vBallNachLinks := False;
vBallNachRechts := True
end;
end;
end;
end;
//Falls der Ball nach oben fliegen soll
if (vBallNachOben = True) then
begin
shpBall.Top := (shpBall.Top - 12);
if (shpBall.Top = shpCPU.Top + 10) then
begin
if (shpBall.Left >= shpCPU.Left) and (shpBall.Left <= (shpCPU.Left + 100)) then
begin
vBallNachOben := False;
vBallNachUnten := True;
if (vBallNachLinks = True) then
begin
vBallNachRechts := False
end
else
begin
vBallNachLinks := False;
vBallNachRechts := True;
end;
end;
end;
end;
//Falls der Ball nach rechts fliegen soll
if (vBallNachRechts = True) then
begin
if (rdbKlassik.Checked = True) then
begin
shpBall.Left := (shpBall.Left + vZufallRechts);
end
else
begin
shpBall.Left := (shpBall.Left + 12);
end;
end;
//Falls der Ball nach links fliegen soll
if (vBallNachLinks = True) then
begin
if (rdbKlassik.Checked = True) then
begin
shpBall.Left := (shpBall.Left - vZufallLinks);
end
else
begin
shpBall.Left := (shpBall.Left - 12);
end;
end;
//Falls der Ball von unten an die rechte Wand stößt
if (shpBall.Left >= 590) and (vBallNachOben = True) then
begin
vZufallLinks := RandomRange(6, 24);
vBallNachRechts := False;
vBallNachLinks := True;
end;
//Falls der Ball von unten an die linke Wand stößt
if (shpBall.Left <= 10) and (vBallNachOben = True) then
begin
vZufallRechts := RandomRange(6, 24);
vBallNachRechts := True;
vBallNachLinks := False;
end;
//Falls der Ball von Oben an die rechte Wand stößt
if (shpBall.Left >= 590) and (vBallNachUnten = True) then
begin
vZufallLinks := RandomRange(6, 24);
vBallNachRechts := False;
vBallNachLinks := True;
end;
//Falls der Ball von Oben an die linke Wand stößt
if (shpBall.Left <= 10) and (vBallNachUnten = True) then
begin
vZufallRechts := RandomRange(6, 24);
vBallNachRechts := True;
vBallNachLinks := False;
end;
//Beendet die Runde, falls der Ball den unteren Rand übertritt!
if (shpBall.Top >= 400) then
begin
vBeginne := False;
vBallNachUnten := False;
vBallNachOben := False;
vBallNachLinks := False;
vBallNachRechts := False;
vBallSteht := False;
vBallAufschlag := False;
tmrBeweger.Enabled := False;
tmrZaehler.Enabled := False;
tmrCPU.Enabled := False;
shpSP1.Left := 250;
shpCPU.Left := 250;
shpBall.Left := 296;
shpBall.Top := 200;
vZeit := lblZeit.Caption;
ShowMessage('Spiel verloren! Deine erreichte Zeit: '+ vZeit +' Sekunden');
beep;
btnSpielen.Enabled := True;
end;
end;
Ich hoffe, dass jemand da eine Idee hat.