Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren)
a) wie kann ich das Pacman (Gif) automatisch in Sichtrichtung des Pacmans bewegen lassen kann (stehen bleibt wenn vor ihm Wand)(ohne Taste gedrückt),
-> ich könnte es wenn er die Wand schneiden würde, was er aber nicht tun sollte.
b) wie ich machen kann, dass der Pacman sich nur dreht wenn man 1. Pfeiltaste drückt UND 2. in dieser Richtung keine Wand ist.(Rechtecke)
c) wie ich einen Geist mache, der den Pacman automatisch verfolgt
Ich fürchte, dass es so nicht funktioniert. Wir haben keine Ahnung, was Du bisher an Code hast, wie Dein Spiel strukturiert ist. Daher können wir Dir auch nicht sagen, wie Du da die gewünschten Funktionen einbauen kannst.
Du musst also deutlich deutlicher werden, was Du derzeit hast und auch genau sagen, was Du willst (Dein Punkt a ist so für mich teilweise unverständlich).
Ich fürchte, dass es so nicht funktioniert. Wir haben keine Ahnung, was Du bisher an Code hast, wie Dein Spiel strukturiert ist. Daher können wir Dir auch nicht sagen, wie Du da die gewünschten Funktionen einbauen kannst.
Du musst also deutlich deutlicher werden, was Du derzeit hast und auch genau sagen, was Du willst (Dein Punkt a ist so für mich teilweise unverständlich).
Danke für die Rückmeldung,
bei Punkt a meine ich, dass sich das Pacman-Gif immer in die Richtung bewegt in die das Pacman schaut (Mund in Bewegungsrichtung). Wenn das Bild also gedreht wird, soll es von alleine in diese Richtung bewegt werden.
Der Pacman soll aber nur gedreht werden können (mit den Pfeiltasten), wenn in diese Richtung, in den man ihn gedreht hat, keine Wand ist. (Map besteht aus vielen rechteckigen Wandstücken, welche in 30x30 Pixel zu einem Labyrinth zusammengereiht wurden)
Falls der Pacman am Ende eines Ganges an eine Wand stoßt soll er stehen bleiben. (ohne die Wand zu berühren, 2 Pixel davor stehen bleiben)
Bisheriger Code im Anhang (Kann mit BlueJ geöffnet werden)
Der generelle Aufbau ist dann doch einfach: Du musst für die Bewegung z.B. einen Thread haben.
Der Pacman hat eine Richtung. Der Thread schaut also immer nach: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.
Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du schaust: Ist in der Richtung frei? Wenn ja, dann wird die Richtung von Pacman umgesetzt.
Wobei ich im Augenblick unsicher bin, wie das Spiel funktionierte. Wenn man eine neue Richtung gegeben hat, dann ist doch PacMan bei der nächsten Möglichkeit in die Richtung gegangen, oder nicht? Das wäre dann ähnlich:
Der Pacman hat eine Richtung und eine nächsteRichtung.
Der Thread schaut also immer nach:
- Ist in nächsteRichtung gesetzt und frei? Dann wird die Richtung := naechsteRichtung.
- Dann: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.
Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du einfach naechsteRichtung setzt.
Das wäre der Theoretische Aufbau. Das ist aber etwas, das du Dir ganz ohne jedes Programmieren überlegen solltest. Mal es Dir zur Not auch alles einmal auf um zu verstehen, was denn da jeweils geprüft oder gemacht wird.
Der generelle Aufbau ist dann doch einfach: Du musst für die Bewegung z.B. einen Thread haben.
Der Pacman hat eine Richtung. Der Thread schaut also immer nach: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.
Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du schaust: Ist in der Richtung frei? Wenn ja, dann wird die Richtung von Pacman umgesetzt.
Wobei ich im Augenblick unsicher bin, wie das Spiel funktionierte. Wenn man eine neue Richtung gegeben hat, dann ist doch PacMan bei der nächsten Möglichkeit in die Richtung gegangen, oder nicht? Das wäre dann ähnlich:
Der Pacman hat eine Richtung und eine nächsteRichtung.
Der Thread schaut also immer nach:
- Ist in nächsteRichtung gesetzt und frei? Dann wird die Richtung := naechsteRichtung.
- Dann: Ist in der Richtung Platz? Wenn ja, dann bewegt sich PacMan einen Schritt weiter.
Wenn der Benutzer eine Taste drückt, dann ist das ein Event. Auf dieses Event kannst Du dann reagieren, indem Du einfach naechsteRichtung setzt.
Das wäre der Theoretische Aufbau. Das ist aber etwas, das du Dir ganz ohne jedes Programmieren überlegen solltest. Mal es Dir zur Not auch alles einmal auf um zu verstehen, was denn da jeweils geprüft oder gemacht wird.
Wie genau schaut man ob in dieser Richtung frei ist? Könnten Sie den Code vielleicht etwas bereitstellen, da ich mich mit Threads und Events noch nicht auskenne.
Wie schon gesagt: Wir haben keine Ahnung, was Du da bisher an Code hast und was Du für Dein PacMan Spiel nutzt. Daher können wir dir diesbezüglich keine Auskunft geben.
Wie schon gesagt: Wir haben keine Ahnung, was Du da bisher an Code hast und was Du für Dein PacMan Spiel nutzt. Daher können wir dir diesbezüglich keine Auskunft geben.
Vielleicht kann mir wer anderes helfen: Wie mache ich es, dass Pacman erst dann wenn frei ist sich dreht und weiterläuft und immer in Richtung geht, wo der Mund hinzeigt.
Und wie kann ich es machen, dass der Geist den Pacman verfolgt.
Ok, ich nehme an, dass Du in der Schule dies als Projekt hast? Dass ihr da mit dieser Engine Alpha im Unterricht das Spiel Pacman schreibt?
Im Augenblick ist mir och nicht klar, wie wir Dir am besten helfen. Denn vermutlich wirst Du ja irgend ein generelles Verständnis für das Projekt bekommen müssen und zu Java und so weiter ...
Ok, ich nehme an, dass Du in der Schule dies als Projekt hast? Dass ihr da mit dieser Engine Alpha im Unterricht das Spiel Pacman schreibt?
Im Augenblick ist mir och nicht klar, wie wir Dir am besten helfen. Denn vermutlich wirst Du ja irgend ein generelles Verständnis für das Projekt bekommen müssen und zu Java und so weiter ...
Ich habe ein generelles Verständnis für die grundlegenden Dinge. Aber das haben wir im Unterricht noch nicht gemacht.(Threads) (Dies ist unser Abschlussprojekt - wird zuhause gemacht) Und ich komme nicht weiter
Also generell brauchst Du nichts mehr mit Threads zu machen. Die Library hat da schon alles, was Du brauchst und du hast in Spiel die Methode tick, welche du in LABYRINTH ja überschrieben hast.
Du hast in LABYRINTH sowohl die LEVEL1 als auch die PACMAN Instanzen. PACMAN hat seine x und y Koordinate. LEVEL1 kennt die Wände.
Wenn Du wissen willst, ob in einer bestimmten Richtung keine Wand ist, müsstest Du also nur:
- Ermitteln, welches die neue Koordinate in dieser Richtung ist.
- Dann in LEVEL1 halt prüfen, ob an dieser Stelle eine Wand ist oder nicht. Wenn da keine Wand ist, dann wäre die Stelle frei.
Die Frage ist, wie die Geister dem Pacman folgen sollen. Da sind klare Vorgaben wichtig. Ich denke, es sollten 3 Modi geben:
a) Random Moves. Der Geist hat eine Richtung und immer wenn er abbiegen kann ermittelst Du die weitere Richtung per Zufall.
b) Spieler weit entfernt - hier sollte bei jeder Möglichkeit, abzubiegen, die Chance für den Weg, der in Richtung Spieler führt höher sein als für die anderen Richtungen. So wird vermieden, dass die Geister dem Spieler keine Chance lassen.
c) Spieler jagen - wenn ein Geist einen Spieler gesehen hat (Also in gerader Richtung ohne Wand war der Spieler sichtbar), dann rennt der Geist dem Spieler hinterher. Das kann dann prinzipiell b) sein mit Auswahl liegt immer in Richtung Spieler.
Generell sollte man sich ggf. auch überlegen, die Inhalte der Klassen etwas besser zu strukturieren. Teilweise sind da Codeabschnitte an Stellen, wo diese aus meiner Sicht nicht wirklich sein sollten. Eine bessere Platzierung des Codes kann ggf. auch die weitere Entwicklung vereinfachen.
Also generell brauchst Du nichts mehr mit Threads zu machen. Die Library hat da schon alles, was Du brauchst und du hast in Spiel die Methode tick, welche du in LABYRINTH ja überschrieben hast.
Du hast in LABYRINTH sowohl die LEVEL1 als auch die PACMAN Instanzen. PACMAN hat seine x und y Koordinate. LEVEL1 kennt die Wände.
Wenn Du wissen willst, ob in einer bestimmten Richtung keine Wand ist, müsstest Du also nur:
- Ermitteln, welches die neue Koordinate in dieser Richtung ist.
- Dann in LEVEL1 halt prüfen, ob an dieser Stelle eine Wand ist oder nicht. Wenn da keine Wand ist, dann wäre die Stelle frei.
Die Frage ist, wie die Geister dem Pacman folgen sollen. Da sind klare Vorgaben wichtig. Ich denke, es sollten 3 Modi geben:
a) Random Moves. Der Geist hat eine Richtung und immer wenn er abbiegen kann ermittelst Du die weitere Richtung per Zufall.
b) Spieler weit entfernt - hier sollte bei jeder Möglichkeit, abzubiegen, die Chance für den Weg, der in Richtung Spieler führt höher sein als für die anderen Richtungen. So wird vermieden, dass die Geister dem Spieler keine Chance lassen.
c) Spieler jagen - wenn ein Geist einen Spieler gesehen hat (Also in gerader Richtung ohne Wand war der Spieler sichtbar), dann rennt der Geist dem Spieler hinterher. Das kann dann prinzipiell b) sein mit Auswahl liegt immer in Richtung Spieler.
Generell sollte man sich ggf. auch überlegen, die Inhalte der Klassen etwas besser zu strukturieren. Teilweise sind da Codeabschnitte an Stellen, wo diese aus meiner Sicht nicht wirklich sein sollten. Eine bessere Platzierung des Codes kann ggf. auch die weitere Entwicklung vereinfachen.
Vielen, Vielen Dank für diese sehr hilfreiche Antwort.
a) Dennoch komme ich nicht weiter, wann der Pacman abbiegen kann, wenn man zuvor die jeweilige Pfeiltaste gedrückt hat. Sie haben es zwar gut erklärt, ich weiß aber trotzdem nicht wie ich dies umsetzen soll.
b) Wie setzt man deine Geist Punkte b, c um? (Meinem Plan nach hätte ich es eigentlich vereinfacht und es gibt nur Random Moves)
c) Wo ist Ihrer Meinung nach, Code der nicht an dieser jeweiligen Stelle sein sollte.
Es tut mir wirklich sehr Leid für diese vielen Fragen, aber ich will es einfach schaffen.
Die Fragen sind alle ok und ich gehe da auch gerne weiter drauf ein. Wird aber evtl. heute nicht mehr so viel an Antworten geben. Ich versuche das einfach einmal etwas zusammen zu fassen und den ersten Überblick, den ich habe, noch einmal dar zu stellen (Ich habe das Projekt aber auch nur kurz überflogen, daher kann es sein, dass ich auf der Schnelle etwas falsch interpretiert habe, zumal der Code teilweise schwer oder ungewohnt zu lesen ist ... (Es erinnert mich etwas an die Zahnpasta-Werbung von damals ... "Oh, alles rot" ... wobei meine IDE da sehr viel Gelb färbt wegen den vielen Warnung...)
Fangen wir einmal mit c) an. Du hast eine Klasse Level1 welche von Basisklasse erbt. Level1 ist eigentlich leer und alles, was den Level1 ausmacht ist in der Basisklasse. Einige Dinge sind dort auch richtig, z.B. dass es eine Instanzvariable für die Felder mit Wand gibt. Aber die konkreten Wände sollten natürlich nicht in der Basisklasse sondern in Level1 gesetzt werden. Das wäre eine Sache, die aufgefallen ist.
- Damit Du gewisse Dinge in einem Level machen kannst, braucht die Basisklasse ggf. noch weitere Methoden. Eine Methode nimmt eine Koordinate und gibt dann zurück, ob an der Stelle eine Wand ist.
- Dann kannst Du überlegen, ob Du eine Hilfsklasse baust, die eine Koordinate darstellt (x und y) und da wären dann Methoden wie rechts, links, oben und unten zu finden, die jeweils eine neue Koordinate zurück geben.
Dann ist im Labyrinth die tick Methode. In dieser Methode musst Du immer die jeweiligen Schritte machen:
Also in Tick:
- Packman bewegen
- Kollisionen prüfen
- jeden Geist bewegen
- Kollisionen prüfen
Diese Schritte kann man dann verfeinern - das solltest Du versuchen! Also noch nicht im Code schreiben sondern wirklich nur die Beschreibung in Worten. Packman bewegen hatte ich ja schon eine Möglichkeit aufgezeigt:
- Gibt es eine neue Richtung?
- Ja: Neue Koordinate von neuer Richtung ermitteln.
---> Level prüfen: Ist das Feld frei?
---> Ja: Richtung := neue Richtung; neueRichtung := leer
- Neue Koordinate von Richtung ermitteln
- Ist neue Koordinate keine Mauer?
---> Ja: Koordinate Pacman = neue Koordinate
(Hier hält der Pacman an, wenn er an eine Wand gelaufen ist.)
Solche Beschreibungen sind immer sehr wichtig. Das sind dann viele kleine / kurze Abläufe. Und die packst Du in entsprechende Methoden. musst dabei immer überlegen, wozu so eine Methode gehört. Im Level etwas zu prüfen gehört vermutlich in den Level oder eine Basisklasse. (Da es alle Level haben sollen, wird es wohl auf die Basisklasse hinaus laufen)
Kannst Du solche Beschreibungen für die Dinge, die Du implementieren möchtest, aufstellen? Wobei ich Dir auch raten würde: Fang wirklich mit einzelnen Schritten an. Also am Anfang die Geister weglassen. Nur den Pacman bewegbar machen. Erst wenn das fertig ist, dann kannst Du den nächsten Schritt angehen. Durch so ein Vorgehen hast Du viele kleine Erfolgserlebnisse (hoffentlich) und verhaspelst Dich nicht. Wenn du an mehreren Dingen gleichzeitig schraubst, dann wird es schwer, einen lauffähigen Stand hin zu bekommen um Deinen Code zu testen.
Das sollte es von mir für heute gewesen sein. Wir können das ggf. morgen gerne noch weiter vertiefen.
Die Fragen sind alle ok und ich gehe da auch gerne weiter drauf ein. Wird aber evtl. heute nicht mehr so viel an Antworten geben. Ich versuche das einfach einmal etwas zusammen zu fassen und den ersten Überblick, den ich habe, noch einmal dar zu stellen (Ich habe das Projekt aber auch nur kurz überflogen, daher kann es sein, dass ich auf der Schnelle etwas falsch interpretiert habe, zumal der Code teilweise schwer oder ungewohnt zu lesen ist ... (Es erinnert mich etwas an die Zahnpasta-Werbung von damals ... "Oh, alles rot" ... wobei meine IDE da sehr viel Gelb färbt wegen den vielen Warnung...)
Fangen wir einmal mit c) an. Du hast eine Klasse Level1 welche von Basisklasse erbt. Level1 ist eigentlich leer und alles, was den Level1 ausmacht ist in der Basisklasse. Einige Dinge sind dort auch richtig, z.B. dass es eine Instanzvariable für die Felder mit Wand gibt. Aber die konkreten Wände sollten natürlich nicht in der Basisklasse sondern in Level1 gesetzt werden. Das wäre eine Sache, die aufgefallen ist.
- Damit Du gewisse Dinge in einem Level machen kannst, braucht die Basisklasse ggf. noch weitere Methoden. Eine Methode nimmt eine Koordinate und gibt dann zurück, ob an der Stelle eine Wand ist.
- Dann kannst Du überlegen, ob Du eine Hilfsklasse baust, die eine Koordinate darstellt (x und y) und da wären dann Methoden wie rechts, links, oben und unten zu finden, die jeweils eine neue Koordinate zurück geben.
Dann ist im Labyrinth die tick Methode. In dieser Methode musst Du immer die jeweiligen Schritte machen:
Also in Tick:
- Packman bewegen
- Kollisionen prüfen
- jeden Geist bewegen
- Kollisionen prüfen
Diese Schritte kann man dann verfeinern - das solltest Du versuchen! Also noch nicht im Code schreiben sondern wirklich nur die Beschreibung in Worten. Packman bewegen hatte ich ja schon eine Möglichkeit aufgezeigt:
- Gibt es eine neue Richtung?
- Ja: Neue Koordinate von neuer Richtung ermitteln.
---> Level prüfen: Ist das Feld frei?
---> Ja: Richtung := neue Richtung; neueRichtung := leer
- Neue Koordinate von Richtung ermitteln
- Ist neue Koordinate keine Mauer?
---> Ja: Koordinate Pacman = neue Koordinate
(Hier hält der Pacman an, wenn er an eine Wand gelaufen ist.)
Solche Beschreibungen sind immer sehr wichtig. Das sind dann viele kleine / kurze Abläufe. Und die packst Du in entsprechende Methoden. musst dabei immer überlegen, wozu so eine Methode gehört. Im Level etwas zu prüfen gehört vermutlich in den Level oder eine Basisklasse. (Da es alle Level haben sollen, wird es wohl auf die Basisklasse hinaus laufen)
Kannst Du solche Beschreibungen für die Dinge, die Du implementieren möchtest, aufstellen? Wobei ich Dir auch raten würde: Fang wirklich mit einzelnen Schritten an. Also am Anfang die Geister weglassen. Nur den Pacman bewegbar machen. Erst wenn das fertig ist, dann kannst Du den nächsten Schritt angehen. Durch so ein Vorgehen hast Du viele kleine Erfolgserlebnisse (hoffentlich) und verhaspelst Dich nicht. Wenn du an mehreren Dingen gleichzeitig schraubst, dann wird es schwer, einen lauffähigen Stand hin zu bekommen um Deinen Code zu testen.
Das sollte es von mir für heute gewesen sein. Wir können das ggf. morgen gerne noch weiter vertiefen.
Die Fragen sind alle ok und ich gehe da auch gerne weiter drauf ein. Wird aber evtl. heute nicht mehr so viel an Antworten geben. Ich versuche das einfach einmal etwas zusammen zu fassen und den ersten Überblick, den ich habe, noch einmal dar zu stellen (Ich habe das Projekt aber auch nur kurz überflogen, daher kann es sein, dass ich auf der Schnelle etwas falsch interpretiert habe, zumal der Code teilweise schwer oder ungewohnt zu lesen ist ... (Es erinnert mich etwas an die Zahnpasta-Werbung von damals ... "Oh, alles rot" ... wobei meine IDE da sehr viel Gelb färbt wegen den vielen Warnung...)
Fangen wir einmal mit c) an. Du hast eine Klasse Level1 welche von Basisklasse erbt. Level1 ist eigentlich leer und alles, was den Level1 ausmacht ist in der Basisklasse. Einige Dinge sind dort auch richtig, z.B. dass es eine Instanzvariable für die Felder mit Wand gibt. Aber die konkreten Wände sollten natürlich nicht in der Basisklasse sondern in Level1 gesetzt werden. Das wäre eine Sache, die aufgefallen ist.
- Damit Du gewisse Dinge in einem Level machen kannst, braucht die Basisklasse ggf. noch weitere Methoden. Eine Methode nimmt eine Koordinate und gibt dann zurück, ob an der Stelle eine Wand ist.
- Dann kannst Du überlegen, ob Du eine Hilfsklasse baust, die eine Koordinate darstellt (x und y) und da wären dann Methoden wie rechts, links, oben und unten zu finden, die jeweils eine neue Koordinate zurück geben.
Dann ist im Labyrinth die tick Methode. In dieser Methode musst Du immer die jeweiligen Schritte machen:
Also in Tick:
- Packman bewegen
- Kollisionen prüfen
- jeden Geist bewegen
- Kollisionen prüfen
Diese Schritte kann man dann verfeinern - das solltest Du versuchen! Also noch nicht im Code schreiben sondern wirklich nur die Beschreibung in Worten. Packman bewegen hatte ich ja schon eine Möglichkeit aufgezeigt:
- Gibt es eine neue Richtung?
- Ja: Neue Koordinate von neuer Richtung ermitteln.
---> Level prüfen: Ist das Feld frei?
---> Ja: Richtung := neue Richtung; neueRichtung := leer
- Neue Koordinate von Richtung ermitteln
- Ist neue Koordinate keine Mauer?
---> Ja: Koordinate Pacman = neue Koordinate
(Hier hält der Pacman an, wenn er an eine Wand gelaufen ist.)
Solche Beschreibungen sind immer sehr wichtig. Das sind dann viele kleine / kurze Abläufe. Und die packst Du in entsprechende Methoden. musst dabei immer überlegen, wozu so eine Methode gehört. Im Level etwas zu prüfen gehört vermutlich in den Level oder eine Basisklasse. (Da es alle Level haben sollen, wird es wohl auf die Basisklasse hinaus laufen)
Kannst Du solche Beschreibungen für die Dinge, die Du implementieren möchtest, aufstellen? Wobei ich Dir auch raten würde: Fang wirklich mit einzelnen Schritten an. Also am Anfang die Geister weglassen. Nur den Pacman bewegbar machen. Erst wenn das fertig ist, dann kannst Du den nächsten Schritt angehen. Durch so ein Vorgehen hast Du viele kleine Erfolgserlebnisse (hoffentlich) und verhaspelst Dich nicht. Wenn du an mehreren Dingen gleichzeitig schraubst, dann wird es schwer, einen lauffähigen Stand hin zu bekommen um Deinen Code zu testen.
Das sollte es von mir für heute gewesen sein. Wir können das ggf. morgen gerne noch weiter vertiefen.
Ich habe heute meinen Lehrer gefragt, wie ich das Umsetzen kann, damit der Pacman in die Richtung geht in der Frei ist:
Nur habe ich ein Problem: Bei Frage ob PACMAN ein Objekt namens RECHTECK schneidet, kommt eine Fehlermeldung. wie löse ich dies?
Bilder des Codes in nächster Antwort:
RECHTECK ist doch eine Klasse und damit kein Objekt. Du hast in EDITEMODE ein Array mit RECHTECK Instanzen namens wandstück. Vielleicht willst Du also in einer Schleife alle Elemente von wandstück prüfen?
Das ist aber nur geraten - so mit den Bildern kann man zu wenig erkennen um Deine Absicht auch wirklich zu verstehen und alles nachzuvollziehen.
Und falls sich jemand wundert: Diese hcp Dateien sind einfach Bitmaps - halt erstellt unter Windows mit einem Hardcopy-Tool.
RECHTECK ist doch eine Klasse und damit kein Objekt. Du hast in EDITEMODE ein Array mit RECHTECK Instanzen namens wandstück. Vielleicht willst Du also in einer Schleife alle Elemente von wandstück prüfen?
Das ist aber nur geraten - so mit den Bildern kann man zu wenig erkennen um Deine Absicht auch wirklich zu verstehen und alles nachzuvollziehen.
Und falls sich jemand wundert: Diese hcp Dateien sind einfach Bitmaps - halt erstellt unter Windows mit einem Hardcopy-Tool.
Du brauchst eigentlich die nechste Position in die der packman beim nechsten tick kommt. Und die musst du prüfen ob sie frei ist.
Die Richtung alleine wird dir da nicht reichen.
Du brauchst eigentlich die nechste Position in die der packman beim nechsten tick kommt. Und die musst du prüfen ob sie frei ist.
Die Richtung alleine wird dir da nicht reichen.
Raum muss eine Klasse sein entweder von dir oder der Lib.
Bei deinen Datein sehe ich keine Klasse Raum.
Zum lesen der Doku ist jetzt keine Zeit.
Vileicht morgen.
In deinem Labyrinth hast du ja ein Objekt von LAVEL1 erstellt diese erbt von EDITEMODE und darin hast du dein WandArray also kannst du auch darauf zugreifen.
Deine eigene Position des Pacman weist du ja , nun musst du ermitteln welches Rechteck aus dem Array „wandstück“ die in Frage kommende Wand ist. Damit er dann stehen bleibt.
Oder du prüfst alle duch.
PS. RECHTECK erbt ja von der Klasse Raum aus der Lib.
Ich hätte da vielleicht auch ein 2D Array benutz in dem ich alle Wände eingezeichnet hätte.
So könnte du leicht prüfen ob die Pos wo der Pacman hin verschoben werden soll frei ist.
Tipp: warum machst du nicht einfach für die vier Wände ein großes Rechteck. Dann kannst du prüfen ob sich der Pacman mit dem Objekt der Wand schneidet.
Du weißt ja in welcher Richtung er geht und auf welche Wand er zuläuft mit welcher du die Kollision prüfen musst.
@Klaus123456789 Falls Du gerade aktiv bist, würde ich gerne ein paar Fragen klären, was ihr so kennt. Dann könnte man da einiges an Code vereinfachen.
1) kennt Ihr Enumerations? Also sowas wie ein enum RICHTUNG { OBEN, RECHTS, UNTEN, LINKS } ?
2) Kennt ihr Konstanten? (Also eine Variable noch zusätzlich als final kennzeichnen)
Ich würde da aber paar Dinge anpassen, wenn es Dir recht ist.
Derzeit speicherst Du die Richtung in der Variablen private String Richtung;
Du hast also Richtung als String
Wenn es um die Richtung geht, die per Taste gewählt wurde, hast Du aber 4 boolean Variablen:
Wenn man eine Richtung speichert, dann sollte man da durchaus einheitlich vorgehen .. also entweder so oder so ...
Wie dem auch sei - wir wollen den Algorithmus doch etwas aufdröseln. Du hast die Stelle, an der man was machen muss, schon etwas erkannt: tick() ruft PacmanVerschieben auf das dann für die Bewegung zuständig ist.
Aber was soll bei einem tick alles passieren?
- Taste auslesen und merken ist schon ein guter Schritt.
- Dann wird aber doch nicht sofort der PacMan bewegt. Wir wollen doch vor dem Bewegen prüfen, ob man die Richtung ändern muss / kann.
Daher wäre tick doch dann eher etwas wie:
Code:
@Override
public void tick(){
this.TasteMerken();
this.RichtungFestlegen();
this.PacmanVerschieben();
}
Nun muss man natürlich noch die Richtung festlegen. Da hatten wir doch eigentlich schon den Ablauf etwas skizziert. Und diese Skizzierungen solltest Du immer erst einmal festlegen:
- Ist die neue Richtung anders als die bisherige Richtung?
--> Wenn ja, dann: Ist das Feld in neuer Richtung frei?
----> Wenn ja, dann: Richtungswechsel! (Richtung = neue Richtung)
- Ist das Feld in Richtung frei?
--> Wenn ja, dann bewege Pacman.
Wir haben jetzt also schon einiges an Logik mehr. Hier ist wichtig, dass wir das so schon nieder schreiben können. Das ist also Code in der Form (Ich lasse mal die Beschreibung als Kommentar drin!):
Java:
// - Ist die neue Richtung anders als die bisherige Richtung?
if (IstNeueRichtungAnders()) {
// --> Wenn ja, dann: Ist das Feld in neuer Richtung frei?
if (IstFeldInNeueRichtungFrei()) {
// ----> Wenn ja, dann: Richtungswechsel! (Richtung = neue Richtung)
WechselRichtung();
}
}
// - Ist das Feld in Richtung frei?
if (IstFeldInBewegungsrichtungFrei()) {
// --> Wenn ja, dann bewege Pacman.
BewegePacman();
}
Das ist der Code von eben genau diesen Schritten. Was an der Stelle noch unsicher ist: Evtl. benötigt irgend eine Methode noch Parameter. Oder evtl. wird eine Methode auf einer Instanz aufgerufen. Der Code ist somit noch nicht wirklich fest und es kann Abweichungen geben.
Und dann schauen wir uns diesen Code einmal an - ohne Kommentare:
Java:
if (IstNeueRichtungAnders()) {
if (IstFeldInNeueRichtungFrei()) {
WechselRichtung();
}
}
if (IstFeldInBewegungsrichtungFrei()) {
BewegePacman();
}
Ist doch auch gut verständlich, oder? Nun müssen wir natürlich noch die ganzen Methoden schreiben. Die, die wir in if aufrufen, müssen natürlich ein boolean zurück geben. Mach erst einmal nur die Methoden ohne Inhalt. Dann übersetzt es schon einmal - aber macht so natürlich noch keinen Sinn.
Aber Du kannst dann eine Methode nach der anderen schreiben. Willst Du das mal weiter probieren?
Alles richtig was Konrad sagt. Wenn du es doch erstmal mit deiner alten Version testen willst. könntest du so prüfen. Du gehst halt alle Wandstücke durch.
Nur bin ich mir nicht sicher ob du überhaupt etwas auf dem Bildschirm siehst. Denn ich sehe nicht das du entweder die Rechtecke oder Bilder( Pacman) sichtbar machst. Jedes der Raum Elemente (Views) hat auch eine Sichtbarkeits Methode die nicht benutzt wird.
Default ist glaube nicht sichtbar.
Nur bin ich mir nicht sicher ob du überhaupt etwas auf dem Bildschirm siehst. Denn ich sehe nicht das du entweder die Rechtecke oder Bilder( Pacman) sichtbar machst.
Ich glaube aber das die letzte Wand Zeile nicht angezeigt wird.
Das Fester ist 600 Pixel ein Rechteck ist 30 x 30 und er will es auf 21 ausgeben. 600:30 sind nur 20 möglich.
Auch bei 800 : 30 bei 27 Teilen wird das rechte schmäler sein.
Außer er hat irgendwo die grösse der Zeichen Fläche überschreiben. Im Code ist es aber auf Defaut 800 x 600
Aber so wie ich es zuvor hatte, den Richtungwechsel(mit den Richtungen usw) müsste es doch theoretisch auch passen. Ich muss es nur noch schaffen dass er die Schneidung der Rechtecke prüft. Das muss doch auch irgendwie funktionieren ohne dass ich viel hinzufüge, oder? Ich muss in dem Projekt nicht effizient coden, sondern so, dass es funktioniert. Außerdem sollten wir möglichst wenig Methoden benutzen. Das Tick ist dann die andere Frage, mit der ich mich danach auseinandersetzen muss.
Code bitte in Code-Tags schreiben. Also am einfachsten mit Hilfe des Knopfes </> links oberhalb des Eingabebereiches.
Und das sieht doch schon gut aus. Das müsste so funktionieren. Wobei Du den Counter auch weglassen könntest und an der Stelle des Counter++ hast würde ein return true; kommen.
Code bitte in Code-Tags schreiben. Also am einfachsten mit Hilfe des Knopfes </> links oberhalb des Eingabebereiches.
Und das sieht doch schon gut aus. Das müsste so funktionieren. Wobei Du den Counter auch weglassen könntest und an der Stelle des Counter++ hast würde ein return true; kommen.
Guten Tag, ich habe in der Zwischenzeit einiges geschafft. (Pacman bewegt sich mit Pfeiltasten, Geister bewegen sich random (funktioniert noch nicht so gut)
Nun wollte ich fragen, ob jemand mir erklären kann wie folgendes Funktioniert: (Für BlueJ: Datei im Anhang)
Wie bringe ich folgenden Ablauf hin. (Mithilfe Methode tick)
1. bevor das Spiel Startet soll ein Sound kommen (pacman_beginning.mp3)
2. soll sich pacman bewegen
3. Geister bewegen
4. Prüfungen ob geist gefressen wurde (wenn pacman unverwundbar) , oder ob pacman gefressen wurde (wenn geist verwundbar) -> Game Over ( bei meiner Version von Pacman hat pacman nur 1 leben und wenn alle kleinen Punkte aufgefressen worden sind, kommt ein neues Level. Es geht nicht um den HIGHSCORE der punkte)
5. Wieder Bewegen... usw... (pacman, geister)
6. Wenn großer punkt gegessen wurde, soll für 10sekunden der pacman unverwundbar sein.
7. Falls alle Punkte gegessen wurden sollen die Wände verschoben werden (von level1 zu level2)
-> pacman zu start
-> Geister zu Start + mehr geister
-> punkte wieder setzen
Punkt 1, 4, und 6,7 kann ich ja nicht bei tick reinschreiben, da dies sonst nach jedem durchlauf passieren würde.
Vielen Dank. Ihr könnt es gerne in der Datei testen.
Vielleicht habt ihr auch noch andere Tipps zu meinem Projekt
Die Punkte 4, 6 und 7 finden in der Schleife statt - aber enthalten natürlich eine Bedingung, die du prüfst. Aber das musst Du ja bei jedem Schleifendurchlauf prüfen.
1 ist ja etwas, das nur einmal passieren soll - daher musst Du das an der Stelle schreiben, bei der Du das Spiel startest.
Du hast zwar den Ticker in der Klasse Labyrinth überschrieben, aber gesetzt gestartet hast du ihn nicht.
Das musst du in der Klasse Spiel machen. damit der Ticker überhaupt tickt.
Java:
public SPIEL( int breite , int hoehe , boolean punkteLinks , boolean punkteRechts , boolean maus )
{
//Zaehler fuer Tick, Tack, ...
zaehler = 0;
anzeige = new AnzeigeE( breite , hoehe );
//animationsManager = AnimationsManager.getAnimationsManager();
//Punkteanzeige
anzeige.punkteLinksSichtbarSetzen( punkteLinks );
anzeige.punkteRechtsSichtbarSetzen( punkteRechts );
//Maus ggf. aktivieren
if ( maus )
{
anzeige.klickReagierbarAnmelden( this , true );
}
//Tastatur
anzeige.tastenReagierbarAnmelden( this );
//Ticker
//Alle 500 Millisekunden (=Jede halbe Sekunde) ein Tick
//anzeige.tickerAnmelden(this, 500);
}
In der Klasse Geist erstellst du einen Neuen Pacman das ist falsch denn das ist ein anderer als den, den du Labyrinth Klasse erstellt hast. Wirst somit nicht prüfen können ob der Geist den richtigen Pacman frisst. Da müsstest du dem Geist schon den Richtigen Pacman mitgeben.
Oder eben die Steuerung auch in der Labyrinth Klasse machen.
Bei dem Level ist es das gleiche das ist nicht die geiche Instanz wie die die du in der Labyrinth Klasse erstellt hast .
In der Klasse Geist erstellst du einen Neuen Pacman das ist falsch denn das ist ein anderer als den, den du Labyrinth Klasse erstellt hast. Wirst somit nicht prüfen können ob der Geist den richtigen Pacman frisst. Da müsstest du dem Geist schon den Richtigen Pacman mitgeben.
Oder eben die Steuerung auch in der Labyrinth Klasse machen.
Bei dem Level ist es das gleiche das ist nicht die geiche Instanz wie die die du in der Labyrinth Klasse erstellt hast .
dein Layout schaut leider immer noch so schlecht aus. Ja, ich weiß, jedoch macht ein Freund von mir diese Labyrinths. Er ist aber noch nicht dazu gekommen. Morgen jedoch ist ein vollständiges Level mit den Wänden vorhanden. Der untere Rand wird irgendwie nicht angezeigt, obwohl da normal Wände sein müssten.