AW: Pac-Man Hilfe
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
es gibt (2 Modi) Verfolgung und Verstreuen! (Noch einen aber den lass ich mal weg) Verfolgung: - Blinky (rot) nimmt als Ziel die Position von Pac-Man. Es wird immer der Punkt mit kürzesten Entfernung verwendet nicht mit dem kürzesten Weg. - Pinky (rosa) nimt als Ziel die Position von Pac-Man + 4 Cells in Pac-Man's Laufrichtung (Außer wenn Pac man nach oben läuft, weil da ein Bug im ursprünglichen Code war) da ist es 4 cells hoch 4 cells links - Inky (hellblau) Nimmt den Vector von Blinky auf Pac-Position (+2 in Laufrichtung und verdoppelt den Vector) als Ziel - Clyde (orange) Läuft auf Pac-Man's Position wenn er mehr als 8 Cells entfernt ist. Sonst in Richtung "seiner" Ecke. Verstreuen - Geister laufen in Ihre Ecken... Die Modi wechseln je nach Level... Level 1: 7s/20s/7s/20s/5s/20s/5s/ ~~ Dann wechseln noch die Geschwindigkeiten je nach Level oder ob im Tunnel. Ach ja und Pac-Man kann schneller um die Ecken laufen als die Geister... Wenn Pac Man eine Punkt frisst, hält er kurz an für 1/60s die Geister können an den 4 gelben Punkten nicht nach oben gehen! usw. Anbei die entsprechenden Grafiken... Mavarik PS.: Hätte man auch alles aus meinen Links fischen können... (Dafür Poste ich die) - |
AW: Pac-Man Hilfe
Sieht nach einer Menge Timer aus? Ich glaub das ist mir ne Spur zu aufwendig.. Trotzdem danke für deine Ausführungen. Eigentlich unfassbar, daß das im großen und ganzen nur der Autor und ein Programmierer bewerkstelligt haben und das auch noch Ende der Siebziger. Respekt!!
|
AW: Pac-Man Hilfe
Zitat:
|
AW: Pac-Man Hilfe
Oder zwei Timer.
* Einer für die Bewegung * und Einer für's Umschalten der Modi Oder alles in einen Timer, mit der kleinsten nötigen Zeiteinheit (kleinster gemeinsamer Teiler) und dann bissl Mathematik (Zähler), um die größeren Zeiteinheiten rauszubekommen. |
AW: Pac-Man Hilfe
Zitat:
Sherlock |
AW: Pac-Man Hilfe
Aus eigener Erfahrung weiß ich, dass sich mehrere Timer gerne mal gegenseitig ins Gehege kommen. Dann lieber nur einen verwenden und ggf. ein wenig mehr rechnen.
|
AW: Pac-Man Hilfe
Beim Programmablauf ist es seltener ein Problem, aber beim Debuggen wird es spassig, außer man debuggt schneller, als die Timer zuschlagen. :stupid:
Der Debugger müsste die Timer anhalten und um die Pausenzeiten verlängern. :cry: |
AW: Pac-Man Hilfe
Zitat:
|
AW: Pac-Man Hilfe
Also das Game ist ausgelegt auf 60 Frames per Sekunden...
Darüber wird alles gesteuert... Habe ich habe im Web einen netten Ansatz gefunden... Falls die 60 Frames nicht erreicht werden, nimmt der eine Wait Array Beispiel: 1,1,1,1,1,1,1,1,1,1 100% 1,0,1,0,1,0,1,0,1,0 50% 1,1,0,1,1,0,1,1,0,1 usw... Bei einer 1 bewegt sich Pac Man oder eben die Geister bei einer 0 nicht... So kann ich im Low Bereich auch die unterschiedlichen Geschwindigkeiten machen... Dann geht das mit einem Timer... |
AW: Pac-Man Hilfe
Und was ist bei 73,4%?
Man nimmt die Zeit bis vorm letzten Zeichnen und weiß, wie weit man sich jetzt bewegen muß. :angle: |
AW: Pac-Man Hilfe
Zitat:
|
AW: Pac-Man Hilfe
Das kann man ja ändern. :stupid:
* Intern mit Teilpixelrechnen * auf ganze Pixel gerundet anzeigen * oder intern mit ganzen Pixeln rechnen, aber über längere Zeit die Geschwindigkeit berechnen/verrechnen * ... * Zwischenschritte interpolieren |
AW: Pac-Man Hilfe
Zitat:
Zitat:
|
AW: Pac-Man Hilfe
Diese Aussage bezog sich nur auf mehrere Timer. (noch ohne die Betrachtung einer Interpolation)
* Timer1 = 100 ms * Timer2 = 500 ms Timer1 müsste also 5 Mal so oft auslösen, wie Timer2, aber wenn man jetzt mehr als 100 ms benötigt, zum Debuggen einer Methode (bis zum nächsten ProcessMessage), dann verschiebt sich das natürlich. Oder besonders schön wird es, wenn man ProcessMessages im Code drin hat. * Timer-Event benöigt 10 ms, das Timer-Intervall ist 100 ms Das geht normaler Weise, wenn man jetzt debuggt und mehr als 100 ms bis zum ProcessMessages braucht, dann debuggt man sich in eine Endlosschleife, weil in dem ProcessMessages der Timer erneut ausgelöst wird, bevor das aktuelle Event fertig geworden ist. |
AW: Pac-Man Hilfe
Dann wäre es aber Aktion2 nur bei jedem 5. Durchlauf des Timers auszuführen
|
AW: Pac-Man Hilfe
Siehst'e ... also ist doch ein Timer besser als zwei/mehr Timer.
Somit haben wir den Beweis dafür. :stupid: |
AW: Pac-Man Hilfe
Pac-Man zu programmieren ist sowas von 1980. Sparrt euch die Arbeit, denn bald kommt der Pac-Man Film.
Hier der Trailer: https://www.youtube.com/watch?v=MAT0TpYMswI |
AW: Pac-Man Hilfe
Schweinerei. PacMan ist nicht böse. :shock: :-D
|
AW: Pac-Man Hilfe
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
unit uTimerEx;
interface uses Math, Classes, ExtCtrls; type TOnTimerExTimer = procedure(Timer: integer) of object; TTimerEx = class private FIntervall, FEnabled, FTickCount, FTimerTickCount: TList; FTimer: TTimer; FActive, FStoreActive: boolean; FOnTimerExTimer: TOnTimerExTimer; function GetCount: integer; function GetEnabled(Index: integer): boolean; function GetIntervall(Index: integer): integer; procedure SetActive(const Value: boolean); procedure SetEnabled(Index: integer; const Value: boolean); procedure SetIntervall(Index: integer; const Value: integer); function GetTickCount(Index: integer): integer; function GetTimerTickCount(Index: integer): integer; procedure SetTickCount(Index: integer; const Value: integer); procedure SetTimerTickCount(Index: integer; const Value: integer); property TickCount[Index: integer]: integer read GetTickCount write SetTickCount; property TimerTickCount[Index: integer]: integer read GetTimerTickCount write SetTimerTickCount; function GreatestCommonDivisor(A, B: integer): integer; function TimerIntervall: integer; procedure BeginUpdate; procedure EndUpdate; procedure TimerExTimer(Sender: TObject); public procedure Add(Intervall: integer = 1000; Enabled: boolean = true); procedure Delete(Index: integer); property Intervall[Index: integer]: integer read GetIntervall write SetIntervall; property Enabled[Index: integer]: boolean read GetEnabled write SetEnabled; property Active: boolean read FActive write SetActive; property Count: integer read GetCount; property OnTimerExTimer: TOnTimerExTimer read FOnTimerExTimer write FOnTimerExTimer; constructor Create; destructor Destroy; override; end; implementation { TTimerEx } constructor TTimerEx.Create; begin FTimer := TTimer.Create(Nil); FTimer.Enabled := false; FTimer.OnTimer := TimerExTimer; FIntervall := TList.Create; FEnabled := TList.Create; FTickCount := TList.Create; FTimerTickCount := TList.Create; end; destructor TTimerEx.Destroy; begin FActive := false; FTimer.Free; FIntervall.Free; FEnabled.Free; FTickCount.Free; FTimerTickCount.Free; inherited; end; procedure TTimerEx.Add(Intervall: integer = 1000; Enabled: boolean = true); begin BeginUpdate; FIntervall.Add(Pointer(Intervall)); if Enabled then FEnabled.Add(Pointer(1)) else FEnabled.Add(Pointer(0)); FTickCount.Add(Pointer(0)); FTimerTickCount.Add(Pointer(0)); EndUpdate; end; procedure TTimerEx.Delete(Index: integer); begin BeginUpdate; FIntervall.Delete(Index); FEnabled.Delete(Index); FTickCount.Delete(Index); FTimerTickCount.Delete(Index); EndUpdate; end; function TTimerEx.GetCount: integer; begin Result := FIntervall.Count; end; function TTimerEx.GetEnabled(Index: integer): boolean; begin if Integer(FEnabled[Index]) = 1 then Result := true else Result := false; end; function TTimerEx.GetIntervall(Index: integer): integer; begin Result := Integer(FIntervall[Index]); end; function TTimerEx.GetTickCount(Index: integer): integer; begin Result := Integer(FTickCount[Index]); end; function TTimerEx.GetTimerTickCount(Index: integer): integer; begin Result := Integer(FTimerTickCount[Index]); end; procedure TTimerEx.SetActive(const Value: boolean); begin if Value then begin BeginUpdate; EndUpdate; end; FActive := Value; FTimer.Enabled := Value; end; procedure TTimerEx.SetEnabled(Index: integer; const Value: boolean); begin if Value then FEnabled[Index] := Pointer(1) else FEnabled[Index] := Pointer(0); end; procedure TTimerEx.SetIntervall(Index: integer; const Value: integer); begin BeginUpdate; FIntervall[Index] := Pointer(Value); EndUpdate; end; procedure TTimerEx.SetTickCount(Index: integer; const Value: integer); begin FTickCount[Index] := Pointer(Value); end; procedure TTimerEx.SetTimerTickCount(Index: integer; const Value: integer); begin FTimerTickCount[Index] := Pointer(Value); end; function TTimerEx.GreatestCommonDivisor(A, B: integer): integer; var C: integer; begin while B <> 0 do begin C := A mod B; A := B; B := C; end; Result := A; end; function TTimerEx.TimerIntervall: integer; var I, J: integer; begin Result := 1000; if Count = 1 then Result := Intervall[0] else if Count > 1 then begin Result := MaxInt; for I := 0 to Count - 2 do for J := I + 1 to Count - 1 do Result := Min(Result, GreatestCommonDivisor(Intervall[I], Intervall[J])); end; for I := 0 to Count - 1 do TickCount[I] := Intervall[I] div Result; end; procedure TTimerEx.BeginUpdate; begin FStoreActive := FActive; FActive := false; FTimer.Enabled := false; end; procedure TTimerEx.EndUpdate; var I: integer; begin FTimer.Interval := TimerIntervall; for I := 0 to Count - 1 do TimerTickCount[I] := 0; FActive := FStoreActive; FTimer.Enabled := FStoreActive; end; procedure TTimerEx.TimerExTimer(Sender: TObject); var I: integer; begin FTimer.Enabled := false; try I := 0; while FActive and (I < Count) do begin TimerTickCount[I] := TimerTickCount[I] + 1; if TickCount[I] = TimerTickCount[I] then begin TimerTickCount[I] := 0; if Enabled[I] and Assigned(FOnTimerExTimer) then FOnTimerExTimer(I); end; Inc(I); end; finally if FActive then FTimer.Enabled := true; end; end; end. |
AW: Pac-Man Hilfe
Neugier: Wieso verwendest Du Pointer und nicht die Werte an sich?
Sherlock |
AW: Pac-Man Hilfe
Weil er die mehrere TList dazu missbraucht jeweils einen Integer oder Boolean (Integer mit 0 oder 1) zu speichern, anstatt eine TObjektList mit Datenobjekten zu verwenden. :zwinker:
|
AW: Pac-Man Hilfe
Zitat:
|
AW: Pac-Man Hilfe
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen!
Aus der Rubrik : Ich konnte es mal wieder nicht lassen... FMX-Pac-Man... Beta-Version - mal zum testen... Hoffe die "groben" Fehler sind alle raus... Auf Sound habe ich zur Zeit verzichtet... Grüsse Mavarik :coder: PS.: Erschreckend: Z80-Version 4KB -> FMX-Version 6MB |
AW: Pac-Man Hilfe
Klasse! Wie macht man es aber aus? Klick auf X rechts oben macht gar nichts.
Sherlock |
AW: Pac-Man Hilfe
Alt + F4 ESC oder Taskmanager ;)
|
AW: Pac-Man Hilfe
[Win] shutdown -s [Enter]
oder [Win]+D [Alt]+[F4] [Enter] Aber warum wöllte man sowas überhaupt beenden wollen? Und warum will man enn unbedingt ein Standardverhalten benutzen, um dieses schöne Programm zu beenden? |
AW: Pac-Man Hilfe
Zitat:
ESC stoppt den Thread - nochmal ESC beendet... Hab ne Version hingelegt die auch auf den Formclose reagiert... [EDIT] Ein paar Kleinigkeiten muss ich noch ändern... Es funktioniert auch nur bis LVL 255... Mavarik |
AW: Pac-Man Hilfe
Sag ich doch, du bist der Pacman Gott :thumb:. BTW, wo hast du denn die Levels her?
|
AW: Pac-Man Hilfe
Zitat:
Es gibt Adaptionen die nach dem LVL 21 noch weiter tolle Features haben, ich habe mich aber auf das original beschränkt... Warum nur bis LVL 255? Ich hab für den LVL ein Byte genommen... :stupid: Wer will so etwas heute noch 255 LVL spielen? Im original gibt es da ja auch einen netten Fehler... Selbst in "Never die" Mode hat meine Geduld nur bis LVL 13 gereicht (um die LVL Icons zu testen)... Die Anpassung der Framerate hab ich rausgenommen und auf ca. 60 gesetzt... Auf meinen Rechner (In der VM) habe ich Raten von über 600 FPS erreicht... Die ganze Berechnung dauert i.d.R. ca. 1-1.5 ms. Mavarik |
AW: Pac-Man Hilfe
Mir fehlt der sound wirklich. ansonsten echt genial!
Für die Leute, denen der Sound auch fehlt: https://youtu.be/XY_ESTnBlS0?list=PL155E832DB2A9118B Ich hab mir damals die Kasette(!!) gekauft. Am meisten hat mir "Froggys lament" gefallen. *SEUFZ* Sherlock |
AW: Pac-Man Hilfe
Der Sound macht einen ja fertig? Man könnte ja wenigstens etwas Hühnerteckkno verwenden. Oder gleich so. Mavarik, wie sieht's aus? :-D
|
AW: Pac-Man Hilfe
Zitat:
Gruß K-H Sound mit Mehreren Kollegen im Büro?? |
AW: Pac-Man Hilfe
Zitat:
http://www.gamesbasis.com/pacman.html |
AW: Pac-Man Hilfe
Zitat:
Sherlock |
AW: Pac-Man Hilfe
Zitat:
Ich habe die Klangtabellen und die Waveforms natürlich auch... Aber leider geht das unter iOS&Android nicht... (Feature-Request ist schon auf dem Weg nach EMBT) Zitat:
Habe das sowieso gekapselt... Einfach in einem Thread immer wieder "nextframe" aufrufen und alle Animationen und Draws sind Call-Backs... Dann kann jeder seine eigene Oberfläche und Sprites drauf setzen... Grüsse |
AW: Pac-Man Hilfe
|
AW: Pac-Man Hilfe
Zitat:
ich mache so etwas ungern... "Bordmittel wären mir lieber" Aber das geht halt zur Zeit nur mit dem Mediaplayer und Dateibasiert... (VIEL zu langsam) |
AW: Pac-Man Hilfe
Zitat:
1. Ist nicht das Original 8-) 2. Das Timing wann welcher Geist los läuft ist falsch 3. Es werden die 4 No-Up-Move Punkte nicht berücksichtigt... :warn: usw... :duck: Ich schau mal nach der Sound Implementierung wenn ich wieder Zeit habe... Wer es original spielen will... und weitere 599 Classic Games... Mavarik Ich hoffe es kommt nicht einer auf die Idee und will als Schulprojekt mal eben Galaxian programmieren... Das sind 3xZ80 CPU die auf den gleichen Speicher zugreifen. 64 Hardware Sprites (kein Thema) und eine extra Hardware die die Stern-Animation unter den Bildschirm zaubert... NEIN, hab keine Zeit... :twisted: |
AW: Pac-Man Hilfe
Zitat:
|
AW: Pac-Man Hilfe
Die Aufgabe ist abgegeben, das Thema abgehakt, und Delphi wird man nie wieder sehen.
Ich schaue mir Threads wie diesen eigentlich nur an, weil wir hier einen Haufen cleverer Leute haben, von denen ich noch verdammt viel lernen kann. Ich hoffe nur, die Menge und Qualität dieser Hausaufgaben-Threads bleibt auf erträglichem Niveau, so daß unserer Überflieger nicht den Spaß verlieren. In diesem Sinne: wieter so! :thumb: Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz