Autor Beitrag
Hendi
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 12.12.03 23:08 
Hi @ all!

Ihr kennt doch sicher diesen uralten Spieleklassiker, oder?? :-)
Ich habe mir in den Kopf gesetzt dieses Spiel nachzuprogrammieren,
bin leider aber ein hoffnugsloser Anfänger in Sachen Delphi.
Ich habe mir vorgestellt, dass ich das Spielfeld einfach durch 4 Panels
begrenze: jew. rechts und links (wenn der Ball berührt => Punkt)
jew oben und unten (Ball prallt ab)

Meine Probleme sind die Folgenden:
-Tastenbelegung für Ereignisse (zB. Panel1.left:= (alt) +1;)
-Die Bewegung des Balles an sich
-die "Abprallwinkel" des Balles.

Wäre echt nett, wenn mir irgendjemand helfen könnte.
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Sa 13.12.03 15:23 
für die Positionsänderungen der Panels solltest du dir mal das OnKeyDown bzw. das OnKeyPress-Eriegnis ansehen...

dann machst du einfach eine Bewegung des Balles in y-Richtung und eine in x-Richtung... anhang derer du dann in einem OnTimer-Ereignis die Position des Balles veränderst...
beim abprallen des Balles veränderst du einfach nur das Vorzeichen des Balles in der jeweiligen Richtung...

das solltest du erstmal ausprobieren und wenn dann wenn Probleme auftauchen wieder nachfragen, außer es ist jetzt schon was unklar ;)
Hendi Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 14.12.03 19:21 
Hallo!

Dankeschön, hat mir allerdings nichts genützt...:-)
Komme mit der Delphi-Hilfe einfach nicht zurecht!
Könnte mir jemand einfach mal den Anfang geben??

MFG
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: So 14.12.03 21:18 
nunja...
weißt du, wie man was in die Ereignisse der Form 1 schreibt??
da suchst du dir dann onkeydown und machst vom Prinzip her folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if key=VK_DOWN then Panel1.top:=panel1.top-1;
if key=VK_UP then Panel1.top:=panel1.top+1;
if key=ord('W')  then Panel2.top:=panel2.top+1;
if key=ord('S') then Panel2.top:=panel2.top-1;


dann machste nen timer auf die Form und im Ontimerereignis veränderst du halt die Position von Panel3 ...
ausblenden Delphi-Quelltext
1:
2:
Panel3.Top:=Panel3.Top+YSpeed;
Panel3.Left:=PAnel3.Left+XSpeed


X,Y SPeed sind z.B. 1 ...

wenn du nun ne Kollision mit dem Schläger oder der Wand hast sagst du jenachdem YSpeed:=-YSpeed;
oder XSpeed:=-XSpeed;
G-man
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 258

Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
BeitragVerfasst: Mo 15.12.03 09:36 
Den Ball kannst du als Bild in ein Image laden und dann dessen Position - wie schon beschrieben - verändern.

_________________
...To err is human, but to really foul things up requires a computer.
Hendi Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 16.12.03 15:59 
Hi!

Ja, danke!
Um auch gleich auf deine Frage einzugehen: Nein, ich weiß nicht, wie man etwas in die Eigenschaft der TForm schreibt. Ich weiß praktisch nicht viel mehr, als sowas wie OnButtonClick, und weß ein bisschen was über die If-Clauseln. Ich wäre dir/euch echt sehr verbunden, wenn du/ihr mir mal eine konkreten Ansatz geben würdet!

Cu
Hedndrik
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Di 16.12.03 16:17 
Hendi hat folgendes geschrieben:
Hi!

Ja, danke!
Um auch gleich auf deine Frage einzugehen: Nein, ich weiß nicht, wie man etwas in die Eigenschaft der TForm schreibt. Ich weiß praktisch nicht viel mehr, als sowas wie OnButtonClick, und weß ein bisschen was über die If-Clauseln. Ich wäre dir/euch echt sehr verbunden, wenn du/ihr mir mal eine konkreten Ansatz geben würdet!

Cu
Hedndrik


nunja, ich will ja nicht meckern, ich war auch mal so, aber das was er dir gegebn hat istbereits ein sehr konkreter ansatz *g*

also um das zu machen
brauchst du 2 variablen (typ integer)
dieses erstellst du in dem "var" abschnitt deiner unit in etwa so:
ausblenden Delphi-Quelltext
1:
2:
xspeed: Integer=1;
yspeed: Integer=1;


dann setzt du einen TTimer(zu finden unter "System") auf dein Formular und clickst ihn doppelt an. Nun bist du im code gelandet, dort gibts du ein

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Image1.left := Image1.Left + xspeed;
Image1.Top := Image1.Top + yspeed;

//Kollisionserkennung

if Image1.Left<0 then xspeed := -xspeed;
if Image1.Top<0 then yspeed := -yspeed;
if Image1.Left>400 then xspeed := -xspeed;
if Image1.Top>400 then yspeed := -yspeed;


Natürlich brauchen wir noch ein TImage (is glaub ich unter "zusätzlich", hab grad kein Delphi zur Hand)
dies wird dann dein Ball. Du platzierst es genauso, wie den timer auf deinem Formular und offnest irgendein bild, das in etwa deinem ball entspricht (statt image könntest du auch ein TShape verwenden)

was allerdings noch fehlt ist die Kollisionserkennung mit den schlägern, diese geht jedoch recht ähnlich zu der anderen

MathiasH

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
[edit="MathiasH"]Ich glaub das lern ich nie mit den Delphi Tags...[/edit]

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche


Zuletzt bearbeitet von MathiasH am Di 16.12.03 16:45, insgesamt 1-mal bearbeitet
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Di 16.12.03 16:37 
und an das OnKeyDown-Ereignis komsmt du so:
Form1 anklicken -> im Objektinspektor auf den Reiter Ereignisse klicken -> eintrag onkeydown suchen und daneben einen Doppelklick machen ;)
Hendi Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 16.12.03 20:19 
Hi!

Okay, der Ball läuft! *g*
Jedoch funktioniert das Onkey-Ereignis noch nicht, denke ich komme
damit aber klar.
Nächste Frage: Wie mache ich das mit den AbprallWinkeln?
Und ein Punktezäl-modul? Gibts sowas oder muss ich das über
ein Edit-feld lösen?

Danke nochmals an alle Beteiligten!!!
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Di 16.12.03 22:34 
das mit dem winkel ist eigentlich relativ simpel, Einfallswinkel= ausfallswinkel
da z.B. xspeed senkrecht auf die rechte wand steht, musst du xspeed einfach negativ machen, hart wird es jedoch wenn man die Kollision an Ecken (z.B. der des Schlägers) realisieren will ich hab sowas mal gebaut, aber das ist ewig her ich muss erst wieder in meinen surcen graben.... bei den ecken ist dann schon ne gehörige Portion vektorrechnung drin, das war damals ein ganz schöner brocken....

Punktezählen würd ich über ne Variable machen, die bei jedem abpraller am Schläger erfhöht wird und in einem Label/edit oder sonst wie ausgegeben wird

zur Kollision mit dem Schläger:
wenn (ball.x > schlägerlinks.x) und (ball.x < schlägerrechts.x) und (ball.y > schläger.y) dann findet die Kollision statt.

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Hendi Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 17.12.03 08:03 
Hi!

Ok, Schläder Funktionieren. Ich habe sie soger in dre Sektoren geteil,
oben, mitte und unten. Oben prallt der Ball schräg nach oben ab, in der
mitte senkrecht und unten prallt er nach unten ab.
Meine jetzigen Probleme sind folgende:
Ich habe die Schlägerbewegung mit hilfe der Tastatur schon steuern können, aber nachdem ich zwei editfelder auf die TForm gesetzt habe ging das nicht mehr? Kriege es auch nicht mehr zu laufe!! Warum?
Das nächste ist, dass ich das Spiel gern für 1-2 Sekunden anhalten würde, wenn der Ball in die rechte oder Linke Bande schlägt.
Ich habe so angesetzt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//Punkterverteilung

If shape1.left<1 then 
   
begin
   shape1.left:=360;
   shape1.top:=280;
   yspeed:=0;
   
 usw
end;


Funktionniert aber nur, dass das Shape an seinen Ausgangspunkt
gesetzt wird, alles andere will nicht...:-(
Danke nochmal für all eure unterstützende Hilfe!!!!!!!!!!

Hendrik

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mi 17.12.03 16:33 
das Problem bei den edits ist dann wahrscheinlich, dass die den Fokus haben und entsprechend die onkeydownereignisse nicht an die Form weitergeleitet werden...
nimm anstattdessen einfach labels...
Gandalfus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 129



BeitragVerfasst: Mi 17.12.03 18:24 
form1.keypreview := true;

_________________
Wennn man feststellt, dass es drei Moeglichkeiten gibt, die einen Vorgang schiefgehen lassen koennen und man diese ausschaltet, entstehen automatisch drei neue Moeglichkeiten.
Hendi Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 17.12.03 20:08 
Hi Gandalfonso!

Was wolltest du mir damit sagen??

MFG
Hendrik
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mi 17.12.03 20:15 
wenn du diesen BEfehl im OnCreate-EReignis deiner Form einfügst, dann klappt es auch zusammen mit den Edit-Feldern...
Hendi Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 18.12.03 07:49 
Hi!

Alles funktionniert!!!! Vielem Dank an alle!!!
Ein einziges letztes Problem: Ich hätte gerne, dass das
Spiel abbricht, wenn einer der Spieler einen Punkt bekommt und
nach 2-3 Sekunden von alleine neu startet. Ich hab das mit nem Timer
probiert, geht nicht. Vielleicht eine Verkettung von Timern???

Danke schonmal!!!
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Do 18.12.03 13:19 
geht schon... stell das Timer.Interval auf 3000
dann sag im Formcreate Timer.enabled:=false;
dann brauchst du noch ne globale boolean-variable -> isrunning:boolean , die du am Anfang auf true setzt und immer beim zeichnen / ändern überprüfst ob die true ist...
dann wenn ein punkt gemacht wird stellst du die auf false und sagst timer.enabled:=true;
im Ontimer-ereignis sollte dann folgendes stehen:
ausblenden Delphi-Quelltext
1:
2:
timer.enabled:=false;
isrunning:=true;