Seite 65 von 71 ErsteErste ... 1555616263646566676869 ... LetzteLetzte
Ergebnis 1.281 bis 1.300 von 1418

Thema: Technik-Sammelthread für Probleme und Antworten

  1. #1281
    Erstmal Danke Dir für die ausfürliche Antwort!
    Ich habe mir gedacht das dies der einzige Weg sein wird das Ganze einzustellen, schade eigentlich. Ich denke ich werde einfach die von mir erdachten Zauber etwas Balancen um sie dem Standard System anzupassen, das wäre wohl das einfachste und auch zu verschmerzen.

    Nun habe ich aber noch ein paar Fragen zum Thema Skills:

    1. Ist es möglich, dass der Skill einen zufälligen Gegner angreift? Der Skill soll schon noch auf einen "Single Enemy" gehen, jedoch darf diesen der Spieler nicht auswählen. Oder von mir aus kann es auch ganz zufällig sein, also auch das nicht ausgeschlossen wird das Partymitglieder angegriffen werden, wie wenn er verwirrt wäre, nur halt für diesen einen Angriff.

    2. Ist es möglich eine Skill zu erstellen, der den normalen Angriff ein Element hinzufügt? z. B. soll nach dem Zaubern des Skills für einige Zeit (vl bis zum Ende des Kampfes?) Eisschaden verursachen.

    3. Ist es möglich einen Skill zu erstellen der z. B. Ohnmacht heilt aber dafür Vergiftet? Ich kann nur entweder "Inflict" oder "Heal" auswählen, jedoch nicht Beides..

    Hab leider nicht damit gerechnet dass der 2k3 soviele Restriktionen hat was Skills angeht und hab etwas übertrieben bei der Planung, aber vielleicht lässt sich ja wenigstens etwas davon umsetzen

    Geändert von Ich bin viele (19.03.2019 um 18:25 Uhr)

  2. #1282
    Umsetzbar wären alle 3 Aktionen, allerdings ziemlich umständlich über Battle Events, was zum einen einigen Aufwand an Scripting und zum anderen bedeuten würde, dass die entsprechenden Events für jeden einzelnen Kampf (oder zumindest für alle Kämpfe, in denen sie auftreten können) übernommen werden müssten.

  3. #1283
    Sowas in der Art habe ich bereits versucht (Schritt 3 hab ich umgesetzt, jeweils ausserhalb und innerhalb von kämpfen). Leider hab ich gerade keine Idee wie man Schritt 2 so umsetzen könnte, da ich nicht genau weiß wie man dem normalen Angriff ein Element zuweisen kann :P

  4. #1284
    Zitat Zitat
    Leider hab ich gerade keine Idee wie man Schritt 2 so umsetzen könnte, da ich nicht genau weiß wie man dem normalen Angriff ein Element zuweisen kann :P
    Geht soweit ich weiß auch nicht direkt. Allerdings lässt sich der Effekt (mit einigem Aufwand!) simulieren:

    Zunächst einmal legst du jede Waffe mehrmals an: Einmal in der normalen Version und (je) einmal mit dem(/jedem) zuweisbaren Element(en). Also z.B. Kurzschwert, Kurzschwert mit Eisattribut, Kurzschwert mit Donnerattribut usw.
    Vor jedem Kampf startetst du ein Common Event, das überprüft, welche (attributlose) Waffe jeder Held gerade ausgerüstet hat und speicherst das in Variablen. Z.B. if Alex Kurzschwert equipped then set Variable 1234 1, else if Alex Langschwert equipped then set Variable 1234 2, else... (Die Ausrüstung lässt sich im Kampf leider nicht mit Conditional Branch abfragen).
    Dann machst du aus dem Elementzuweisungsskill einen Switch-Skill.
    Im Kampf fügst du dann ein Event hinzu, dass startet, sobald der Switch aktiviert ist. Dieses Event ersetzt die aktuell ausgerüstete Waffe aller Helden (ich habe keine Idee, wie man den Effekt auf einen einzelnen Helden anwenden könnte Edit: Ok, ich habe doch eine Idee, aber das würde das Ganze noch umständlicher machen...) mit der elementaren Version (z.B. if Variable 1234 is 1, then Alex Kurzschwert mit Eisattribut equip, else if Variable 1234 is 2 then Alex Langschwert mit Eisattribut equip, else...).
    Nach dem Kampf startest du ein weiteres Common Event, das ausgerüstete elementaren Waffen wieder durch die gewöhnlichen Varianten ersetzt und die elementaren Varianten anschließend aus dem Inventar wirft (if Alex Kurzschwert mit Eisattribut equipped, then Change Equipment Alex Kurzschwert equip, then Change Items Kurzschwert mit Eisattribut remove, else if Alex Kurzschwert mit Donneratribut equipped...).

    Wie gesagt, machbar aber ziemlich aufwendig.

    Geändert von Liferipper (19.03.2019 um 22:28 Uhr)

  5. #1285
    Super, danke!
    Es funktioniert tadellos! Es handelt sich zum Glück nur um ein Element und der Zauber ist sowieso nur auf den Wirker anwendbar, also ist es nicht soo viel Arbeit

  6. #1286
    Hey Leutz,

    ich arbeite mit dem RPG Maker VX Ace und habe ein Problem (offensichtlich):

    Da ich die VX-Grafiken verabscheue, und damit auch diese Minichars, benutze ich XP-Grafiken.
    Leider gibt es da ein Problem mit den Tiles die in der Database mit einem Stern markiert sind (siehe Bild im Spoiler).



    Sollte es dafür ein Script geben, wäre ich sehr dankbar wenn mir das jemand verlinken könnte.
    Denn leider weiß ich nicht, wie ich dies betiteln soll damit google mir kompetente Links gibt und allgemeine Scriptsuche mit Selbstfilterung hat auch nichts hilfreiches ergeben.

  7. #1287
    Hey Leute

    Ich hab mal wieder eine Frage (vielleicht sollte ich mal meinen eigenen Fragenthread eröffnen :P):

    Es handelt sich um den RM2k3.
    Ich möchte dem Spieler eine gewisse Freiheit bieten und so hab ich mich entschlossen den Spieler entscheiden zu lassen ob er lieber einen Schwertkämpfer oder einen Magier spielen will. Dafür hab ich 2 Waffenkategorien für den Helden angelegt, nämlich Schwerter und Stäbe. Nun will ich aber, da es sonst einfach zu unbalanced wäre wenn nur die Intelligenz bei Stäben angehoben wird, dass die maximale Mana ebenfalls angehoben wird (Stab 1 +5 max Mana, Stab 2 +10 max Mana usw.). Ich weiß zwar wie ich bewerkstellige dass die max Mana angehoben werden, jedoch nicht wie es geht die Mana wieder in den Urspungszustand zurückzuversetzen wenn der Stab deeqipped oder ein Schwert equipped wird.

    Ich hoffe diesmal findet sich eine etwas leichtere Lösung, sonst verliere ich allmälich den Glauben an den 2k3

  8. #1288
    @ Agura:
    Ohne mich jetzt mit dem ACE auszukennen, behaupte ich einfach mal, dass der Stern bedeutet, dass das "über" dem Helden angezeigt wird. D.h. wenn du jetzt auf die andere Seite des Zauns gehst, wird er korrekt über dem Helden angezeigt.

    Ein möglicher Workaround wäre, die obere Reihe des Zauns komplett durch Events darzustellen. Diese haben je zwei Event Pages:
    - Seite A wird über dem Helden angzeigt
    - Seite B wird unter dem Helden angezeigt und hat einen Switch "Held südlich vomo Zaun" als Bedingung
    Dann musst du nur noch sicherstellen, dass dieser Switch immer richtig gesetzt ist (d.h. sobald der Held sich in den Bereich nördlich bzw. südlich vom Zaun bewegt / teleportiert, wird der Switch entsprechend gesetzt).

    @ Ich bin viele:
    Ein eigenes Kampfsystem wirkt da Wunder . Da kannst du nämlich alle Werte selbst bestimmen und auch sowas wäre leicht machbar.
    Was vielleicht irgendwie gehen könnte, wäre Folgendes: Du gehts vor jedem Kampf (bzw. nach jedem Menüaufruf) einmal das Equipment der Helden durch und hast für jeden Stab eine Variable, die den Manabonus für diesen Stab festlegt. Außerdem eine Variable für den Grundwert des Manas des Helden (ohne Gegenstände) und für den aktuellen Wert (d.h. mit Bonus). Das muss entsprechend in einem riesigen If-Grab wieder alles abgefragt und geupdated werden. Und ggf. bei Level-Ups, sofern du da die normalen EXP und Leveleinstellungen des Makers benutzt...

  9. #1289
    @Ich bin viele: Ohne es getestet zu haben, bin ich der Überzeugung, dass der 2k3 bereits über das "Job" System verfügt, mit dem du in der Lage sein solltest diese Unterschiede
    abzubilden - eventuell kennt sich ja jmd hier ausreichend damit aus um das genauer erläutern zu können.
    Im deutschen müsste das Ganze dan unter "Klassen" o. ä. laufen - wenn du dort verschiedene Klassen definierst (mage, Warri, etc.) sollte es möglich sein, beim Waffenwechsel den
    Wechsel der Klasse ebenfalls zu automatisieren ...

  10. #1290
    Zitat Zitat von Caledoriv Beitrag anzeigen
    @ Agura:
    Ohne mich jetzt mit dem ACE auszukennen, behaupte ich einfach mal, dass der Stern bedeutet, dass das "über" dem Helden angezeigt wird. D.h. wenn du jetzt auf die andere Seite des Zauns gehst, wird er korrekt über dem Helden angezeigt.

    Ein möglicher Workaround wäre, die obere Reihe des Zauns komplett durch Events darzustellen. Diese haben je zwei Event Pages:
    - Seite A wird über dem Helden angzeigt
    - Seite B wird unter dem Helden angezeigt und hat einen Switch "Held südlich vomo Zaun" als Bedingung
    Dann musst du nur noch sicherstellen, dass dieser Switch immer richtig gesetzt ist (d.h. sobald der Held sich in den Bereich nördlich bzw. südlich vom Zaun bewegt / teleportiert, wird der Switch entsprechend gesetzt).
    Dem bin ich mir bewusst, Beidem. Ich weiß, was der Stern macht, wenn ich vor dem Zaun stehe, ist falsch, aber man (oder Tier) soll ja auch hinter dem Zaun stehen können.
    Deine Idee mit dem Events ist mir auch gekommen, aber wie ich bereits sagte, will ich meine Maps nicht mit so vielen aktiven Events bombadieren. Ausßerdem ist das dann immer vom Helden abhängig. Das heißt, dass wenn der Held unter dem Zaun steht, alle anderen AUF dem Zaun sind, das gilt dann für Tiere oder evtl. folgenden Helden.

    Desswegen ja ein Script, das mittels einem Terrain Tag bescheid weiß, wie er das für die entsprechenden einzelnen Events berechnen muss.

    Trotzdem vielen Dank für deine Hilfe.

  11. #1291
    Hallo Agura,

    Beim Maker haben die "*-Tiles" leider immer einen fixen Z-Wert, der so eingestellt ist, dass er über dem Charakter steht.
    Ich wollte dir gerade ein Script schreiben, welches den Z-Wert anhand der Position/Größe anpasst, als ich merkte, dass es da etwas gibt (gut, dass ich immer selbst google, bevor ich loslege):
    Quelle: https://save-point.org/thread-4971.html
    Code:
    #==============================================================================
    #
    # ▼ Moby's Script System - Correct Sprite Display V1.0
    # -- Last Updated: 2013.01.26
    #
    #==============================================================================
    
    $imported = {} if $imported.nil?
    $imported["MSS-Correct_Sprite_Display"] = 1.0
    
    #==============================================================================
    # ▼ Updates
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # (by brushfe) Tall events interact better with other tall events
    #
    #==============================================================================
    # ▼ Introduction
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # This script corrects how sprites will be displayed, to prevent errors
    # happening when the sprite is higher than 32px and the tile above it is set
    # to star passability.
    #
    #==============================================================================
    # ▼ Instructions
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # To install this script, open up your script editor and copy/paste this script
    # to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save.
    #
    #
    # If you have any questions, bugs you want to report or anything else,
    # please contact me at mobychan@gmx.de or via my profile on
    # http://forums.rpgmakerweb.com (mobychan).
    #
    #
    # This script is Plug and Play.
    # It automatically checks if the Sprite is bigger then 32px and adjust the
    # tiles around that sprite accordingly.
    # If you're using Anaryu's Particle Engine (ported by Yami)
    # there won't be any issues.
    #
    #==============================================================================
    # ▼ Compatibility
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
    # it will run with RPG Maker VX without adjusting.
    #
    #==============================================================================
    #
    #==============================================================================
    # ▼ Known Issues
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # Really wide character sprites still are sometimes drawn behind tiles they
    # should be in front of.
    #==============================================================================
    
    
    
    #==============================================================================
    # ** Spriteset_Map
    #------------------------------------------------------------------------------
    # This class brings together map screen sprites, tilemaps, etc. It's used
    # within the Scene_Map class.
    #==============================================================================
    
    class Spriteset_Map
    #--------------------------------------------------------------------------
    # * Update Character Sprite
    #--------------------------------------------------------------------------
    alias msscsd_update_characters update_characters unless $@
    def update_characters
    msscsd_update_characters
    
    @character_sprites.each do |curr_sprite|
    if curr_sprite.character.class.name == "Game_Event" ||
    curr_sprite.character.class.name == "Game_Player" ||
    curr_sprite.character.class.name == "Game_Follower"
    height = get_height(curr_sprite)
    
    if height > 1
    x = curr_sprite.character.x
    curr_sprite.z = 100
    
    id = $game_map.data[x, curr_sprite.character.y, 2]
    flag_pos = $game_map.tileset.flags[id]
    
    if (!(flag_pos & 0x10 != 0) || id == 0)
    for i in 2..height
    y = curr_sprite.character.y - (i - 1)
    
    if !$game_map.data[x, y, 2].nil?
    flag = $game_map.tileset.flags[$game_map.data[x, y, 2]]
    
    if flag & 0x10 != 0 && # [☆]: No effect on passage
    $game_map.data[x, y, 2] != 0
    curr_sprite.z = 300
    break
    else
    curr_sprite.z = 100
    end
    loc = [curr_sprite.character.x, curr_sprite.character.y - 1]
    $game_map.events_xy(*loc).each do |event|
    if curr_sprite.character.class.name == "Game_Player" ||
    curr_sprite.character.class.name == "Game_Follower" ||
    curr_sprite.character.class.name == "Game_Event"
    curr_sprite.z = 300
    break
    end
    end
    end
    end
    end
    end
    end
    end
    end
    #--------------------------------------------------------------------------
    # * Gets the given Sprites height
    #--------------------------------------------------------------------------
    def get_height(curr_sprite)
    height = 0
    
    if curr_sprite.character.character_name.scan(/$/)
    height = (curr_sprite.bitmap.height / 4) / 32
    height += 1 if (curr_sprite.bitmap.height / 4) % 32 > 0
    else
    height = (curr_sprite.bitmap.height / 8) / 32
    height += 1 if (curr_sprite.bitmap.height / 8) % 32 > 0
    end
    return height
    end
    #--------------------------------------------------------------------------
    # * Add Particle
    #--------------------------------------------------------------------------
    def add_particle(target, name, blend, setting, offset, v = nil, a = nil)
    particle = Particle.new(@viewport2, target, name, blend, setting, offset, v, a)
    @particles.push(particle)
    end
    end
    Sollte etwas nicht funktionieren, gib mir gerne Bescheid. Bei Zeiten kann ich mir das Script anschauen und anpassen, falls nötig.

  12. #1292
    Hallo Linkey,

    Vielen Dank für das Raussuchen, ich hab beim besten Willen selbst nichts finden können. x.X
    Das Script funktioniert FAST perfekt. Es tut was es tun soll, aber wenn ich an den Zaun vorbeilaufe, kommt an den Ecken zu Problemen:
    Wenn das Event (z.B. der Held) von dem Tile seitlich wegläuft, wird das Tile wieder nach oben befördert.

    Mit häufigen Versuchen hab ich kontrolliert, ob das bei den Followern auch der Fall ist, aber nein, es ist nur für das Event, das das Tile gerade verlässt.

  13. #1293
    Moin Agura,

    hab mal schnell zwei Dinge eingebaut:
    1. Wenn der Charakter breiter als 32 Pixel ist, werden nun auch die benachbarten Felder geprüft
    2. Wenn der Charakter über einer Grafik angezeigt wird (z.B. Zaun) und sich bewegt, bleibt er solange im Vordergrund, bis er das nächste Feld erreicht hat
    Code:
    #==============================================================================
    #
    # ▼ Moby's Script System - Correct Sprite Display V1.0
    # -- Last Updated: 2013.01.26
    #
    # -- Update: LDT0319
    # -- Date:   2019.03.30
    # -- User:   D.T. Linkey
    # -- Change: If character is wider than 1 tile, check neighbour fields to 
    #            the correct Z-Value
    #
    #==============================================================================
    
    $imported = {} if $imported.nil?
    $imported["MSS-Correct_Sprite_Display"] = 1.0
    
    #==============================================================================
    # ▼ Updates
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # (by brushfe) Tall events interact better with other tall events
    #
    #==============================================================================
    # ▼ Introduction
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # This script corrects how sprites will be displayed, to prevent errors
    # happening when the sprite is higher than 32px and the tile above it is set
    # to star passability.
    #
    #==============================================================================
    # ▼ Instructions
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # To install this script, open up your script editor and copy/paste this script
    # to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save.
    #
    #
    # If you have any questions, bugs you want to report or anything else,
    # please contact me at mobychan@gmx.de or via my profile on
    # http://forums.rpgmakerweb.com (mobychan).
    #
    #
    # This script is Plug and Play.
    # It automatically checks if the Sprite is bigger then 32px and adjust the
    # tiles around that sprite accordingly.
    # If you're using Anaryu's Particle Engine (ported by Yami)
    # there won't be any issues.
    #
    #==============================================================================
    # ▼ Compatibility
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
    # it will run with RPG Maker VX without adjusting.
    #
    #==============================================================================
    #
    #==============================================================================
    # ▼ Known Issues
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # Really wide character sprites still are sometimes drawn behind tiles they
    # should be in front of.
    #==============================================================================
    
    
    #==============================================================================
    # ** Spriteset_Map
    #------------------------------------------------------------------------------
    # This class brings together map screen sprites, tilemaps, etc. It's used
    # within the Scene_Map class.
    #==============================================================================
    class Spriteset_Map
      #LDT0319 flag to check if character was in front of something before moving
      @chinfr = false
    #--------------------------------------------------------------------------
    # * Update Character Sprite
    #--------------------------------------------------------------------------
    alias msscsd_update_characters update_characters unless $@
    def update_characters
      msscsd_update_characters
    
      @character_sprites.each do |curr_sprite|
        if curr_sprite.character.class.name == "Game_Event" ||
          curr_sprite.character.class.name == "Game_Player" ||
          curr_sprite.character.class.name == "Game_Follower"
          height = get_height(curr_sprite)
          #========LDT0319 Start
          #get character width
          width = get_width(curr_sprite)
          #if character is moving and was already in front, keep z = 300
          if(curr_sprite.character.class.name == "Game_Player")
            if(curr_sprite.character.moving? && @chinfr)
              curr_sprite.z = 300 
              return
            end
          end
          #========LDT0319 End
          if height > 1
            x = curr_sprite.character.x
            curr_sprite.z = 100
            id = $game_map.data[x, curr_sprite.character.y, 2]
            flag_pos = $game_map.tileset.flags[id]
    
            if (!(flag_pos & 0x10 != 0) || id == 0)
              for i in 2..height
                y = curr_sprite.character.y - (i - 1)
    
                if !$game_map.data[x, y, 2].nil?
                  flag = $game_map.tileset.flags[$game_map.data[x, y, 2]]
    
                  if flag & 0x10 != 0 && # [☆]: No effect on passage
                    $game_map.data[x, y, 2] != 0
                    curr_sprite.z = 300
                    break
                  else
                    #========LDT0319 Start
                    #check if width is greater than one tile
                    if(width > 1)
                      # for each additional tile, check the field
                      for ti in 2..width
                        # check the field on the left first...
                        tx = curr_sprite.character.x - (ti - 1)
                        if(!$game_map.data[tx, y, 2].nil?)
                          flag = $game_map.tileset.flags[$game_map.data[tx, y, 2]]
                          if flag & 0x10 != 0 && # [☆]: No effect on passage
                            $game_map.data[tx, y, 2] != 0
                            curr_sprite.z = 300
                            break
                          else
                            curr_sprite.z = 100
                          end
                        end
                        # ... check the field on the right
                        tx = curr_sprite.character.x + (ti - 1)
                        if(!$game_map.data[tx, y, 2].nil?)
                          flag = $game_map.tileset.flags[$game_map.data[tx, y, 2]]
                          if flag & 0x10 != 0 && # [☆]: No effect on passage
                            $game_map.data[tx, y, 2] != 0
                            curr_sprite.z = 300
                            break
                          else
                            curr_sprite.z = 100
                          end
                        end
                      end
                    else
                      curr_sprite.z = 100
                    end
                    #========LDT0319 End
                  end
                  loc = [curr_sprite.character.x, curr_sprite.character.y - 1]
                  $game_map.events_xy(*loc).each do |event|
                    if curr_sprite.character.class.name == "Game_Player" ||
                      curr_sprite.character.class.name == "Game_Follower" ||
                      curr_sprite.character.class.name == "Game_Event"
                      curr_sprite.z = 300
                      break
                    end
                  end
                end
              end
            end
          end
        end
        #========LDT0319 if character is in front, set chinfr to true
        @chinfr = true if(curr_sprite.z == 300 && curr_sprite.character.class.name == "Game_Player")
        @chinfr = false if(curr_sprite.z == 100 && curr_sprite.character.class.name == "Game_Player")
      end
    end
    #--------------------------------------------------------------------------
    # * Gets the given Sprites height
    #--------------------------------------------------------------------------
    def get_height(curr_sprite)
    height = 0
    
      if curr_sprite.character.character_name.scan(/$/)
        height = (curr_sprite.bitmap.height / 4) / 32
        height += 1 if (curr_sprite.bitmap.height / 4) % 32 > 0
      else
        height = (curr_sprite.bitmap.height / 8) / 32
        height += 1 if (curr_sprite.bitmap.height / 8) % 32 > 0
      end
    return height
    end
    
    #========LDT Start
    def get_width(curr_sprite)
      width = 0
      if curr_sprite.character.character_name.scan(/$/)
        width = (curr_sprite.bitmap.width / 3) / 32
        width += 1 if (curr_sprite.bitmap.width / 3) % 32 > 0
      else
        width = (curr_sprite.bitmap.width / 12) / 32
        width += 1 if (curr_sprite.bitmap.width / 12) % 32 > 0
      end
    return width
    end
    #========LDT End
    #--------------------------------------------------------------------------
    # * Add Particle
    #--------------------------------------------------------------------------
    def add_particle(target, name, blend, setting, offset, v = nil, a = nil)
      particle = Particle.new(@viewport2, target, name, blend, setting, offset, v, a)
      @particles.push(particle)
    end
    end
    Allerdings gibt es auch mit dieser Lösung ein Problem: Der Charakter steht entweder vor oder hinter den Grafiken. Wenn auf deinem Bild nun ein Turm über die Füße deines Charakters ragen würde, würden die Füße über dem Turm angezeigt werden.
    Darauf musst du dann beim Mappen achten

  14. #1294
    Zitat Zitat von Linkey Beitrag anzeigen
    Moin Agura,

    hab mal schnell zwei Dinge eingebaut:
    1. Wenn der Charakter breiter als 32 Pixel ist, werden nun auch die benachbarten Felder geprüft
    2. Wenn der Charakter über einer Grafik angezeigt wird (z.B. Zaun) und sich bewegt, bleibt er solange im Vordergrund, bis er das nächste Feld erreicht hat

    [..]

    Allerdings gibt es auch mit dieser Lösung ein Problem: Der Charakter steht entweder vor oder hinter den Grafiken. Wenn auf deinem Bild nun ein Turm über die Füße deines Charakters ragen würde, würden die Füße über dem Turm angezeigt werden.
    Darauf musst du dann beim Mappen achten
    Zu 1 & 2: Super, dankeschön. Allerdings wurde das mit dem Follower wohl falsch verstanden: Wenn der Follower das Tile betritt ist alles super, wenn diese allerdings das Tile verlässt, besteht das alte Problem immer noch.

    Zu deinem angesprochen Porblem: Ja... das gilt nicht nur für einen Turm, sondern auch für Bäume, leider... Kann man mit arbeiten, allerdings gibt es den Fehler in einer anderen Form nochmal, welcher ebenfalls versucht werden muss zu umgehen oder noch gefixt werden muss.

    Es handelt sich dabei um ein Event, das ich versuchshalber am Zaun langlaufen ließ.

  15. #1295
    Hallo Agura,

    schmeiß das alte Script weg und nimm das hier, das funktioniert besser:
    Code:
    ##-----------------------------------------------------------------------------
    #  Large Sprite ☆ Display Fix v1.3
    #  Created by Neon Black at request of seita
    #  v1.4 - 12.18.14 - Added position tuning
    #  v1.3 - 1.12.14  - Viewport/position issue fixes
    #  v1.1 - 8.18.13  - Fixed an odd lag issue
    #  v1.0 - 8.17.13  - Main script completed
    #  For both commercial and non-commercial use as long as credit is given to
    #  Neon Black and any additional authors.  Licensed under Creative Commons
    #  CC BY 4.0 - http://creativecommons.org/licenses/by/4.0/
    ##-----------------------------------------------------------------------------
    
    # -- Update: LDT0319
    # -- Date:   2019.03.30
    # -- User:   D.T. Linkey
    # -- Change: Enabled Game_Followers too
    
    ##------
    ## By default, this script only affects the player.  To allow it to affect
    ## an event page as well, add a comment with the tag <large sprite> to the page
    ## of the event you would like to have affected by this.
     
    class Sprite_Character < Sprite_Base
      ##------
      ## The ID of the terrain used to display the large character above ☆ tiles.
      ## If the player is below this tile (y position), the sprite will appear
      ## above all tiles and events from that y position up.  If the player is on
      ## the same tile or above (y position) the event will appear BELOW ☆ tiles
      ## from that position up.
      ##------
      UpperTerrain = 7
     
      ##------
      ## This value is the pixel tuning used to check the location.  This is
      ## because characters tagged with a '!' in their name are drawn lower than
      ## normal characters and are considered to be lower than these.  This causes
      ## the script to think they are on the tile below where they really are and
      ## draw them above tiles they should appear under.
      ##------
      Tuning = -1
     
      alias :cp_011214_update_bitmap :update_bitmap
      def update_bitmap(*args)
        if graphic_changed? && @set_upper_area_sprite
          @force_no_gfx_change = true
        else
          @force_no_gfx_change = false
        end
        cp_011214_update_bitmap(*args)
      end
     
      ## Alias the update method to add in the new graphic check.
      alias :cp_073013_update_pos :update_position
      def update_position(*args)
        cp_073013_update_pos(*args)
        check_encompassed_area if sprite_is_onscreen?
      end
     
      ## Alias the dispose to dispose the upper sprite.
      alias :cp_073013_dispose :dispose
      def dispose(*args)
        @upper_area_sprite.dispose if @upper_area_sprite
        cp_073013_dispose(*args)
      end
     
    #~   ## Alias the graphic changed method to allow the sprite to revent to what it
    #~   ## was during the last frame.  This allows the check to work again.
    #~   alias :cp_073013_graphic_changed? :graphic_changed?
    #~   def graphic_changed?(*args)
    #~     cp_073013_graphic_changed?(*args) || @set_upper_area_sprite
    #~   end
     
      ## Check if the sprite is onscreen.  Reduces redundant drawing.
      def sprite_is_onscreen?
        #LDT0319 enabled game_follower
        return false if @character.is_a?(Game_Vehicle)
        return false unless @character.is_a?(Game_Player) || @character.is_a?(Game_Follower) || @character.large_sprite
        return false if @character.screen_z >= 200
        top_left, bot_right = get_edge_corner_dis
        return false if top_left[0] > Graphics.width
        return false if top_left[1] > Graphics.height
        return false if bot_right[0] < 0
        return false if bot_right[1] < 0
        return true
      end
     
      ## Get the top left and bottom right positions.
      def get_edge_corner_dis
        top_left = [self.x - self.ox, self.y - self.oy]
        bot_right = [top_left[0] + self.width, top_left[1] + self.height]
        return [top_left, bot_right]
      end
     
      ## Long method that checks each position and draws the upper sprite.
      def check_encompassed_area
        if @set_upper_area_sprite && !@force_no_gfx_change
          old_src = self.src_rect.clone
          self.bitmap = @old_bitmap
          self.src_rect = old_src
        end
        @set_upper_area_sprite = false
        top_left, bot_right = get_edge_corner_dis
        last_x, last_y, copy_region = nil, nil, 0
        map_xd, map_yd = $game_map.display_x * 32, $game_map.display_y * 32
        total_height = (self.height + @character.jump_height).round
        self.width.times do |x|
          xp = map_xd.to_i + top_left[0] + x
          unless xp / 32 == last_x
            last_x = xp / 32
            last_y, copy_region = nil, 0
            total_height.times do |y|
              yp = map_yd.to_i + bot_right[1] + @character.jump_height - y + Tuning
              next if yp.to_i / 32 == last_y
              last_y = yp.to_i / 32
              if last_y == (@character.screen_y + @character.jump_height + Tuning +
                            map_yd).to_i / 32
                break if $game_map.terrain_tag(last_x, last_y) == UpperTerrain
                next
              end
              next if $game_map.terrain_tag(last_x, last_y) != UpperTerrain
              copy_region = [self.height, total_height - y + 1].min
              set_upper_sprite
              break
            end
          end
          next if copy_region == 0
          rect = Rect.new(src_rect.x + x, src_rect.y, 1, copy_region)
          @upper_area_sprite.bitmap.blt(x, 0, self.bitmap, rect)
          self.bitmap.clear_rect(rect)
        end
        if !@set_upper_area_sprite && @upper_area_sprite
          @upper_area_sprite.visible = false
        end
      end
     
      ## Creates the upper sprite that's a copy of the current sprite.
      def set_upper_sprite
        return if @set_upper_area_sprite
        @upper_area_sprite ||= Sprite.new
        @upper_area_sprite.bitmap = Bitmap.new(self.width, self.height)
        props = ["x", "y", "ox", "oy", "zoom_x", "zoom_y", "angle", "mirror",
                 "bush_depth", "opacity", "blend_type", "color", "tone", "visible",
                 "viewport"]
        props.each do |meth|
          @upper_area_sprite.method("#{meth}=").call(self.method(meth).call)
        end
        @upper_area_sprite.z = 200
        @set_upper_area_sprite = true
        @old_bitmap, old_src_rect = self.bitmap, self.src_rect.clone
        self.bitmap = Bitmap.new(@old_bitmap.width, @old_bitmap.height)
        self.bitmap.blt(0, 0, @old_bitmap, @old_bitmap.rect)
        self.src_rect = old_src_rect
      end
    end
     
    class Game_Event < Game_Character
      attr_reader :large_sprite
     
      alias :cp_081713_setup_page_settings :setup_page_settings
      def setup_page_settings(*args)
        cp_081713_setup_page_settings(*args)
        get_large_sprite_conditions
      end
     
      def get_large_sprite_conditions
        @large_sprite = false
        return if @list.nil? || @list.empty?
        @list.each do |line|
          next unless line.code == 108 || line.code == 408
          case line.parameters[0]
          when /<large sprite>/i
            @large_sprite = true
          end
        end
      end
    end
    Quelle: https://forums.rpgmakerweb.com/index...lay-fix.22243/

    Mit diesem Script musst du die entsprechenden Tiles (z.B. den Zaun) auf Terrain-Tag 7 stellen.
    Ich habe das Script noch kurz angepasst, sodass es nicht nur für den Helden, sondern auch für die Follower funktioniert.

    Willst du Events ebenfalls korrekt anzeigen, musst du im Event einen Kommentar einfügen: <large sprite>

  16. #1296
    Hallo Linkey,

    vielen Dank, dieses Script funktioniert wirklich besser. Ich muss jetzt nur noch auf eine Sache beim Mappen achten (siehe Spoiler), aber sonst ist alles gut.
    Wenn du Zeit, Lust und Güte dafür hast, kannst du dir das vielleicht noch anschauen, aber sonst muss ich einfach etwas ummappen.

    Nochmals: Vielen Dank.

  17. #1297
    Ist denn nur der Zaun auf Terrain 7 gestellt oder auch die Baumkrone? Und wie ist das ganze genau gemappt?

  18. #1298
    Nur der Zaun. Die Baumkrone ist mittels einem "Above Hero"-Event ohne sonstige Anmerkungen oder Befehlen realisiert worden.

  19. #1299
    Hey Agura,

    ich habe es nun so erweitert, dass "above hero" events immer "on top" angezeigt werden:
    Code:
    ##-----------------------------------------------------------------------------
    #  Large Sprite ☆ Display Fix v1.3
    #  Created by Neon Black at request of seita
    #  v1.4 - 12.18.14 - Added position tuning
    #  v1.3 - 1.12.14  - Viewport/position issue fixes
    #  v1.1 - 8.18.13  - Fixed an odd lag issue
    #  v1.0 - 8.17.13  - Main script completed
    #  For both commercial and non-commercial use as long as credit is given to
    #  Neon Black and any additional authors.  Licensed under Creative Commons
    #  CC BY 4.0 - http://creativecommons.org/licenses/by/4.0/
    ##-----------------------------------------------------------------------------
    
    # -- Update: LDT0319
    # -- Date:   2019.03.30
    # -- User:   D.T. Linkey
    # -- Change: Enabled Game_Followers too
    
    ##------
    ## By default, this script only affects the player.  To allow it to affect
    ## an event page as well, add a comment with the tag <large sprite> to the page
    ## of the event you would like to have affected by this.
     
    class Sprite_Character < Sprite_Base
      ##------
      ## The ID of the terrain used to display the large character above ☆ tiles.
      ## If the player is below this tile (y position), the sprite will appear
      ## above all tiles and events from that y position up.  If the player is on
      ## the same tile or above (y position) the event will appear BELOW ☆ tiles
      ## from that position up.
      ##------
      UpperTerrain = 7
     
      ##------
      ## This value is the pixel tuning used to check the location.  This is
      ## because characters tagged with a '!' in their name are drawn lower than
      ## normal characters and are considered to be lower than these.  This causes
      ## the script to think they are on the tile below where they really are and
      ## draw them above tiles they should appear under.
      ##------
      Tuning = -1
     
      alias :cp_011214_update_bitmap :update_bitmap
      def update_bitmap(*args)
        if graphic_changed? && @set_upper_area_sprite
          @force_no_gfx_change = true
        else
          @force_no_gfx_change = false
        end
        cp_011214_update_bitmap(*args)
      end
     
      ## Alias the update method to add in the new graphic check.
      alias :cp_073013_update_pos :update_position
      def update_position(*args)
        cp_073013_update_pos(*args)
        check_encompassed_area if sprite_is_onscreen?
      end
     
      ## Alias the dispose to dispose the upper sprite.
      alias :cp_073013_dispose :dispose
      def dispose(*args)
        @upper_area_sprite.dispose if @upper_area_sprite
        cp_073013_dispose(*args)
      end
     
    #~   ## Alias the graphic changed method to allow the sprite to revent to what it
    #~   ## was during the last frame.  This allows the check to work again.
    #~   alias :cp_073013_graphic_changed? :graphic_changed?
    #~   def graphic_changed?(*args)
    #~     cp_073013_graphic_changed?(*args) || @set_upper_area_sprite
    #~   end
     
      ## Check if the sprite is onscreen.  Reduces redundant drawing.
      def sprite_is_onscreen?
        #LDT0319 enabled game_follower & put "above hero" events always on top
        self.z = 500 if(@character.is_a?(Game_Event) && @character.priority_type >= 2)
        return false if @character.is_a?(Game_Vehicle)
        return false unless @character.is_a?(Game_Player) || @character.is_a?(Game_Follower) || @character.large_sprite
        return false if @character.screen_z >= 200
        top_left, bot_right = get_edge_corner_dis
        return false if top_left[0] > Graphics.width
        return false if top_left[1] > Graphics.height
        return false if bot_right[0] < 0
        return false if bot_right[1] < 0
        return true
      end
     
      ## Get the top left and bottom right positions.
      def get_edge_corner_dis
        top_left = [self.x - self.ox, self.y - self.oy]
        bot_right = [top_left[0] + self.width, top_left[1] + self.height]
        return [top_left, bot_right]
      end
     
      ## Long method that checks each position and draws the upper sprite.
      def check_encompassed_area
        if @set_upper_area_sprite && !@force_no_gfx_change
          old_src = self.src_rect.clone
          self.bitmap = @old_bitmap
          self.src_rect = old_src
        end
        @set_upper_area_sprite = false
        top_left, bot_right = get_edge_corner_dis
        last_x, last_y, copy_region = nil, nil, 0
        map_xd, map_yd = $game_map.display_x * 32, $game_map.display_y * 32
        total_height = (self.height + @character.jump_height).round
        self.width.times do |x|
          xp = map_xd.to_i + top_left[0] + x
          unless xp / 32 == last_x
            last_x = xp / 32
            last_y, copy_region = nil, 0
            total_height.times do |y|
              yp = map_yd.to_i + bot_right[1] + @character.jump_height - y + Tuning
              next if yp.to_i / 32 == last_y
              last_y = yp.to_i / 32
              if last_y == (@character.screen_y + @character.jump_height + Tuning +
                            map_yd).to_i / 32
                break if $game_map.terrain_tag(last_x, last_y) == UpperTerrain
                next
              end
              next if $game_map.terrain_tag(last_x, last_y) != UpperTerrain
              copy_region = [self.height, total_height - y + 1].min
              set_upper_sprite
              break
            end
          end
          next if copy_region == 0
          rect = Rect.new(src_rect.x + x, src_rect.y, 1, copy_region)
          @upper_area_sprite.bitmap.blt(x, 0, self.bitmap, rect)
          self.bitmap.clear_rect(rect)
        end
        if !@set_upper_area_sprite && @upper_area_sprite
          @upper_area_sprite.visible = false
        end
      end
     
      ## Creates the upper sprite that's a copy of the current sprite.
      def set_upper_sprite
        return if @set_upper_area_sprite
        @upper_area_sprite ||= Sprite.new
        @upper_area_sprite.bitmap = Bitmap.new(self.width, self.height)
        props = ["x", "y", "ox", "oy", "zoom_x", "zoom_y", "angle", "mirror",
                 "bush_depth", "opacity", "blend_type", "color", "tone", "visible",
                 "viewport"]
        props.each do |meth|
          @upper_area_sprite.method("#{meth}=").call(self.method(meth).call)
        end
        @upper_area_sprite.z = 200
        @set_upper_area_sprite = true
        @old_bitmap, old_src_rect = self.bitmap, self.src_rect.clone
        self.bitmap = Bitmap.new(@old_bitmap.width, @old_bitmap.height)
        self.bitmap.blt(0, 0, @old_bitmap, @old_bitmap.rect)
        self.src_rect = old_src_rect
      end
    end
     
    class Game_Event < Game_Character
      attr_reader :large_sprite
      
      alias :cp_081713_setup_page_settings :setup_page_settings
      def setup_page_settings(*args)
        cp_081713_setup_page_settings(*args)
        get_large_sprite_conditions
      end
      
      def get_large_sprite_conditions
        @large_sprite = false
        return if @list.nil? || @list.empty?
        @list.each do |line|
          next unless line.code == 108 || line.code == 408
          case line.parameters[0]
          when /<large sprite>/i
            @large_sprite = true
          end
        end
      end
    end

  20. #1300
    Hallo Linkey,

    Absolut perfekt, on top, top notch, (insert another "top"-Joke her).
    Vielen, vielen Dank.

Berechtigungen

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