![]() |
AW: Pac Man programmieren
Liste der Anhänge anzeigen (Anzahl: 2)
OK,
Kleine Anleitung wie man Spiele Programmiert. Ein Thread erzeugt alle 16.6 ms ein neues Frame – schneller macht heute bei TFT’s mit 60Hz keinen Sinn. Klar gib es auch schnellere TFT’S! Aber bleiben wir mal bei diesen 60Hz Man benötigt also eine Routine die so ein neues Frame erzeugen kann. Die Main-Game-Loop sieht also im groben so aus:
Delphi-Quellcode:
Außerhalb gibt s noch die Maus/Keyboard Abfrage die ihre Daten an die Gameengine weiter gibt.
begin
while InGame do begin Timer.Start; NewFrame := GameEngine.GetFrame; Timer.Stop if Timer.Elapsed < 16.6666 then GameEngine.PreprocessnextFame(16.66 – Timer.Elapsed); // Zeit nutzen sonst sleep MainScreen.BeginUpdate try MainScreen.Assign(NewFrame); finally MainScreen.EndUpdate end; end; end; Wer das nicht im Thread machen möchte (also für Anfänger einfacher) nimmt einfach einen Timer. Den stellt man auf 15. Wirklich schneller geht es eh nicht. Jetzt zu PacMan: Man braucht: Einiges an array’s und Definitionen StartPos Geister und PacMan, Imagefolge für die Bewegungen in allen Richtungen, Variablen für Position und Richtungen. Am besten je ein Object pro Geist und PacMan mit allen Daten Neben den „hochauflösenden“ X/Y Positionen, führt man intern ein LowRes Array mit der Position mit. Einfache XY Koordinaten. Um Wende und andere Objekte zu finden. Ein Aufruf von GameEngine.GetFrame erzeugt also genau ein Frame und entscheidet wo was gemalt werden muss. Nicht jeder Frame muss alles bewegen. Ggf. bewegt sich ein Geist nicht, weil er sich nur alle 2 Frames bewegen darf (sonst ist er zu schnell) oder die Power-Points blinken halt auch nicht mit 60Hz. USW. So das war es erstmal für den Anfang. Mavarik PS.: Das gelöschte vom letzten Posting |
AW: Pac Man programmieren
Tut mir leid das ich jetzt erst antworte. Also ich bin noch nicht weiter, mein Problem ist nach wie vor Pacman zu bewegen. Ich habe auch zuerst mit einem Button versucht aber es möchte einfach nicht funktionieren.
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var a,b,i:Integer; begin for a:=0 to 40 do //füllt alle Zellen mit 0 for b:=0 to 40 do begin StringGrid1.Cells[a,b]:='1'; //alle Zellen sollten 1 sein, überall wo die eins ist kann Pac Man nicht laufen end; For i:=1 to 38 do begin StringGrid1.Cells[i*1,1]:='0'; //wo die 0 ist soll Pac Man laufen end; image4:=timage.Create(self); image4.Parent := Stringgrid1; // Image soll auf Stringgrid1 angezeigt werden image4.Left := 20; //Position image4.Top := 20; //Position image4.AutoSize := True; image4.Picture.LoadFromFile('C:\Users\johan_jlh8bh3\Desktop\Schule\IV\Bilder PacMan\pac3.bmp'); //Ort von dem das Bild geladen wird image4.Visible:= true; image4.Transparent:=true; end; procedure TForm2.Button2Click(Sender: TObject); var PacmanY,PacmanX,a,b:Integer; begin for a:=0 to 40 do for b:=0 to 40 do begin if StringGrid1.Cells[a,b]=Inttostr(0) then begin PacmanX:=a; PacmanY:=b; end; end; if PacmanX<40 then //nicht über den Rand begin if StringGrid1.Cells[(PacmanX*2)+1,PacmanY*2]=Inttostr(0) then //Abfrage, ob es eine Mauer gibt begin image4.Left:= 20+(PacmanX); //Bild verrücken end; end; end; Also dies habe ich bisher aber es möchte nicht funktionieren, könnt ihr mir bitte weiterhelfen. |
AW: Pac Man programmieren
Du musst die Bewegung in einem Timer realisieren, nicht in einer internen Schleife. Letztere wird einfach abgearbeitet, ohne dass man eine Änderung sehen würde.
|
AW: Pac Man programmieren
Zitat:
Hast Du auch nur eine Zeile von dem gelesen, was ich geschrieben habe? Was willst Du den mit dem Button erreichen? PacMan finden? Du solltest eigentlich wissen wo er ist... Außerdem hast Du nicht nur eine 0 im Grid, sondern viele... naja und pacmanX ist immer < 40 den sonst würde Pacman schon in der Wand stehen... Da du aber die for Schleife eh von 0 bis 40 laufen läßt sollte das immer zutreffen. dann kannst Du auch direkt die Schleife bis 39 laufen lassen... |
AW: Pac Man programmieren
Ich habe es gelesen aber davon habe ich keine Ahnung, für dieses Projekt muss ich mir alles erarbeiten und das ist auch der ganze Reiz an der Sache. Ich bin halt nun mal auf Hilfe angewiesen. Ich versuche es Schritt für Schritt denn es ist noch nie ein Meister vom Himmel gefallen.
Mit dem Button habe ich versucht ihn erstmal zum laufen zu bringen. Bevor ich es mit dem keydown versuche. |
AW: Pac Man programmieren
Hallo,
Zitat:
Du scheinst wirklich nicht verstanden zu haben, was Du dir für eine Mordsarbeit angetan hast. Du brauchst eine State-Engine, wo Du alle Objekte in einem Koordinatensystem positionieren kannst, und die sich beim nächsten Zeit-Event neu berechnen lassen. Es bewegen sich ja doch einige Objekte neben dem PacMan. Per ButtonClick kannst Du das "nächstes Zeitevent" manuell natürlich anstossen für Tests. Ich kann Dir nur raten, das Projekt zurückzugeben! |
AW: Pac Man programmieren
Frag' ggf. mal deinen Lehrer, ob du ein an Pacman angelehntes eigenes Spiel gestalten darfst? Denkbar wäre zum Beispiel ein Area (kein Irrgarten) in dem Pacman Pallets aufsammelt und dabei von Blinky und Co. verfolgt wird?
|
AW: Pac Man programmieren
Zitat:
1. Überlege dir was alles und vor allem in welcher Reihenfolge passieren muss 2. Definiere Dir die Variablen / Records / Classen die alle Daten halten (so wie ich es beschrieben habe) a. Position PacMan, Laufrichtung b. Position Greist 1-3 mit Status ´(Blau oder Farbe), welche Farbe, Laufrichtung, InBox, OutBox, OutBoxTime c. Anzahl der Pillen, Status der PowerPillen und Position d. Anzahl Leben, Aktiver Spieler, Punktestand 3. Initialisiere alle Variablen auf die richtige Startwerte. Zu (1) Nimm Dir einen Timer a.) Bei jeden onTimerEvent setze Pacman und die Geister auf die neue Position(Laufrichtung) b.) Prüfe ob PacMan in die gespeicherte Richtung überhaupt laufen kann, sonst anhalten c.) Prüfe ob die Position von PacMan gleich der Position von einem der Geister ist d.) Prüfe ob PacMan beim nächsten Schrit auf einer PowerPill ist e.) Prüfe ob Geist 1-3 an einer Abzweigung ist und entscheide pro Geist in welche Richtung er laufen soll So lange Du Punkt 1,2,3 nicht erledigt hast, brauchen wir nicht versuchen Dir zu helfen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz