Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Pacman-Wände-Problem (https://www.delphipraxis.net/129242-pacman-waende-problem.html)

Heffty 15. Feb 2009 11:14


Pacman-Wände-Problem
 
Hallo Leute. Ich habe ein Problem mit meinem Spiel Pacman. Und zwar läuft Pacman (ein Icon im Image) über ein wieters großes Image, das Level. Mein Problem ist, dass ich es überhaupt nicht hinbekomme die Wände für Pacman undurchlässig zu machen. Hat vielleicht jemand eine Lösung? Danke im Voraus.

Noedel 15. Feb 2009 11:21

Re: Pacman-Wände-Problem
 
wenn der pacman auf left und top der wand ist, dann soll er sich nicht mehr bewegen.

Der_Unwissende 15. Feb 2009 11:26

Re: Pacman-Wände-Problem
 
Hi und erstmal herzlich Willkommen in der DP :dp:

Ich bin sicher, dass viele nette Leute hier gerne bei Deinem Problem helfen, was dazu aber immer gaaanz wichtig ist: Informationen!

Du sagst ja schon, dass Du das ganze angefangen hast und ein Teil funktioniert. Genauso wichtig ist aber immer auch, dass Du sagst was Du schon probiert hast oder (ggf.) auch was nicht. Bei Deinem konkreten Problem wäre jetzt also die Frage, hast Du schon einen Ansatz wie Du Wände erkennst? Hast Du den probiert und funktioniert der einfach nicht? Oder fehlt Dir einfach nur der Anfang?

An sich kannst Du Dein "großes" Image oder eben die Levelmap in ein Raster teilen. Jedes Element im Raster ist eben so groß wie Deine Spielfiguren, entsprechend viele Felder ist das Level hoch und breit. Dann kannst Du z.B. Informationen zu jeder Grenze in einem Feld (Array) speichern. Am einfachsten geht das, wenn Du der Intuition folgst, speicher einfach zu jedem Element des Spielfeldes ob eine Bewegung nach links, rechts, oben oder unten von dieser Position aus möglich ist. Das kannst Du dann entsprechend einfach prüfen, soll Pacman eine Bewegung machen kennst Du seine Position und schaust im Array nach ob die neue Position erreicht werden kann.

Besten Gruß,
Der Unwissende

Florian Hämmerle 15. Feb 2009 12:03

Re: Pacman-Wände-Problem
 
Speichere die Informationen in nem Array deiner Spielfeldgröße.
zB

-1 => Wand
0 => Frei
1 => Münze
2 => ...
10 => PacMan

Dann kannst du immer überprüfen, ob das Feld betretbar ist.

mfg Flö

Heffty 15. Feb 2009 12:35

Re: Pacman-Wände-Problem
 
Ja vielen Dank für die schnellen Antworten. Also ich habe eigentlich keinen Ansatz wie ich die Wände erkennen lasse, dass mit dem Raster hört sich Prima an aber wie erstelle ich ein solches?

Florian Hämmerle 15. Feb 2009 14:16

Re: Pacman-Wände-Problem
 
Nehmen wir mal an dein Spielfeld ist 10x10 Felder groß.
Dann hast du ein Array[1..10][1..10] in dem deine Felder gespeichert sind.
Jedes Objekt in deinem spiel wird durch eine Zahl repräsentiert (zB 0 für ein leeres feld, -1 für ein nicht begehbares feld = Wand). Dann sieht dein Array zb so aus

-1-1-1-1-1-1-1-1-1-1-1
-1 0 0 0 3 3 3 3 3 9 0
...

Hier ist -1 eine Wand, 0 ein leeres Feld, 3 = Feld mit Münze, 9 = PacMan

PacMan wird über die Pfeiltasten gesteuert:
Links: => Position-x wird um eines verringert
Rechts: => Position-x wird um eines erhöht
Oben => Position-y wird um eines verringert
Unten => Position-y wird um eines erhöht

Somit hast du immer die aktuelle Position des PacMan und kannst so ganz einfach abfragen ob er laufen kann oder nicht:
Wenn neue Position = -1 dann darf er nicht laufen
Wenn neue Position = 3 dann Score um eines erhöhen und neue Position beim nächsten Zug auf 0 setzen (ist ja nichts mehr drauf)

mfg Flö

Namenloser 15. Feb 2009 14:33

Re: Pacman-Wände-Problem
 
Wobei es mit "darf nicht mehr bewegen" nicht getan ist. Man muss zusätzlich noch prüfen, in welche Richtung er sich nicht mehr bewegen darf, sonst bleibt er an den Wänden kleben :wink:

Der_Unwissende 15. Feb 2009 14:34

Re: Pacman-Wände-Problem
 
Das mit dem Spielfeld als Array hatte ich ja schon erwähnt, dem stimme ich dann bei Florian auch voll zu.
Allerdings brauchst Du gar nicht mit Zahlen zu arbeiten. Hierfür gibt es in Delphi die gute Alternative, dass Du selbst einen Typen festlegst. Einfach mit dem Schlüsselwort Type beginnen und einen neuen Typen deklarieren:

Delphi-Quellcode:
type
 TPacmanGameMapElement = (gmeWall, gmeEmpty, gme...);
Das ist dann ein ganz normaler Typ, kannst entsprechend auch ein Array von diesem Typen erzeugen und die Werte direkt setzen. Statt Zahlen zu vergleichen kannst Du auch direkt den Wert prüfen (also z.B. x = gmeWall, natürlich sollten Variablen eher nie x heißen). Der Vorteil an so einem Typen ist die Typsicherheit, Du stellst einfach sicher, dass Du nicht versehentlich einen falschen Wert zuweist. Außerdem kann man den Code viel einfacher lesen, da bereits klar ist was Du meinst. Bei Zahlen ist das immer so eine Sache (ob -1 nun eine Wand ist oder was ganz anderes wird keiner korrekt erraten). Intern macht Delphi zudem eh nichts anderes als es in Zahlen umsetzen.

Das geschilderte Prinzip ist ansonsten natürlich schon mal ein Ansatz. Da solltest Du mal schauen wie weit Du kommst.

Florian Hämmerle 15. Feb 2009 14:36

Re: Pacman-Wände-Problem
 
Das mit eigenem Typ würd ich auch empfehlen. Hab nur Zahlen verwendet, um es besser darstellen zu können.
Über den Typ kannst du dann auch noch ganz einfach jedem ein eigens Bild zuweisen.

mfg Flö

Heffty 15. Feb 2009 14:52

Re: Pacman-Wände-Problem
 
Gut gut das mit dem Array verstehe ich soweit aber ich müsste dann ja mein Level komplett neu machen mit Quadraten die so groß sind wie meine Spielfigur? Wenn meine Annahme also richtig ist müsste mir jemand erklären wie ich dieses Image mit den vielen Rechtecken die nebeneinander angeordnet sind erstelle. Denn bisher kann ich nur rechtecke an bestimmte Positionen aber nicht aufgereiht erstellen.

Florian Hämmerle 15. Feb 2009 14:54

Re: Pacman-Wände-Problem
 
Zitat:

Zitat von Heffty
Gut gut das mit dem Array verstehe ich soweit aber ich müsste dann ja mein Level komplett neu machen mit Quadraten die so groß sind wie meine Spielfigur? Wenn meine Annahme also richtig ist müsste mir jemand erklären wie ich dieses Image mit den vielen Rechtecken die nebeneinander angeordnet sind erstelle. Denn bisher kann ich nur rechtecke an bestimmte Positionen aber nicht aufgereiht erstellen.

Wenn du es eh schon kannst. Du musst nur für jedes Feld deines Arrays das entsprechende Bild an die entsprechende Position "schieben".

Deine Bilder sind zum Beispiel 15x15px groß => 1.Reihe 1.Spalte => 0,0 1.Reihe 2.Spalte 15,0 ...

mfg Flö

Heffty 15. Feb 2009 15:07

Re: Pacman-Wände-Problem
 
gut gut vielen dank ihr habt mir prima weitergeholfen. Könnte mir vielleicht noch jemand erklären wie ich ein Memo auslesen kann. Denn so kann ich das Level speichern und laden, nur müsste ja das Memo die Zahlen auslesen können. Also bisher kann ich die Zeilen auslesen mit Memo.lines[i] etc. Aber wie komme ich an die einzelnen Zahlen ran? zb 1110111 wäre alles Wand nur ein Durchgang in der Mitte.

mimi 6. Mär 2009 15:21

Re: Pacman-Wände-Problem
 
Also, ich finde die bisherige Vorgehensweise zwar teilweise schon richtig, aber noch nicht 100%ig.

Du arbeitest mit einem TImage, richtig ? Nimm lieber eine PaintBox und verwende ein Buffer von typ TBitmap.

Das mit dem Raster ist nicht schlecht, du brauchst kein Memo. Ein Level Editor ist schnell geschrieben:
Du Maus Position kannst du relativ schnell umrechnen in Raster Positionen, beim zeichnen musst du halt nur aufpassen.

Du könntest z.b. eine RadioGroubbox nehmen und dort deine Level-Elemente eintragen.
Wenn du jetzt auf deine PaintBox klickst, wertest du diese RadioGroubbox aus und erstellst das gewünschte Objekt.

Ich hoffe du kannst mir folgen. Das Zeichnen vom Pacman selbst ist dann auch nicht mehr weiter Problematisch:
einfach ein neues Objekt von Typ TBitmap anlegen. Einfachst halber kannst du ja alles neu Zeichnen.

Diese Vorgehensweise währe schon besser. Ein Memo währe langweilig *G*.

Ich kann dir gerne als Vorlage mal meine 2D Engine und mein GamePack hochladen. Da ist ein Pacman mit dabei als Beispiel. Allerdings greift das Pacman auf die Grundlagen meiner 2D Engine und meinem Gamepack zurück. Aber also Vorlage.... müsste es reichen oder ?

Florian Hämmerle 6. Mär 2009 15:26

Re: Pacman-Wände-Problem
 
Als Format für die Levels würde ich dir schon was textbasiertes raten.
Dann kann man mit ner einfachen Anleitung auch in Notepad Levels erstellen.
wenn deine Welt 15x15 Felder groß ist, dann hast du 15 Zeilen zu je 15 Zeichen.
Später kannst du das ja noch ausbauen und in ein anderes Format speichern (wenn du zB noch andere Daten übernehmen möchtest...)

Für das Auslesen such mal nach Stringoperationen.

mfg Flö


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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