Autor |
Beitrag |
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 21.10.12 18:37
Hallo,
irgendwie habe ich im Moment eine "kreative" Phase, bei der ich fremde Programme/Ideen noch einmal selbst erstellen/umsetzen möchte.
Es sind Herbstferien und da haben Lehrer ja alle frei und langweilen sich extrem. Also wird programmiert!
Meine Version von Digger kommt an Gausis Variante www.entwickler-ecke....t=digger&start=0 nicht heran, dafür gibt's aber den Quelltext dazu, d.h. jeder kann selbst kreativ werden, indem er das Programm seinen Wünschen anpasst, evtl. neue Spielstufen einbaut.
Digger war Ende der 80er Jahre mein Lieblings-DOS-Spiel, das ich bis zum Erbr... gespielt habe. Da das Programm unter Vista nicht mehr läuft, habe ich es selbst versucht und aus der mir bekannten Version auch Spielstufen und Figuren "geklaut".
Gesteuert wird die Figur mit den Pfeiltasten. Ziel ist es, so lange Diamanten zu sammeln bis der Ausgang blinkt. Dabei kann man aber leider erschlagen werden (herunterfallende Steine oder Diamanten) oder bekommt mit Monstern Probleme. Wie man den Bösewichten entgeht, Mauern sprengt usw. ergibt sich im Spiel durch Versuch und Irrtum.
"Zurücksetzen" der Spielstufe oder Neustart geht über den Menüpunkt oder mit der ENTER-Taste.
Viel Spaß beim Spielen
Mathematiker
Rev 1: 3 neue Spielstufen. Außerden kann über einen Menüpunkt oder F11 jede Stufe zyklisch angewählt werden.
Einloggen, um Attachments anzusehen!
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am Mo 31.12.12 09:11, insgesamt 2-mal bearbeitet
Für diesen Beitrag haben gedankt: Anika, kolibri95
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: So 21.10.12 20:10
Auf dem KC 85/x und/oder KC 87?
Ich kann mich noch an Pursuit und den "Goff" erinnern.
Ergänzung: PacMan stammt ja auch aus dieser Zeit....war aber für DOS.
Zuletzt bearbeitet von Delphi-Laie am Mo 22.10.12 08:08, insgesamt 1-mal bearbeitet
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 21.10.12 20:21
Hallo Delphi-Laie,
Delphi-Laie hat folgendes geschrieben : | Auf dem KC 85/x und/oder KC 87? |
Die Version, die ich zuerst (1987?) gespielt hatte, lief auf dem KC 85/3. Harald Winkler, ein Stralsunder, hatte diese Version geschrieben. Später wurde es von ihm(?) noch für SCP- und DOS-Rechner umgeschrieben.
Wie gesagt, leider läuft das Programm nur bis Windows XP und dort auch nur schlecht.
Unter www.kc85emu.de/neues/Neuigkeiten.htm kann man angeblich einen Emulator für das Original laden. Funktioniert aber bei mir auch nicht.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: Delphi-Laie
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mo 22.10.12 21:59
Gefällt mir optisch sehr gut, nur die Steuerung würde ich anders umsetzten. Hab mir Deinen Quellcode nicht angeschaut. Ich hatte mal vor nicht allzulanger Zeit ein ähnliches Spiel mit Canvas umgesetzt. Für die Steuerung habe ich einen Timer und die direkte Tastatur-Abfrage genutzt, ich glaube, Keyboardstate, wenn ich mich richtig erinnere, ansonsten GetAsyncKeystate.
Viele Grüße
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 23.10.12 07:57
Hallo Rushifell,
rushifell hat folgendes geschrieben : | Gefällt mir optisch sehr gut, nur die Steuerung würde ich anders umsetzten. |
Danke für das Lob.
Könntest Du bitte genauer sagen, was an der Steuerung stört. Ist die Figur zu langsam oder sollten es andere Tasten sein?
Beste Grüße
Mathematiker
Nachtrag: Ich habe über getasynckeystate und einen Timer die Tastaturabfrage getestet. Dabei wird die Figur so schnell, dass ich sie kaum noch in der Gewalt habe. Insbesondere abwärts werde ich jetzt ziemlich oft "erschlagen".
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am Sa 03.11.12 08:13, insgesamt 1-mal bearbeitet
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mi 31.10.12 16:28
Hey sorry,
habe den Thread nicht mehr verfolgt und Deinen Beitrag erst jetzt gesehen
Das Problem ist, dass ich die Taste erst länger halten muss, bevor sich die Figur richtig in Bewegung setzt. Das ist wie bei der Texteingabe. Den gleichen Effekt erzielt man übrigens, wenn man das OnKeyDown-Event des Formulars zur Tastenabfrage nutzt. Manchmal ist das ja gewünscht, für ein Spiel finde ich das jedoch unpraktisch.
Du hast vergessen, in Deinem Quelltext folgende Zeilen rauszunehmen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure Tfdigger.FormCreate(Sender: TObject); var i:integer; begin ... |
Außerdem brauchst Du keinen zweiten Timer, das führt nur zu den von Dir beschriebenen Problemen. Setze Deine Tastaturabfrage mit GetAsyncKeyState einfach an den Anfang des schon vorhandenen Timers (Timer1). Jetzt kannst Du über das Timer-Intervall einfach die Spielgeschwindigkeit einstellen. Für mich ist ein Intervall von 100 ganz gut.
Außerdem würde ich bei der Tastaturabfrage mit GetAsyncKeyState statt...
Delphi-Quelltext 1:
| if (getasynckeystate(vk_left))<>0 then test(-1,0,sender); |
... nur das "most significant bit" prüfen (mir fällt im Moment nicht die Bezeichnung auf deutsch ein). Das Problem beim "least significant bit" ist, dass es auch noch gesetzt sein kann, wenn die Taste nicht mehr gedrückt wird. Die Folge wird sein, dass Deine Figur ein Feld weiterläuft, auch wenn Du bereits die Taste losgelassen hast. Stelle das Timer-Intervall zum Testen einfach auf 2000, halte eine Richtungstaste gedrückt und lasse die Taste los, sobald sich die Figur nicht bewegt. Sie wird sich ein Feld weiter bewegen.
Zitat: | GetAsyncKeyState function
If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState.
|
Delphi-Quelltext 1: 2: 3: 4: 5:
| if Hi(getasynckeystate(vk_left))=$80 then test(-1,0,sender);
if Lo(getasynckeystate(vk_left))=$01 then test(-1,0,sender); |
Der Nachteil ist nun, dass sich Deine Figur beim leichten Antippen der Richtungstaste nicht immer bewegt. Bei hoher Spielgeschwindigkeit sollte das jedoch kein Problem sein. Wenn Dich das denoch stört, musst Du die Tastaturabfrage doch außerhalb des Timers machen und die Tastendrücke in einer Eventschleife abarbeiten. Oder... folgende Möglichkeit innerhalb des Timers wäre vielleicht auch noch denkbar:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if not(moved) then begin if (getasynckeystate(vk_left))<>0 then begin test(-1,0,sender); moved:=True; end else if (getasynckeystate(vk_right))<>0 then begin test(1,0,sender); moved:=True; end else if (getasynckeystate(vk_up))<>0 then begin test(0,-1,sender); moved:=True; end else if (getasynckeystate(vk_down))<>0 then begin test(0,1,sender); moved:=True; end; end else begin if Hi(getasynckeystate(vk_left))=$80 then test(-1,0,sender) else if Hi(getasynckeystate(vk_right))=$80 then test(1,0,sender) else if Hi(getasynckeystate(vk_up))=$80 then test(0,-1,sender) else if Hi(getasynckeystate(vk_down))=$80 then test(0,1,sender) else moved:=False; end; |
EDIT: Ach ja, wenn Du GetAsyncKeyState nutzt solltest Du vielleicht prüfen, ob Deine Anwendung den Fokus hat oder nicht. Dafür kannst Du einfach die ApplicationEvents Komponente verwenden (ist bei mir unter "Zusätzlich" zu finden). Die Komponente hat die Ereignisse "OnActivate" und "OnDeactivate".
Viele Grüße
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 02.11.12 19:19
Hallo Rushifell,
vielen Dank für die vielen Hinweise.
Ich werde in den nächsten Tagen alles berücksichtigen und dann die korrigierte Programmversion veröffentlichen.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
|