YAYI Danke ^^
Der Mauszeiger funktioniert wunderbar
Nur habe ich jetzt ein weiteres Problem.
Die Arrays liegen in einer privaten Methode... wie komme ich denn jetzt da an die Bilder?^^"
Habs ja erst versucht indem ich dafür auch ein neues Objekt der Klasse angelegt habe und dann auf die Methode zugreife... aber ist halt unzulässig.
Zeig mal, was du versucht hast.
Deine Arrays liegen ja eigentlich nicht in einer privaten Methode, sondern als Instanz-Variablen deiner Klasse vor. Du kannst...
... der Klasse eine Methode hinzufügen, welche die Arrays ausgibt (lesender Zugriff) oder eine Methode mit Parameter hinzufügen, welche das Array dann verändert (schreibender Zugriff). In dem Fall könntest du dann per $game_system.memory.METHODEN_NAME(PARAMETER) auf die Methode zugreifen.
... die Arrays als Attribut-Reader (falls nur lesender Zugriff benötigt wird) oder Attribut-Accessor (falls auch schreiben drauf zugegriffen werden muss) deklarieren. In dem Falle könntest du dann per $game_system.memory.ARRAY_NAME auf das Objekt zugreifen.
Folgende Methode habe ich unter der Klasse "Game_Memory" und unter der Methode "initialize"
Ich hoffe mal... dass das so funktioniert. (anscheinend nicht... wie du unten sehen wirst bei der Fehlermeldung)
So... hier hakt es dann halt.
Wo es rot makiert ist.
Zitat
Script 'Memory_3' line 353: ArgumentError occurred.
wrong number of arguments (1 for 0)
...
Vermutlich habe ich nicht wirklich verstanden was du mir eben geschrieben hast ._.
Scheint, als hättest du die Teile aus Linkeys Antwort irgendwie zusammengemixt.
Vergleiche mal, wie du die Methode geschrieben hast, und wie du sie aufrufen willst. Es wird versucht @wrapper als Parameter zu übergeben, die Methode akzeptiert aber gar keine Parameter. Du willst an dieser Stelle aber nichts überschreiben (was denn auch?) oder sonst was tun, wofür ein Wert aus nötig wäre. Also weg damit.
Nächste Baustelle:
Was passiert hier? So wie du es geschrieben hast, besitzt jetzt jetzt Game_Memory die Instanzvariablen @wrapper, @names, @sound, @figure_wrapper, @figure_names, @sound_names. Macht keinen Sinn, oder? Du willst die Sachen ja von außerhalb nutzen, jetzt haben wir hingegen die Arrays in doppelter Ausführung in Game_Memory.
Weil Ruby aber immer den letzten Wert aus einer Methode zurück gibt, hat es tatsächlich auch was in deine @h-Variable geschafft. Die würde jetzt das Array mit den Sound-Namen enthalten, allerdings auch nur dieses eine Array.
Wenn du alle drei haben willst, kannst du die Methode so umschreiben, dass sie ein "Array mit Arrays" liefert.
Dann die andere Variante, die Linkey vorgschlagen hat. Wenn du dir schon mal die anderen Klassen im Maker angesehen hast, bist du da bestimmt schon darüber gestolpert. Damit kannst du den Zugriff auf Instanzvariablen nach außen hin erlauben, ohne explizit Methoden dafür zu schreiben.
Entweder nur lesbar: attr_reader :figure_wrapper, :figure_names, :sound_names
nur schreibbar: attr_writer :figure_wrapper, :figure_names, :sound_names (macht in deinem Fall gerade keinen Sinn)
Oder les- und schreibbar: attr_accessor :figure_wrapper, :figure_names, :sound_names
Schau mal in Game_Memory in die 4. Zeile, auf @figure_names ist sogar schon zugreifbar.
Das Endergebnis sollte also so aussehen.
--
"Banjo, you're a BEAR... and I will teach you... THESE MOVES!"
Ja, so kann es nicht funktionieren.
Du rufst die Methode "get_arrays" von $game_system.memory auf (eine Instanz von Game_Memory), was erst einmal okay ist.
Wenn du dir die Methode "get_array" aber einmal anschaust, so hat diese keine Parameter. Du versucht den Aufruf aber mit einer Parameterübergabe (@wrapper) durchzuführen. Dies kann nicht funktionieren, da "get_array" kein Parameter vorsieht. Daher der Fehler "wrong number of arguments" - welcher aussagt, dass du zuviele oder zuwenige Parameter übergeben hast.
Deine Methode würde aber auch nicht das geben, was du willst. Deine Methode hat kein "return"-Statement. Deshalb würde der letzte Wert zurückgegeben werden. D.h. in deinem Fall, dass dein @h das Ergebnis von "
@sounds = @sound_names" zugewiesen bekommt. Du könntest die Methode wiefolgt schreiben:
In deine andere Methode, die diese Werte erhalten soll, schreibst du dann anstelle von "@h = ..." (namen der variablen sind nur beispiele:
Edit:
Ach, 1-2 Minuten zu langsam. Hätte ich mal nicht gegessen
Edit 2:
Da hat Gepanks dir das noch einmal ausführlich erklärt. Nur der Vollständigkeit wegen:
Wie Gepanks schon sagt, kannst du das return statement weglassen (warum du es nicht machen solltest, habe ich ja bereits erwähnt und anhand deiner Fehler hast du ja auch gemerkt, was durch dieses Weglassen alles schiefgehen kann ). Du könntest die Klammern beim Return auch weglassen, Ruby gibt die Werte automatisch als Array zurück, wenn diese durch Komma getrennt angegeben sind.
Solltest du die Werte auch nur in der Methode "navigate" benötigen, brauchst du auch nicht unbedingt Instanzvariablen (bspw.: @figure_names = $game_system.memory.figure_names), sondern kannst einfache temporäre Variablen nehmen (bspw.: figure_names = $game_system.memory.figure_names).
Wie gesagt, es empfiehlt sich, gerade am Anfang, das Coding so zu schreiben, dass du auch nicht den Überblick verlierst. Daher solltest du den Code nur dort vereinfach schreiben, wo du dir auch sicher bist, was du da machst
Ich versuche gerade mein Konstrukt im Kopf zu entwirren...
Also jetzt wo ich da alles so schön bei sammen habe, rufe ich ja die Klasse "Memory_Picture_Changer" auf, um dort eben die Bilder zu aktualisieren. Leider habe ich dort weder die Namen noch die IDs zur Verfügung welche ich mitlerweile in der Klasse "Memory_Game_Navigate" relativ einfach herraussuchen kann. Wäre es nicht an und für sich logischer das in einem Rutsch zu erledigen, oder ist es besser das in verschiedenen Klassen zu lassen?
So wie ich es nun gedacht habe, also mit getrennten Klassen, stolpere ich wiedermal darüber, dass ich an Werte von Variablen rankommen muss (@pic_ID1 und @pic_ID2). Um dann die Werte der beiden Variablen wieder auf -1 und -2 zu setzen wenn ich kein Paar gefunden habe und sie an "Memory_Game_Navigate" senden muss. (für mich als Anfänger klingt das nach viel böser Arbeit...)
Hinzukommt... das ich eh "update_graphics()" aufrufe um mein Array zu aktualisieren, wobei ich mich da auch gerade frage... arbeite ich da überhaupt auf dem "richtigen" Array? So wie ich das bis jetzt verstanden habe, würde das Array der Methode nicht die Bohne verstehen was ich eigentlich von ihm will und einfach das ausgeben, was es eh schon die ganze Zeit über hatte, unverändert versteht sich.
Ich hab ja auch mit dem Gedanken gespielt einfach "Memory_Picture_Changer" von "Memory_Game_Navigate" erben zu lassen, dann sollte ich ja an die aktuellen Werte rankommen.... dachte ich. Hilft mir leider auch nicht dabei weiter, wie ich "Memory_Game_Navigate" sage, dass die beiden Variablen nun wieder ihre Ursprungswerte haben.
Kann jemand meinen armen Kopf entwirren?
Momentan sieht das Ganze wie folgt aus:
(Klar, das wirft noch Fehler wenn man was anklickt, weil Variablen in der Klasse "Memory_Picture_Changer" fehlen.)
Bin gerade nicht so fit, deshalb habe ich deinen Text nur kurz überflogen. Ich hoffe, ich habe es richtig gelesen.
Die @pic-Variablen setzt du zwar in der Navigate Klasse, brauchst die dort aber praktisch gar nicht, wenn ich das richtig überflogen habe.
Wie wäre es, wenn du die ID einfach übergibst? Du könntest deine "change_card"-Methode anpassen:
Die Methode rufst du dann in deiner Navigate-Klasse so auf:
Edit:
Bezüglich der Klassen:
Du kannst tatsächlich auf weniger Klassen zugreifen. Generell ist es ein guter Gedanke, Dinge in einzelne Klassen zu packen. Der Maker macht es ja auch so:
Für einzelne Ausgaben gibt es Window_Klassen. Für die Steuerung über diese Menüs dann die Scene_Klassen.
Wenn du allerdings an einen Punkt kommst, an dem du nicht mehr weiter kommst, du permanent Werte hin- und herschieben musst und jegliche Übersicht verlierst, solltest du vielleicht ein bisschen weniger auslagern.
Hm ne, ich denke nicht dass das so geht.
Ich habe dann ja am Anfang der Methode (pID1 und pID2) in denen "nil" drin steht, wodurch das Programm abschmieren wird. (Habe es auch ausprobiert, dass Programm schmiert ab)
Zudem hast du recht, ich brauche in meiner "Memory_Game_Navigate" Klasse die pic_ID1 und pic_ID2 nicht, ermittel sie jedoch dort um sie an "Memory_Picture_Changer" zu senden um dort mit den Werten arbeiten zu können.
Ergo... müsste ich dann nicht auch einen Aufruf aller:
machen, damit ich mit den aktuellen Werten in "Memory_Picture_Changer" arbeiten kann?
Weil ich brauche ja dort die Werte.
Edit:
hum, er schmiert ab... unschön. "wrong number of arguments" ... habs mir wohl leichter gedacht als es ist....
Edit2:
Gut, hätte es mir denken können, ich arbeite ja nun nur mit "nil"... weil ja nirgends irgendwo etwas drin steht. Bedeutet, ich müsste es einmal mit den -Werten in Navigate anlegen und mir dann eine Variable anlegen, die ich erhöhe wenn ich Werte in pic_ID1 und pic_ID2 stehen habe.
Dann arbeite ich mit einer if-Abrage um mir am Anfang die Minuswerte wieder zu holen... und setze die Variable wieder auf 0 oder so...
Irgendwie kommt es mir so vor als hätte ich noch einen Denkfehler darin.
Sicher, dass es nicht ging? In der Intial-Methode hast du @pic_ID1 und @pic_ID2 auf Minuswerte gesetzt (hier dein Code):
Dadurch sind die Variablen ja erst einmal gesetzt.
Nun rufst du die Changer-Methode "change_card" auf, und übergibst ja die IDs. Dementsprechend sind diese Variablen nicht nil. Sicher, dass es dewesegen abgeschmiert ist? Wenn ich mir deinen Code anschaue, sind dort einige andere Fehler drin, die das Programm zum Abschmieren bringen können (update_graphics() rufst du im change_card auf, obwohl diese Methode gar nicht der Klasse Pic_Changer bekannt ist....).
Welche Fehlermeldung hast du erhalten, als du versucht hast die Werte zu übergeben? Gib mir mal den Code davon, dann schaue ich mir das heute nach der Arbeit mal an.
Edit:
Noch einmal kurz als Erklärung. Du ermittelst in Klasse A die Variablen ID1 und ID2 und brauchst diese in Klasse B. Wenn du von Klasse A aus die Klasse B aufrufst (in deinem Fall die MEthode change_pic), macht es dann sinn, die Variablen an dieser Stelle zu übergeben. Daher rufst du von deiner Klasse aus die "change_pic" Methode mit den Variablen auf (change_pic(ID1,ID2)). Und nicht umgekehrt.
Zu dem Aufruf. Sollte der dann nicht eigentlich so aussehen?
Weil change_card gibt ja @pID1 und pID2 zurück, oder sind die Bezeichner der Variablen in so fern irrelevant und Ruby weiß schon was es tun soll?
Wobei ich andere Fehler je nach Variante bekomme...
Wenn ich [@pic_ID1,@pic_ID2 = @pic_changer.change_card(@pic_ID1,@pic_ID2)] nutze, dann bleibt oben links in der Ecke mein Mauszeiger kleben... zumindest Einer. Einen anderen kann ich munter über die Karten bewegen.
Klicke ich dann etwas an, findet er in Zeile 423 einen Fehler (Wrong number of arguments (0 for 2)).
Das wäre dann der Befehl "@pic_changer.change_card()" in der Methode "def navigate".
Wenn ich [@pic_ID1,@pic_ID2 = @pic_changer.change_card(@pID1,@pID2)] nutze, dann bekomme ich eine mja... gravierendere Fehlermeldung.
"line288 type error occurred. no implicit conversion from nil to integer".
Dabei handelt es sich dann um die Zeile "@c = f_names[pID1]" aus der Methode "change_card". Kann natürlich mit einem vorher falsch ausgeführten Befehl zusammen hängen.
Momentan sieht der Code wie folgt aus:
Sorry dass der Code erst jetzt kommt
Ich esse jetzt gleich erst einmal und bin noch was unterwegs, schaue mir das aber später noch an und editiere es hier rein. Erst einmal zur ersten Zeile vorab:
Beim Aufruf einer Methode, übergibst du nicht die Variable an sich, sondern den Wert, den sie besitzt. Beispiel:
Das ist bei Methoden mit Rückgabenwerte auch so. Es ist "egal", wie die Variablen in der aufrufenden Methode heißen.
Edit:
Was mir direkt aufgefallen ist,du hast anstelle einer Init-Methode deine ganzen Befehle in die navigae Methode gehauen. D.h, immer wenn die Methode aufgerufen wird, erstellst du neue Game_Memory, Memory_Picture_Changer Objekte. Das sieht falsch aus. Pack das mal in eine Init-Methode. Ich kann es aber wie gesagt später noch korrigieren, wenn ich die Zeit dafür habe.
Edit2:
So, gerade fertig gegessen. So sollte deine Navigate Klasse dann mit den Korrekturen aussehen (warum du plötzlich in allen Methoden Objekte der "Memory_Klasse" anlegst, habe ich übrigens nicht verstanden):
Danke für die schönen Änderungen in meiner Klasse Linkey :3
@Edit 2:
Öhm... teilweise zum herumprobieren. Zudem muss ich ja zumindest in der Methode "change_card" auf die Methode "update_graphics" zugreifen, welche in Game_Memory liegt.
Mag sein das da wieder ein Denkfehler meinerseits vorhanden ist.
Mjoar, hm, aber was ich gerade wirklich nicht verstehe ist ein Fehler in folgender Zeile:
Da soll jetzt irgndwo was "nil" sein, also irgendwo herrscht gähnende Leere... ich sehe aber rein gar nichts, dass hier leer sein könnte.
Zitat
undifined method `map!' for nil:NilClass
...
Was ich mir noch vorstellen könnte wäre, dass das Programm nicht so ganz mit "map" klar kommt.
Dann stellt sich aber bei mir die Frage, wie überschreibe ich denn dann die Einträge in dem Array?
@f_wrapper selbst ist nil. In deiner Methode "navigate" sehe ich eigentlich auch nur eine lokale Variable f_wrapper, also ohne @. Wo kommt denn der Aufruf, der im Code-Block steht?
Noch was. Das "flatter" sollte vermutlich flatten heißen? Außer du hast irgendwo eine Methode "flatter" für die Array-Klasse geschrieben, dann passt es.
--
"Banjo, you're a BEAR... and I will teach you... THESE MOVES!"