Ergebnis 1 bis 13 von 13

Thema: Unterschiedliche Waffentypen sollen unterschiedliche Switches aktivieren

  1. #1

    Unterschiedliche Waffentypen sollen unterschiedliche Switches aktivieren

    Wie versprochen, hier der neue Thread. (:
    Mit einem anderen Problem, mit dem ich mich herumärger, das sicher mit Variablen ganz elegant gelöst werden kann.
    Ich möchte Variablen wirklich verstehen, daher wäre es toll, wenn mir jemand die Lösung des Problems wirklich Schritt für Schritt & gut nachvollziehbar erklären könnte. [:

    Die Klassen in meinem Game können unterschiedliche Waffentypen verwenden (zumindest sollen sie das).
    Die Klasse MERC zum Beispiel kann sowohl Bögen, als auch Gewehre benutzen. Diese setzen unterschiedliche Schalter in Gang.

    Code:
    @> Control Variables: [0203:bow] = [Nelu MERC]'s Weapon ID
    @> Conditional Branch: Variable [0203:bow] > 0
      @> Control Switches: [0111:bow control1] = ON
      @> Control Switches: [0114:init Merc] = ON
      @>
     : Else
      @> Control Switches: [0111:bow control1] = OFF
      @> Control Switches: [0114:init Merc] = OFF
      @>
     : Branch End
    @> Wait: 0.0 seconds
    @> Control Variables: [0210:gun] = [Nelu MERC]'s Weapon ID
    @> Conditional Branch: Variable [0210:gun] > 0
      @> Control Switches: [0115:gun control1] = ON
      @> Control Switches: [0114:init Merc] = ON 
      @>
     : Else
      @> Control Switches: [0115:gun control1] = OFF
      @> Control Switches: [0114:init Merc] = OFF
      @>
     : Branch End
    @> Wait: 0.0 seconds
    Hier sieht man zwei verschiedene Waffentypen, die unterschiedliche Animationen, Schadenswerte & weitere Effekte in Gang setzen.

    Brauche ich für jede unterschiedliche Waffenart eine eigene Waffen-ID? Und wenn "ja", wo kommt die hin?
    Macht es überhaupt Sinn das mit Variablen zu machen?

  2. #2
    Also zunächst mal: Switches sind Wahrheitsvariablen, sogenannte Booleans, die nur die Werte "True" und "False" annehmen können. Du könntest theoretisch auch stattdessen eine Variable nehmen und der die Werte "0" oder "1" geben. Aber Switches bieten sich an.

    Du hast erneut ein Skript, das so nicht ganz funktioniert, denn, erst wird eine Abfrage gemacht, ob die Variable "bow" eine WaffenID über 0 hat, also ob eine Waffe ausgerüstet ist. Dann aktiviert sich der Switch BowControl1.
    Aber genau dasselbe machst du ein Zweites Mal, nur mit einer anderen Variable, das heißt, dass, egal welche Waffe ausgerüstet ist, jeweils BowControl UND GunControl dann IMMER beide aktiviert sind.

    In diesem spezifischen Skript MUSST du zwischen den jeweiligen WeaponIDs unterscheiden, somit reicht bei der Abfrage kein simples ">0?" mehr aus.
    Jetzt kommt der Clou. Damit du nicht höllisch viel Skripten musst, solltest du dein ItemArray nach Art der Waffen sortieren. Das heißt, alle Schwerter hintereinander auflisten, dann alle Bögen, dann alle Pistolen/Gewehre.

    Dann kannst du bei der Abfrage z.B. machen (wenn die Bögen bei ArrayPosition(ID) 5 anfangen und bei 10 aufhören):

    If var[bow] >= 5
    if var[bow] <= 10
    Switches für Bogen on.

    Geändert von Drakee (01.09.2015 um 19:03 Uhr)

  3. #3
    Ja, in weiser Voraussicht habe ich meine Waffen alle nach Art sortiert.

    & die Variablen für die unterschiedlichen Arten der Waffen kommen dann vermutlich in "Random x ~ y"?

  4. #4
    Was ? Nein! Das generiert nur einen Zufallswert für eine Variable.

    Die Variablen im Array sind sogenannte Integer, also ganze Zahlen zwischen -2.5 Mrd und +2,5 Mrd (ungefähr), wobei die im Maker auf -9.999.999 und +9.999.999 beschränkt sind, wenn du den RPG Maker 2003 verwendest.
    Deswegen werden, wenn du eine Waffe in das Array der Variablen speicherst, auch der im Item Array zugewiesene Wert (die ID) gespeichert.

    Somit musst du, wenn du zwischen verschiedenen Arten von Waffen unterscheiden willst, den Intervall angeben, was nicht funktionieren würde, wenn du im Item Array die Waffen nicht sortiert hättest.
    In einer Programmiersprache wie C++ oder Java könntest du einfach schreiben (bei meinem Beispiel):

    If WaffenID >= 5 && <= 10 //heißt, dass wenn der in der Variable gespeicherte ID-Wert der Waffe zwischen 5 und 10 liegt, dann ist die Bedingung erfüllt und wir kommen in den Zweig hinein
    BowControl1 = true;

    Im Maker kann man Intervalle nicht in einer einzigen Bedingung angeben, d.h. man muss das so machen, wie ich das geschrieben habe:
    Code:
    @> Conditional Branch: Variable [0019:BogenID] >= 5
      @> Conditional Branch: Variable [0019:BogenID] <= 10
        @>
       : Else
        @> Jump to Label: 1
        @>
       : Branch End
      @>
     : Else
      @> Label: 1
      @>
     : Branch End
    Erst wird gefragt, ob WaffenID über 5 oder gleich 5 ist. Wenn das erfüllt ist, wird abgefragt, ob sie kleiner oder gleich 10 ist.

    Geändert von Drakee (01.09.2015 um 19:38 Uhr)

  5. #5
    Vor deinem Code muss ich aber den Bogen als ID speichern, oder?

  6. #6
    Logisch
    Du brauchst in deinem Fall eigentlich nur eine Variable, denn die Abfrage wird nicht "versaut", wenn die Variable danach für eine neue Abfrage (in diesem Fall für die Gewehre) geändert wird.

    Sieht dann so aus
    Variable "WaffeID" == WeaponEquipped;
    Die Abfrage für den Intervall der Bögen-Waffen

    und dann wieder dieselbe Variable.

    Das Programm wird IMMER von oben nach unten ausgeführt, das heißt, wenn Abfragen schon überprüft wurden, dann kann man dieselbe Variable nochmal nutzen. Der Übersicht wegen.

    Übrigens könntest du hier statt Switches tatsächlich Variablem nutzen. Du weist dann, wenn ein Schwert benutzt wird, der Variable (z.B.) "Art der Waffe", eine 1 zu, für Bogen eine 2, für Pistolen eine 3 usw.

    Dann kannst du die anderen Abfragen jeweils in die "Else"-Zweige stecken und dann in den letzten, wenn nichts von alledem erfüllt ist (d.h. keine Waffe ausgerüstet), in diesem Else-Zweig der Variable eine 0 zuweisen für keine Waffe.

    Das spart dir eine Menge Code zugunsten der Übersicht

    Code:
    @> Control Variables: [0018:WaffenID] = [Arthur]'s Weapon ID
    @> Comment: Schwerter
    @> Conditional Branch: Variable [0018:WaffenID] >= 1
      @> Conditional Branch: Variable [0018:WaffenID] < 5
        @> Control Variables: [0019:WaffenArt] = 1 
        @>
       : Else
        @> Jump to Label: 1
        @>
       : Branch End
      @>
     : Else
      @> Label: 1
      @> Comment: Bögen
      @> Conditional Branch: Variable [0018:WaffenID] >= 6
        @> Conditional Branch: Variable [0018:WaffenID] < 10
          @> Control Variables: [0019:WaffenArt] = 2 
          @>
         : Else
          @> Jump to Label: 2
          @>
         : Branch End
        @>
       : Else
        @> Label: 2
        @> Conditional Branch: Variable [0018:WaffenID] >= 11
          @> Conditional Branch: Variable [0018:WaffenID] <= 15
            @> Control Variables: [0019:WaffenArt] = 3 
            @>
           : Else
            @> Jump to Label: 3
            @>
           : Branch End
          @>
         : Else
          @> Label: 3
          @> Control Variables: [0019:WaffenArt] = 0 
          @>
         : Branch End
        @>
       : Branch End
      @>
     : Branch End
    Du musst dir nur merken, für welche Waffenart welcher Wert steht. Schreib's dir auf oder nicht xD

    Du brauchst den zweiten Switch oder eine zweite Variable, die bestimmt, dass gerade ein Bögenschütze oder ein Schwertkämpfer agiert, nicht, wenn jede WaffenArt nur einer Klasse zugewiesen ist.
    Denn das erübrigt sich dann automatisch.

    Eine alternative Möglichkeit wäre auch:
    Code:
    @> Control Variables: [0019:WaffenArt] = 0 
    @> Control Variables: [0018:WaffenID] = [Arthur]'s Weapon ID
    @> Comment: Schwerter
    @> Conditional Branch: Variable [0018:WaffenID] >= 1
      @> Conditional Branch: Variable [0018:WaffenID] < 5
        @> Control Variables: [0019:WaffenArt] = 1 
        @>
       : Else
        @> Jump to Label: 1
        @>
       : Branch End
      @>
     : Else
      @> Label: 1
      @> Comment: Bögen
      @> Conditional Branch: Variable [0018:WaffenID] >= 6
        @> Conditional Branch: Variable [0018:WaffenID] < 10
          @> Control Variables: [0019:WaffenArt] = 2 
          @>
         : Else
          @> Jump to Label: 2
          @>
         : Branch End
        @>
       : Else
        @> Label: 2
        @> Conditional Branch: Variable [0018:WaffenID] >= 11
          @> Conditional Branch: Variable [0018:WaffenID] <= 15
            @> Control Variables: [0019:WaffenArt] = 3 
            @>
         : Branch End
        @>
       : Branch End
      @>
     : Branch End
    Hier wird bei der letzten Bedingung das Else weggelassen, weil es keine weiteren alternativen Bedinungen mehr gibt. Dafür wird dann @> Control Variables: [0019:WaffenArt] = 0 direkt am Anfang ausgeführt. Das würde sich nicht ändern, wenn keine der Bedingung erfüllt ist. Somit würde auch das funktionieren und sogar nochmal ein paar Zeilen einsparen

    Geändert von Drakee (01.09.2015 um 20:19 Uhr)

  7. #7
    So?
    Code:
    @> Control Variables: [0204..0209] = [Nelu MERC]'s Weapon ID
    @> Conditional Branch: Variable [0203:bow] >= 204
      @> Conditional Branch: Variable [0203:bow] <= 209
        @>
       : Else
        @> Jump to Label: 1
        @>
       : Branch End
      @> Control Switches: [0111:bow control1] = ON
      @> Control Switches: [0114:init Merc] = ON
      @>
     : Else
      @> Label: 1
      @>
     : Branch End
    EDIT: Sorry, hab den Rest deines Posts jetzt erst gesehen. Muss ich mich erstmal durcharbeiten. (:

    Geändert von Norpoleon (01.09.2015 um 20:23 Uhr)

  8. #8
    Da du ja ein ABS verwendest, mal folgende Frage:
    Brauchst du die Statuswerte wie Attack, Defense etc. eigentlich? Gibt es da eventuell einen, den du nicht verwendest? Könnte mir das bei Agility gut vorstellen. Sofern du einen Statuswert entbehren könntest, liesse sich was sehr simples einrichten.

  9. #9
    So?
    (Das ist jetzt für zwei unterschiedliche Waffenarten)

    Code:
    @> Control Variables: [0203:weapon ID] = [Nelu MERC]'s Weapon ID
    @> Conditional Branch: Variable [0203:weapon ID] >= 204
      @> Conditional Branch: Variable [0203:weapon ID] <= 209
        @> Control Variables: [0220:weapon type] = 2 
        @>
       : Else
        @> Jump to Label: 1
        @>
       : Branch End
      @>
     : Else
      @> Label: 1
      @> Conditional Branch: Variable [0203:weapon ID] >= 211
        @> Conditional Branch: Variable [0203:weapon ID] <= 216
          @> Control Variables: [0220:weapon type] = 3 
          @>
         : Else
          @> Jump to Label: 2
          @>
         : Branch End
        @>
       : Else
        @> Label: 2
        @> Control Variables: [0220:weapon type] = 0 
        @>
       : Branch End
      @>
     : Branch End
    @Nagasaki Agility brauch ich tatsächlich für nichts.

  10. #10
    Zitat Zitat von Norpoleon Beitrag anzeigen
    So?
    Code:
    @> Control Variables: [0204..0209] = [Nelu MERC]'s Weapon ID
    @> Conditional Branch: Variable [0203:bow] >= 204
      @> Conditional Branch: Variable [0203:bow] <= 209
        @>
       : Else
        @> Jump to Label: 1
        @>
       : Branch End
      @> Control Switches: [0111:bow control1] = ON
      @> Control Switches: [0114:init Merc] = ON
      @>
     : Else
      @> Label: 1
      @>
     : Branch End
    Hier hast du nur die Aktivierung am Ende der inneren Bedingung stehen und nicht innerhalb beider Bedingungen ^^

    Aber das, was du danach gepostet hast, passt so.

    Das mit den Labels mache ich nur so, damit man bei verschachtelten Bedingungen, die eigentlich zusammen eine einzige erfüllen, nicht bei jedem Else das Gleiche reinkopieren muss. Sonst würde der Code explodieren

  11. #11
    Und wo kommen bei dem, was ich als letztes als Code geschrieben habe, die Switches rein?

  12. #12
    Dann hätte ich folgenden Vorschlag, der deinen Code sehr verkürzen kann:
    Setze in der Database die Agility deines Helden auf 1. Bei jeder Waffe setzt du je nach Waffentyp die Agility auf einen anderen Wert. Dann brauchst du lediglich die Agility deines Helden in einer Variable abspeichern und diese Abfragen.

    Ein Beispiel:
    Jedes Gewehr erhöht die Agility beim Ausrüsten um 1, jeder Bogen um 2 etc.

    Code:
    @> Control Variables: [0220:weapon type] = [Nelu MERC]'s Agility
    @> Conditional Branch: Variable [0220:weapon type] = 2
      @> ### Du weisst nun, dass du ein Gewehr ausgerüstet hast ###
      @>
     : Branch End
    @> Conditional Branch: Variable [0220:weapon type] = 3
      @> ### Du weisst nun, dass du einen Bogen ausgerüstet hast ###
      @>
     : Branch End
    usw.

    Der Basiswert für Agility ist immer 1. Bei einem Wert von 1 weisst du, es ist keine Waffe ausgerüstet. Bei jedem anderen Wert rechnest du eben diese 1+ den jeweiligen Wert, der durch die Waffe erhöht wird. Dadurch weisst du, welcher Waffentyp ausgerüstet ist.

    Dies hat den Vorteil, dass der Code kürzer ist und du deine Waffen nicht mehr zwingend sortieren musst. Wenn du später mal was erweiterst, ist es somit egal welche ID die Waffe haben sollte. Du ermittelst den Waffentyp durch die Erhöhung der Agility, nicht die ID. Das vereinfacht die Angelegenheit, folgt aber ansonsten dem gleichen Prinzip.
    Dieser Weg macht natürlich nur dann Sinn, wenn du einen Statuswert entbehren kannst, was ja glücklicherweise der Fall ist.

    Geändert von Nagasaki (01.09.2015 um 21:10 Uhr)

  13. #13
    @Nagasaki Das sieht auf jeden Fall schön einfach aus. Das werde ich sofort ausprobieren, wenn ich mit den Variablen nicht weiterkommen sollte.

    EDIT: Der Einfall, den Agility-Wert als Indikator für die Waffengattung zu benutzen, war übrigens genial. Alles funktioniert jetzt, wie es funktionieren soll. Danke dafür. (:

    Geändert von Norpoleon (08.09.2015 um 17:21 Uhr)

Stichworte

Berechtigungen

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