RPG-Maker Quartier

Hier dreht sich alles um die RPG-Maker-Reihe von ASCII/Enterbrain. Der RPG-Maker ist ein Tool, mit dem du dir dein eigenes kleines Rollenspiel erstellen kannst. Du findest hier alles, was du dazu brauchst. Aber natürlich umfasst die Community noch mehr!
Aktuelle Zeit: Mi Sep 18, 2019 5:24

Alle Zeiten sind UTC + 1 Stunde



Mitglieder in diesem Forum: Google [Bot] und 1 Gast



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
Offline
Alex
Alex
Benutzeravatar
Beiträge: 16
 Betreff des Beitrags: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 1:21 
Huhu, ich kenne mich noch immer nicht gut genug in Ruby aus...

Ich möchte mehrere kleine Punkte (Grafiken) aufrufen für ein Skillpunkte Menü.
Da es aber relativ viele (50 +) sind möchte ich das ganze etwas vereinfachen... mit einer Schleife.
Die Bilder sollen alle den selben Namen mit einer unterschiedlichen ID haben.
Die Bilder einzelnd zu erschaffen wäre ja kein problem, allerdings mühsam.

Bild

Funktioniert so nicht, sonst wäre ich ja nicht hier aber ich hoffe es wird ersichtlich was ich gerne machen möchte.
Das problem liegt an $Skill[i] <- Wie bekomme ich das hin mit hilfe einer Variable den Namen des Sprites / Bildes zu "erhöhen".
5 Skillpunkte neben einander anzeigen mit der ID 1-5.

Danke. =)


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Official Oldschool
Official Oldschool
Benutzeravatar
Beiträge: 8917
Alter: 30
Wohnort: BRD, Thüringen
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 15:04 
Das ist schon so richtig. Ich vermute mal, du hast deinen Array nur noch nicht angelegt.
Code:
class Sprite_SheetPictures < Sprite
  def initialize viewport=nil
    super viewport
    @sprites = [] # lege neuen Array an
    refresh
  end

  def refresh
    @skills.each {|skill| skill.dispose} # entferne alle Bilder
    @skills.clear # leere den Array

    if $game_variables[79] == 0
      (0...5).each {|index| # iteriere von 0 bis 4. Äquivalent zur unüblicheren for i in 0...5
        sprite = Sprite.new # erzeuge neuen sprite
        sprite.bitmap = RPG::Cache.picture("Skillpointfull")
        sprite.x = 90 + 30*index # statt xr jedes Mal zu erhöhen, kannst du es direkt aus dem index berechnen
        sprite.y = 100
        sprite.zoom_x = sprite.zoom_y = 0.5
        @sprites << sprite # füge Sprite in Array ein. Äquivalent zu @sprites[index] = sprite
      }
    end
  end
end


Hab den Code ja dokumentiert, aber nochmal die wichtigen Punkte:
- keine globalen Variablen nutzen! (sind die Variablen, die mit $ anfangen). Stattdessen Instanzvariablen verwenden (fangen mit @ an).
- Am besten alle Variablen in der initialize Methode mit einem Wert belegen
- Sprites löschen (dispose), wenn sie nicht mehr gebraucht werden. Andernfalls werden sie weiterhin angezeigt
- Achtung: Arrays fangen in Ruby mit dem Index 0 an. Solltest also nicht von 1 bis 5 sondern von 0 bis 4 iterieren
- 0..5 heißt: 0,1,2,3,4,5. Dagegen 0...5 (ein Punkt mehr) heißt: 0,1,2,3,4. Oder genauer: 0 bis kleiner 5.

Tipp: Schau dir mal Window_Selectable an. Das macht evtl. schon einiges von dem was du machen willst.

_________________


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Alex
Alex
Benutzeravatar
Beiträge: 16
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 19:55 
Hallo, danke für die Antwort und deine Hilfe.

Das script funktioniert, allerdings nur wenn ich

Code:
@skill.each {|skill| skill.dispose} # entferne alle Bilder
@skill.clear # leere den Array


auslasse.

bei den beiden Codezeilen bekomme ich folgenden Error:

Script 'test' line 10 NoMethodError occurred, undefined method èach' for nil:NilClass.

Das selbe für clear.

Vieleicht übersehe ich etwas offentsichtlichen ^^
Ich konnte auch nicht enträtzeln was genau diese beiden codezeilen machen und wie die Bilder dann zu disposen sind.


/Edit: Kanns sein das da stehen muss?:

Code:
@sprites.each {|skill| skill.dispose} # entferne alle Bilder
@sprites.clear # leere den Array


Ne kurze erklärung wie genau die Bilder nun heißen und wie sie zu disposen sind und was genau diese stelle macht wäre toll, will ja noch was lernen :)


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Official Oldschool
Official Oldschool
Benutzeravatar
Beiträge: 8917
Alter: 30
Wohnort: BRD, Thüringen
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 21:03 
Zitat:
/Edit: Kanns sein das da stehen muss?:
Ja. Hab mich da verschrieben.

Zitat:
Ne kurze erklärung wie genau die Bilder nun heißen und wie sie zu disposen sind und was genau diese stelle macht wäre toll, will ja noch was lernen

Wie du die Variable nennst ist dir überlassen. Das disposen geht mit der Methode dispose und lässt die Bilder vom Bildschirm verschwinden. Die Methode clear löscht alle Elemente aus einem Array, so dass dieser wieder zu einem leeren Array wird. Die Idee dabei ist eben, dass die refresh Methode erst alle Skill-Bilder, die eventuell noch angezeigt werden, löscht und danach von neuem Bilder für jeden Skill(?) anlegt.
Die Methode each ist einfach nur eine Schleife (so wie dein for). for-Schleifen sind in Ruby eher unüblich, darum benutze ich sie nicht. Andererseits werden in der RGSS auch viele For-Schleifen benutzt - von daher musst du wissen ob du each oder lieber for Schleifen benutzt. Beides ist weitgehend dasselbe.

Siehe Iteratoren für die Benutzung von each, und RGSS Grundlagen zur Benutzung von Sprites.

_________________


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Alex
Alex
Benutzeravatar
Beiträge: 16
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 21:41 
Hat mir schon viel geholfen alles :)

Clear und Dispose ist schon klar, was ich aber meine ist @sprites ist ja eine lokale variable, ich hatte vorher immer globale Variablen genutzt, dann konnte ich einfach in einem Event ein Script aufrufen und

Code:
$Bildxyz.dispose

schreiben und das Bild war weg. Mit den lokalen @ Variablen geht das ja denke ich nicht, wie bekomme ich also die Bilder duch ein Event wieder weg?^^

------------------
Das disposen innerhalb des Scripts mit
Code:
@sprites.each {|sprite| sprite.dispose}
funktioniert jetzt (wenn ich es ans ende des scripts setze werden keine Bilder angezeigt), da es ja ein Skill-menü ist wird es bei jedem Tastendruck aktualisiert bzw. neu aufgerufen. Somit ja auch die Skillpunkte-Bilder, denn es könnte sich ja etwas verändert haben.
Die Bilder werden jedoch immer nocheinmal aufgerufen (also wenn ich oft die Taste drücke habe ich viele Skillpunkte übereinander), ich weis noch nicht warum hier das dispose versagt.
/Edit: Kann es sein das nach jeden neuen Aufruf nochmal ein neues Array erschaffen wird und nicht das alte bearbeitet wird?


PS: Was ist so böse an Globalen Variablen?^^


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Official Oldschool
Official Oldschool
Benutzeravatar
Beiträge: 8917
Alter: 30
Wohnort: BRD, Thüringen
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 22:44 
Zitat:
funktioniert jetzt (wenn ich es ans ende des scripts setze werden keine Bilder angezeigt), da es ja ein Skill-menü ist wird es bei jedem Tastendruck aktualisiert bzw. neu aufgerufen. Somit ja auch die Skillpunkte-Bilder, denn es könnte sich ja etwas verändert haben.
Die Bilder werden jedoch immer nocheinmal aufgerufen (also wenn ich oft die Taste drücke habe ich viele Skillpunkte übereinander), ich weis noch nicht warum hier das dispose versagt.
Das ist schon der richtige Ansatz. Kannst du mal deinen Programmcode zeigen, dann sehe ich vielleicht warum es nicht funktioniert?

Zitat:
Die Bilder werden jedoch immer nocheinmal aufgerufen (also wenn ich oft die Taste drücke habe ich viele Skillpunkte übereinander), ich weis noch nicht warum hier das dispose versagt.
/Edit: Denke ich weis warum... es wird immer nur "sprite" disposed nicht @sprites welches das Bild letztendlich trägt.
Wenn du alle Sprites in dem Array disposed, sollten sie danach nicht mehr zu sehen sein.

Mal ins blaue geraten: Dein "aktualisieren" läuft so ab, dass du jedes Mal ein neues Skillmenü mit Sprite_SheetPictures.new anzeigst. Da das Disposen aber nur beim Aufruf der refresh Methode passiert und die refresh Methode deines vorherigen Sprite_SheetPictures nicht nochmal aufgerufen wird, hast du dann zwei Menüs. Aus dem Grund sollte dein Menü selbst auch noch eine dispose Methode haben:
Code:
class Sprite_SheetPictures < Sprite
 
  # ...
 
  def dispose
    @sprites.each {|sprite| sprite.dispose}
    @sprites.clear
  end
 
end


Die solltest du aufrufen, wenn du dein Menü ausblenden willst.

Aber es ist nicht nötig bei jedem "Aktualisieren" des Menüs ein neues Menü anzuzeigen. Ruf doch einfach die refresh Methode von neuem auf.

Code:
[EVENTCODE]
[SCRIPT] @skill_menu = Sprite_SheetPictures.new
[LOOP]
[CONDITIONAL BRANCH: Taste gedrückt]
[irgendwelche Änderungen an deinen Skills]
[SCRIPT] @skill_menu.refresh
[END LOOP]
[SCRIPT] @skill_menu.dispose
[SCRIPT] @skill_menu = nil


Zitat:
was ich aber meine ist @sprites ist ja eine lokale variable, ich hatte vorher immer globale Variablen genutzt, dann konnte ich einfach in einem Event ein Script aufrufen und [...] Mit den lokalen @ Variablen geht das ja denke ich nicht

Achtung: @ ist eine Instanzvariable, nicht lokal. Die Idee dahinter ist, dass du die "internen" Eigenschaften deines Menüs nicht von außen manipulieren kannst und musst. Es gibt gar keinen Grund ein einzelnes Bild im Skillmenü in einem Eventscript zu verändern oder auszublenden. Das Skillmenü sollte seine Bilder selbst verwalten. Du sagst z.B. nur dem Skillmenü "aktualisiere dich" und das Skillmenü sorgt selbst dafür, dass seine Grafiken entfernt, ausgewechselt oder geändert werden.

btw. wenn deine Variable als Instanzvariable in einem Event definiert wird, kannst du sie im selben Event (evtl. auch in anderen Events - kommt auf den Eventtyp an) wieder verwenden.

Zitat:
PS: Was ist so böse an Globalen Variablen?^^

Es gibt viele Nachteile: Sie können Speicherlecks erschaffen, es können Namenskonflikte auftreten, sie werden nicht automatisch abgespeichert (wodurch beim Neuladen Informationsverluste auftreten können). Der Hauptpunkt ist aber, dass sie zu einem schlechten Programmierstil führen. In der Objektorientierten Programmierung versucht man seine Daten und Programmfunktionen zu strukturieren bzw. zu kapseln. Da globale Variablen keinerlei Hierarchie oder Strukturierung kennen, ist das damit nicht möglich.

_________________


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Alex
Alex
Benutzeravatar
Beiträge: 16
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Mi Jul 31, 2013 23:29 
KD hat geschrieben:
Zitat:

Mal ins blaue geraten: Dein "aktualisieren" läuft so ab, dass du jedes Mal ein neues Skillmenü mit Sprite_SheetPictures.new anzeigst. Da das Disposen aber nur beim Aufruf der refresh Methode passiert und die refresh Methode deines vorherigen Sprite_SheetPictures nicht nochmal aufgerufen wird, hast du dann zwei Menüs. Aus dem Grund sollte dein Menü selbst auch noch eine dispose Methode haben:




Hehe richtig geraten, habe den Fehler erkannt und denke es sollte jetzt Funktionieren, wenn nicht schreibe ich morgen den Code hier rein, ist aber relativ viel.... :)

Vielen dank soweit, hat mir sehr geholfen. Hab auch ein paar Sachen gelernt =), man war ich doof.

Noch eine Frage fällt mir jetzt ein:

Code:
@sprites.each {|sprites| sprites.dispose}

Erlaubt es dir Bilder zu disposen wo noch keine sind, somit kann man das ganze ja refreshen, wenn ich das aber versuche dann sagt Ruby "du darfst nicht disposen was nicht existiert" oder so ;D
Habe nämlich noch ein paar andere Bilder in dem selben Skript die natürlich auch mit refreshed werden sollen und nicht immer neu gespawnt werden sollen.

Code:
def refresh
 @sprites.each {|sprites| sprites.dispose} # entferne alle Bilder #<--- zu diesem Zeitpunkt enthält @sprites noch kein Bild, wird aber disposed?!
 @sprites.clear # leere den Array
@Maske.dispos                                                                              # <-- möööb is nicht, das teil will nicht disposen weil kein Bild zum Disposen da ist.
 $game_variables[79] = 3
 
 
      (0...$game_variables[79]).each {|index| # iteriere von 0 bis 4. Äquivalent zur unüblicheren for i in 0...5
       # sprite = Sprite.new # erzeuge neuen sprite
        sprite = Sprite.new # erzeuge neuen sprite
        sprite.x = 90 + 14*index # statt xr jedes Mal zu erhöhen, kannst du es direkt aus dem index berechnen
        sprite.y = 100
        sprite.zoom_x = sprite.zoom_y = 0.5
        sprite.bitmap = RPG::Cache.picture("Skillpointfull")
        @sprites << sprite # füge Sprite in Array ein. Äquivalent zu @sprites[index] = sprite
      }
     
     
      (5-$game_variables[79]...5).each {|index|
        sprite = Sprite.new
        sprite.x = 90 + 14*index
        sprite.y = 100
        sprite.zoom_x = sprite.zoom_y = 0.5
        sprite.bitmap = RPG::Cache.picture("Skillpointempty")
        @sprites << sprite
      }
   
 
  @Maske = Sprite.new
  @Maske.bitmap = RPG::Cache.picture("Maske")
....
...
. unsw.



Noch etwas ist mir aufgefallen, ich kann jetzt nichtmehr durch ein anderes Event die Bilder disposen? Das wäe doof weil ich das Menü über ein anderes Event beende und verschiedene untermenüs öffne die auch auf andere Events verteilt sind, und diese sollen das Hauptmenü natürlich beeinflussen können ^^.


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Official Oldschool
Official Oldschool
Benutzeravatar
Beiträge: 8917
Alter: 30
Wohnort: BRD, Thüringen
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Do Aug 01, 2013 10:47 
Zitat:
Erlaubt es dir Bilder zu disposen wo noch keine sind
Nein. @sprites zeigt erstmal nur auf einen Array. @sprite.each geht über jedes Element in diesem Array und ruft die dispose Methode auf diesem Element auf. Wenn in diesem Array Sprites liegen, werden sie also dabei disposed. Liegen in dem Array keine Sprites, passiert auch nichts. Hast du noch keine Sprites, dann muss der Array leer sein (denn du fügst in der Zeile @sprites << sprite ja jeden erzeugten Sprite in den Array ein). Demzufolge macht die each Methode nichts, da man über einen leeren Array nicht drüberlaufen kann.

Da @maske noch nicht auf einen Sprite zeigt, sondern auf nil, kannst du keine dispose Methode darauf aufrufen (nil kennt kein dispose).
Du müsstest also schreiben
Code:
@Maske.dispose if @Maske

Das ist die Kurzform für
Code:
if @Maske != nil
  @Maske.dispose
end


Zitat:
Noch etwas ist mir aufgefallen, ich kann jetzt nichtmehr durch ein anderes Event die Bilder disposen? Das wäe doof weil ich das Menü über ein anderes Event beende und verschiedene untermenüs öffne die auch auf andere Events verteilt sind, und diese sollen das Hauptmenü natürlich beeinflussen können ^^.
Pack den kompletten Programmcode deines Menüs in deine Menüklasse rein. Im Event schreibst du dann nur noch sowas wie @skill_menu.oeffne_untermenu(1) etc. Das Ausblenden, Anzeigen, Bewegen etc. von Grafiken übernimmst du dann in deiner Sprite_SheetPictures Klasse.

_________________


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Alex
Alex
Benutzeravatar
Beiträge: 16
 Betreff des Beitrags: Re: Kleine Frage zur Ruby-Syntax
BeitragVerfasst: Do Aug 01, 2013 19:47 
Zitat:
Pack den kompletten Programmcode deines Menüs in deine Menüklasse rein. Im Event schreibst du dann nur noch sowas wie @skill_menu.oeffne_untermenu(1) etc. Das Ausblenden, Anzeigen, Bewegen etc. von Grafiken übernimmst du dann in deiner Sprite_SheetPictures Klasse.


Werd ich definitiv das nächste mal machen, habe aber weil ich schon relativ viel via Events gemacht habe hier eine andere Lösung gefunden :)

Probleme bisher alle gelöst, das mit dem Disposen funktioniert.. und auf auf globale Variablen auch verzichtet. Danke!

Hoffe es stört nicht wenn ich immer weiter mit fragen komme :rotwerd:

Hier eine andere Frage aber auch zur Ruby Syntax, habe schon im Internet geschaut aber nichts gefunden...

Ich rufe einen text auf etwa:

Code:
self.contents.font.color = Color.new(220, 220, 220, 250)
self.contents.draw_text(0,  10, 1000, 30, "Körperkraft gibt an wie stark dein Charakter ist.")
self.contents.draw_text(0,  30, 1000, 30, "Du hast momentan:" +  $game_variables[153].to_s() + "\n" + "Körperkraftpunkte.")



Ok der ganze Text ist nun Grau, die Kraft-Punkte möchte ich Blau haben. Hier ein Bild falls nicht ganze klar ist was ich meine:
Bild
Das ganze musste ich umständlich lösen und einen extra text mit der Variable aufrufen und die auch noch an die genau stelle justieren....
Gibt es also eine Möglichkeit Text-Farbe, Bold etc. in einem draw._text zu ändern?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de