Ergebnis 1 bis 20 von 29

Thema: Skriptproblem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Code:
      def skill_effect(user, skill)
        skill_index = user.find_skill_index(skill)
        # Clear critical flag
        self.critical = false
        # If skill scope is for ally with 1 or more HP, and your own HP = 0,
        # or skill scope is for ally with 0, and your own HP = 1 or more
        if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
           ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
          # End Method
          return false 
        end
    Ich kann auch noch mehr posten. Aber eigentlich müssten die ersten beiden Zeilen alles sagen, denn der Fehler betrifft laut RGSS die 2., hier gepostete Zeile.

  2. #2
    Und find_skill_index ist von welcher Klasse eine Funktion? Bzw. welcher Klasse gehört user an?

  3. #3
    Die Methode müsste laut Fehlermeldung in Game_Enemy oder Game_Battler definiert sein. Davon mal abgesehn ergibt die Methode aber keinen Sinn. Es gibt wesentlich elegantere Lösungen als diese hässlichen For-Schleifen-Konstruktionen.

    Code:
    skill_index = user.skills.find {|skill_id| skill_id == skill} or 0
    Möglich wäre auch:
    Code:
    skill_index = if user.skills.include?(skill) then skill else 0 end
    Diese beiden Zeilen machen jeweils das Gleiche wie deine Methode. Setz also statt dem Methodenaufruf einfach eine der beiden Zeilen ein.

    Geändert von -KD- (01.09.2007 um 16:16 Uhr)

  4. #4
    @-KD-
    Also die letzte Zuweisung dürfte aber falsch sein, wenn ich mich nicht irre. skill_index ist anscheined eine Integer-Variable, skill ist aber so wie es bei P-Games' Zitat aussieht ein Objekt. Soweit ich das richtig sehe, wird bei P-Games' Beispiel das Array der Skills durchlaufen und geschaut, ob ein Skill die gleiche ID hat, wie der mit dem die Funktion aufgerufen wird. Dann wird i zurückgegeben und damit die Position vom Skill innerhalb des Arrays.

    Edit:
    Bei der ersten Zuweisung bin ich mir auch nicht sicher. find wird nach der Hilfedatei vom XP so definiert:

    Zitat Zitat
    Returns the first item that tested as true during the block evaluation. If no item was true, returns nil.
    Bei deinem Beispiel würde dann ein skill-Objekt zurückgegeben werden und nicht dessen ID. Und funktioniert das mit "or 0" wirklich? Bei mir wird das im XP ignoriert und die Variable auf nil gesetzt, falls kein Objekt gefunden wurde.

    Geändert von Kelven (01.09.2007 um 16:57 Uhr)

  5. #5
    -KD-, die beiden Beispiele haben nicht funktioniert. Ich habe das erste ausprobiert, dieses mal war die Methode "skills" undefiniert (laut RGSS).
    Beim zweiten Beispiel wird das Spiel sofort zu Kampfbeginn geschlossen. Könntet ihr nochmal genau beschreiben, was definiert werden muss?

  6. #6
    Ich nehme mal an find_skill_index ist ein Teil der Actor-Klasse, oder? Deswegen kann dort auch auf @skills zugegriffen werden, was in der Klasse Game_Battler nicht direkt funktioniert. Aber der Code von dem Zitat (also die ursprüngliche "find_skill_index"-Funktion) ist vermutlich auch nicht falsch. Der Fehler muss irgendwo anders liegen.

  7. #7
    find_skill_index ist in Game_Battler untergebracht. Natürlich ist diese Klasse anders als normalerweise, es ist ja schließlich verändert. Ich nehme halt immer an, dass es am Spiel liegt und nicht an den Skripten, da es ja in der DEmo einwandfrei funktioniert.

  8. #8
    Aber was macht denn nun die ursprüngliche find_skill_index-Funktion? Die bekommt skill übergeben und da dort auf skill.id zugegriffen wird, nehme ich mal an, dass skill ein Objekt der Skill-Klasse ist. Dann wird mit der Schleife geschaut, ob diese id irgendwo bei den Skills des Charakters ist und falls ja,wird die Position im Array des Skills ausgegeben.

    Müßte dein zweites Beispiel dann nicht so lauten?

    Code:
    skill_index = if user.skills.include?(skill.id) then user.skills.index(skill.id) else 0 end

  9. #9
    Naja, das ist halt das Problem. Man kann schwer einem Fehler auf die Spur kommen, wenn man den Code nicht kennt. Normalerweise wird in den Standardklassen nur mit der ID, nicht mit dem eigentlichen Objekt gehandelt. Wenn es in diesem Fall andersherum ist (im obigen Code steht ja tatsächlich skill.id) dann hast du natürlich recht.
    Code:
    skill_index = user.skills.index(skill.id) || 0

  10. #10
    Ich glaube auch, dass es so wie Kelven es sagt, sein muss, wenn auch immernoch "skills" als undefinierte Methode ausgegeben wird. In der Originaldemo funktioniert es schließlich so, wie ich es gepostet habe.

  11. #11
    Ich weiß doch nicht wie deine Game_Battler Klasse aussieht. Damit es funktioniert, muss jeder Battler über eine Reader-Methode skills verfügen. Im Normallfall hat nur der Game_Actor sowas. Du kannst das theoretisch mit diesem Code ändern, aber wenn das nicht funktioniert, dann poste doch einfach deinen Code.
    Code:
    class Game_Enemy
      def skills
        $data_enemies[@enemy_id].actions.find_all {|action| action.kind == 1}.collect {|skillaction|
          $data_skills[skillaction.skill_id]
        }
      end
    end

  12. #12
    Liegt es eigentlich wirklich an den Skills oder könnte es ewas mit den zusätzlichen Fähigkeiten, die ich verwende zu tun haben. Dises erhalten zu Beginn der Klasse jeweils einen Reader.

    Code:
    class Game_Battler
      attr_reader   :ap                       # AP
      attr_reader   :abilities                # abilities
      attr_reader   :enabled_abilities        # ability enabled
    Dies betrifft allerdings nur den Hero und keinen Enemy...

  13. #13
    Wenn du von Actors und Enemies Skills herauslesen willst, müssen diese ja auch eine entsprechende skill-Methode besitzen. Hast du meinen vorherigen Post denn mal ausprobiert?
    *nochmal subtil darauf hinweis, dass der einfachste Weg einfach das Posten deiner Scripte wäre*

  14. #14
    Also standardmäßig ist @skills ein Array aus Integervariablen. Standardmäßig hat Game_Actor auch eine Reader-Methode dafür. Demzufolge müsste mein Code standardmäßig auch richtig sein *g* Nun kenne ich P-Games Code nicht, kann also auch nicht sagen wie es bei ihm sein müsste. Ein erster Anlaufpunkt wäre ja schon, die Fehlermeldung zu erfahren.

    Zitat Zitat
    Und funktioniert das mit "or 0" wirklich?
    Jap, Ruby überprüft bei einer Or-Verknüpfung erstmal nur das erste Objekt. Wenn das nicht false und nicht nil ist, hört er auf, ansonsten überprüft er das zweite Objekt. Rückgabewert ist also immer das zuletzt geprüfte Objekt.
    variable = objekt or standardwert
    ist also eine einfache Lösung um einer Variable entweder ein Objekt, oder, wenn dieses nil ist, einen Standardwert zuzuweisen.

    Edit: Autsch, es muss natürlich wegen der Bindung || statt or heißen. Oder man verwendet Klammern ^^°

    Geändert von -KD- (01.09.2007 um 22:47 Uhr)

Berechtigungen

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