Ergebnis 1 bis 17 von 17

Thema: RMXP > Ruby-Script: Bräuchte Hilfe bei grafischem Menu-Window!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat von Lil_Lucy Beitrag anzeigen
    Punkt 1 ist: Scheinbar gibt er beim Anzeigen des Bildes im Fenster noch etwas Spielraum an den ändern, soll heißen: Ein Fenster mit den Maßen 320x240 Pixel zeigt ein Bild mit den gleichen Maßen nicht deckungsgleich über dem Fenster an. Kann mir jemand bitte sagen, warum und vor allem, wie groß der Abstand genau ist, damit ich das kompensieren kann?
    Die Window-Klasse besitzt zwei Attribute, "ox" und "oy", diese beiden Attribute geben eine Verschiebung des contents in pixeln an. Mit ox kannst du die contents nach links schieben; mit oy nach oben. Um jeweils nach Rechts / Unten zu schieben musst du entsprechend negative Werte verwenden.
    Im Moment hast du die linke obere Ecke deines Bildes an dem Punkt (0, 0). Du willst aber, dass das Bild in der Mitte des Fensters zentriert wird. Dafür brauchst du eine kleine Rechnung; denk kurz darüber nach, vielleicht kommst du ja von selbst drauf.
    Hier ein kleiner Tipp, du kannst die Attribute "width" und "height" sowohl von der Window-Klasse als auch von den contents verwenden.
    Sprich:
    Code:
    self.width
    gibt die Breite des Fensters in Pixeln an, und
    Code:
    self.contents.width
    gibt die Breite des Bildes für das Item in Pixeln an. Natürlich muss das Bild dafür davor gesetzt worden sein.

    Zitat Zitat von Lil_Lucy Beitrag anzeigen
    Punkt 2: Wie kann ich bei "set_item" noch eine Abfrage einbauen ob eine Datei mit dem Namen der Icon-Grafik tatsächlich im Picture-Ordner liegt? Möchte gerne eine Platzhalter-Grafik anzeigen lassen, wenn das nicht der Fall ist, statt einer Fehlermeldung mit Programmabbruch. Ist hauptsächlich für Testspiele während der Entwicklung, wenn ich noch nicht für jedes neue Item ein passendes Bild habe.
    Leider ein kleines bisschen kompliziert.
    Damit du dies in Ruby überprüfen kannst musst du das Modul "FileTest" verwenden. Das Modul besitzt eine Methode namens "exists?" welche überprüft, ob eine Datei existiert oder nicht.
    Diese Methode benötigt jedoch einen Dateipfad als Parameter.

    Hier ein kleines Code-Schnipsel um nach einem Picture zu prüfen:
    Code:
      def set_item(item)
        if item != @item
          @item = item
          path = "Graphics/Pictures/"+item.icon_name+".png"
          # Prüft ob das Picture im Picture-Ordner existiert oder nicht
          if FileTest.exists? (path)
            self.contents = RPG::Cache.picture(item.icon_name) # Lädt ein Picture aus dem Picture-Ordner
          else
            self.contents = Bitmap.new(1, 1) # erstellt ein neues, leeres Bitmap
          end
        end
      end
    Vielleicht hilft dir das ja weiter.

  2. #2
    O.K. Also die Methode von Cepanks, mit dem "rescue", hat super funktioniert. Das haut schon mal hin, danke

    Allerdings bin ich bei Punkt 1 noch dezent überfordert
    Ich weiß leider nicht so recht was ich mit "ox" und "oy" anfangen soll, weil, ich seh nicht, wo ich die ändern kann. Muss an der Stelle auch zugeben, dass ich nie so recht dahinter gestiegen bin, was Methoden wie "self" oder "super" eigentlich genau machen.
    Mir würde es ja reichen zu wissen wie viele Pixel der Toleranzrahmen in einem Fenster beträgt, bzw. wie sich das errechnet, dann könnt ich zur Not die Bilddatei von vornherein anpassen.

    Tut mir Leid, wenn ich mich da grade etwas blöd anstelle, aber wie gesagt, mein gesamtes Verständnis von Programmierung basiert mehr oder weniger auf "Pfusch and Error" ^^"

  3. #3
    "ox" und "oy" sind Attribute die jedes Window besitzt. Alle Attribute werden auf die gleiche Art und Weise verwendet. Du kannst den Wert eines Attributes setzen mit "self.attribute = value" wobei "attribute" der Name des Attributs ist, und "value" ein Wert, welcher dem Attribut zugewiesen werden soll.
    Zum Beispiel:
    Code:
    self.ox = 156
    self.oy = self.height / -3
    Dabei ist zu beachten, dass das "self" auch weggelassen werden kann, allerdings ist es sicherer es anzugeben um Namenskonflikte zu vermeiden.

    Das Schlüsselwort "self" sagt einfach aus, dass dein Code sich auf "dieses" Objekt bezieht. In dem Fall des Fensters halt auf das Fenster in welchem der Code gerade ausgeführt wird.
    Wörtlich: Das Fenster verändert seine eigenen Attribute und nicht die Attribute von einem anderen Fenster wenn du "self" verwendest.

    Das "super" bedeutet, dass du Code an die Oberklasse delegierst. Hier kommt ein Konzept zum Einsatz, welches in der Programmierung als Polymorphie bezeichnet wird und relativ kompliziert ist.
    Im Grunde beschreibt es ein Konzept um eine Klasse um Zusatzfunktionen zu erweitern. Zum Beispiel ist unser Window_Preview eine Unterklasse von Window_Selectable. Was das bedeutet ist, dass unser Window_Preview auch ein Window_Selectable ist, aber ein spezielleres.
    Da das Window_Preview ein Window_Selectable ist erbt es alle Attribute und Funktionen eines Windows. Unter anderem erbt es "ox" und "oy", aber auch vieles mehr.
    Wenn du an einer Stelle "super" verwendest dann sagst du explizit, dass du die Funktionalität der Oberklasse haben möchtest und eben nicht von der Klasse selbst, welche du gerade schreibst. Man benutzt es in der Regel nur, wenn man eine Funktion der Oberklasse erweitern will und die alte Funktion vollständig beibehalten möchte.

    Zum Beispiel unser "super(x, y, width, height)" in der Methode "initialize" sagt aus, dass wir an dieser Stelle die Methode "initialize" von Window_Selectable aufrufen möchten.
    Aber ich glaube das wird ein bisschen zu viel Theorie für einen Anfänger.

  4. #4
    Zitat Zitat
    Das Fenster verändert seine eigenen Attribute und nicht die Attribute von einem anderen Fenster wenn du "self" verwendest.
    Aber sollte das nicht sowieso immer implizit so sein? Ich frag nach, weil ich das self von Ruby auch nicht so wirklich durchschaue. In der Methode wird ja kein anderes contents benutzt.

  5. #5
    Nicht immer. Z.B. im Code von Cornix' letzten Beitrag ist es ein Muss. Wie soll Ruby ohne self hier zwischen Aufruf einer Methode und Zuweisung an eine lokale Variable unterscheiden? Andere Programmiersprachen wie C++ haben ein ähnliches Problem (Paramater vs. member variable), jedoch bevorzuge ich das Schreiben eines Schlüsselwortes (self oder this) anstatt eines Unterstriches am Ende des Bezeichners.

    contents.width anstatt self.contents.width zu schreiben ist jedoch okay (und in RGSS 1 und 2 vernachlässigbar schneller). Manche Leute bevorzugen es eben explizit oder wissen es nicht besser, weil die Standardskripte es so machen.

  6. #6
    Zitat Zitat von Kelven Beitrag anzeigen
    Aber sollte das nicht sowieso immer implizit so sein? Ich frag nach, weil ich das self von Ruby auch nicht so wirklich durchschaue. In der Methode wird ja kein anderes contents benutzt.
    Ja, es ist implizit so und kann meistens weg gelassen werden, allerdings wenn man einmal in eine Situation gerät wo man es braucht um einen Namenskonflikt auf zu lösen und es vergisst hat man sehr schnell einen Bug in seinem Code.
    Für einen Anfänger würde ich daher ersteinmal empfehlen immer das Schlüsselwort "self" zu verwenden, einfach um sicher zu sein.

    @Lil_Lucy
    Es freut mich, dass du dein Problem lösen konntest.

  7. #7
    Zitat Zitat von Cornix Beitrag anzeigen
    "ox" und "oy" sind Attribute die jedes Window besitzt. Alle Attribute werden auf die gleiche Art und Weise verwendet. Du kannst den Wert eines Attributes setzen mit "self.attribute = value" wobei "attribute" der Name des Attributs ist, und "value" ein Wert, welcher dem Attribut zugewiesen werden soll.
    Zum Beispiel:
    Code:
    self.ox = 156
    self.oy = self.height / -3
    Dabei ist zu beachten, dass das "self" auch weggelassen werden kann, allerdings ist es sicherer es anzugeben um Namenskonflikte zu vermeiden.

    Das Schlüsselwort "self" sagt einfach aus, dass dein Code sich auf "dieses" Objekt bezieht. In dem Fall des Fensters halt auf das Fenster in welchem der Code gerade ausgeführt wird.
    Wörtlich: Das Fenster verändert seine eigenen Attribute und nicht die Attribute von einem anderen Fenster wenn du "self" verwendest.

    Das "super" bedeutet, dass du Code an die Oberklasse delegierst. Hier kommt ein Konzept zum Einsatz, welches in der Programmierung als Polymorphie bezeichnet wird und relativ kompliziert ist.
    Im Grunde beschreibt es ein Konzept um eine Klasse um Zusatzfunktionen zu erweitern. Zum Beispiel ist unser Window_Preview eine Unterklasse von Window_Selectable. Was das bedeutet ist, dass unser Window_Preview auch ein Window_Selectable ist, aber ein spezielleres.
    Da das Window_Preview ein Window_Selectable ist erbt es alle Attribute und Funktionen eines Windows. Unter anderem erbt es "ox" und "oy", aber auch vieles mehr.
    Wenn du an einer Stelle "super" verwendest dann sagst du explizit, dass du die Funktionalität der Oberklasse haben möchtest und eben nicht von der Klasse selbst, welche du gerade schreibst. Man benutzt es in der Regel nur, wenn man eine Funktion der Oberklasse erweitern will und die alte Funktion vollständig beibehalten möchte.

    Zum Beispiel unser "super(x, y, width, height)" in der Methode "initialize" sagt aus, dass wir an dieser Stelle die Methode "initialize" von Window_Selectable aufrufen möchten.
    Aber ich glaube das wird ein bisschen zu viel Theorie für einen Anfänger.
    O.K. bin zwar nicht sicher ob ich alles jetzt so wirklich verstanden habe, aber funktioniert hat es und ich hab jetzt ein akzeptables Ergebnis. Ich guck mir das morgen nochmal an und seh dann ob ichs noch etwas feiner hinkrieg, aber jetzt geh ich erstmal ins Bett.

    Danke soweit und bis zum nächsten Problem

    MfG

    Lil_Lucy

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •