Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 21.10.12 19: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 :zustimm: und langweilen sich extrem. :lol: 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". :oops:
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 :dance2:
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 10:11, insgesamt 2-mal bearbeitet

Für diesen Beitrag haben gedankt: Anika, kolibri95
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 21.10.12 21: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 09:08, insgesamt 1-mal bearbeitet
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 21.10.12 21:21 
Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Mo 22.10.12 22: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 23.10.12 08:57 
Hallo Rushifell,
user profile iconrushifell hat folgendes geschrieben Zum zitierten Posting springen:
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 09:13, insgesamt 1-mal bearbeitet
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Mi 31.10.12 17:28 
Hey sorry,

habe den Thread nicht mehr verfolgt und Deinen Beitrag erst jetzt gesehen :oops:

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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Tfdigger.FormCreate(Sender: TObject);
var i:integer;
begin
//Folgende Zeilen rausnehmen
//    x5.shortcut:=shortcut(VK_LEFT,[]);
//    x7.shortcut:=shortcut(VK_RIGHT,[]);
//    x6.shortcut:=shortcut(VK_UP,[]);
//    x3.shortcut:=shortcut(VK_DOWN,[]);
...


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...
ausblenden 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.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if Hi(getasynckeystate(vk_left))=$80 then test(-1,0,sender);
//Prüft, ob die Taste zum Zeitpunkt der Abfrage gedrückt ist

if Lo(getasynckeystate(vk_left))=$01 then test(-1,0,sender);
//Prüft, ob die Taste nach der letzten Aufruf von GetAsyncKeyState gedrückt wurde


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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 02.11.12 20: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