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: Di Mär 03, 2020 2:57

Alle Zeiten sind UTC + 1 Stunde



Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Kampfanimation auf der Overworld
BeitragVerfasst: Di Feb 28, 2012 21:28 
Nach längerer Zeit melde ich mich mal wieder mit einer Bitte bzw. auch Auskunft an Euch^^

Und zwar geht es mir darum (wie es der Titel auch schon andeutet), eine Animation, die ich im Editor erstellt habe, auf der Overworld abspielen zu lassen (um genau zu sein, es sind Fussabdrücke).
Die Animation selbst kann ich bereits darstellen lassen, das Problem hierbei ist, sie wird nicht hinter dem Spieler, sondern auf ihm abgespielt - am Beispiel der Fussabdrücke sieht man diese auf seinem Kopf...

Soll so natürlich nicht sein, was mich verwundert ist die Frage, wieso?
Wenn ich normale Grafiken einblenden lasse oder auch Autotiles läuft doch auch der Spieler darüber hinweg, und auch bei fogs könnte ich es im Skript so einstellen, dass diese den Spieler nicht verdecken (halt einfach mit der Z-Koordinate spielen).


Also entweder sehe ich den Befehl vor lauter Code nicht mehr, oder man muss was dazu skripten.
Kann mir da jemand behilflich sein?
Natürlich könnte ich auch jedesmal vom Skript ein Event erstellen lassen, wenn der Spieler im Sand läuft, und dieses einfach "trough" setzen und ein Charset abspielen lassen, aber bei einer grösseren Sandmap würde das Spiel schnell anfangen zu laggen, wenn dauernd neue Events erstellt werden.


Hat da jemand eine gute Idee?


Danke für Euer Feedback und Eure Bemühungen^^


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Schweizer Reiter
Schweizer Reiter
Benutzeravatar
Beiträge: 379
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Di Feb 28, 2012 22:16 
Die Animationen hängen direkt am Objekt dran, da sich die Sprite_Character-Klasse von der Klasse RPG::Sprite ableitet, die die Animation darstellt. (Die Klasse ist nur intern vorhanden, kann aber in der Hilfe gefunden und einfach ins Skript kopiert werden um sie zu verändern)
Am Einfachsten wäre es aber, wenn du eine neue Klasse als Ableitung dieser erstellt, und dessen Z-Wert auf 2000 unter dem Spieler setzt und ihm folgen lässt.

_________________


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Mi Feb 29, 2012 15:02 
TheWhiteShadow hat geschrieben:
Die Animationen hängen direkt am Objekt dran, da sich die Sprite_Character-Klasse von der Klasse RPG::Sprite ableitet, die die Animation darstellt. (Die Klasse ist nur intern vorhanden, kann aber in der Hilfe gefunden und einfach ins Skript kopiert werden um sie zu verändern)
Am Einfachsten wäre es aber, wenn du eine neue Klasse als Ableitung dieser erstellt, und dessen Z-Wert auf 2000 unter dem Spieler setzt und ihm folgen lässt.


Erst einmal danke für die schnelle Antwort.
Du wirst lachen, aber bei der Suche nach dem richtigen Code bin ich auch schon darüber gestolpert... das erklärt wohl auch, wieso beim Erstellen eines neuen Spielers-Charsets über dem alten, die Animation unter dem neuen Charset auftaucht - dass diese ans Objekt gebunden ist erklärt einiges.

Ich habe auch schon versucht die Z-Koordinaten im Skript umzustellen (Standardmässig sind diese ja auf 2000), aber es hat trotzdem nichts gebracht.
Der erstellt automatisch die Animation über dem Spieler... vielleicht hab ich ja auch etwas übersehen, trotzdem danke für die Hilfe^^


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Do Mär 01, 2012 20:30 
Entweder bin ich zu dämlich dafür oder ich seh echt den Code vor lauter Skripts nicht mehr...
Die Klasse ist drin (bzw. auch das Modul RPG und die Klasse Sprite < ::Sprite), aber wie definiere ich nun, dass die Animation unter dem Spieler gesetzt werden soll?
Dann müsste ich das Ganze doch nicht vom Spieler abhängig machen (da die Animation ja automatisch, egal wie gross der Z-Wert ist auf dem Spieler platziert wird - ausser natürlich Z ist negativ) sondern vom Tileset bzw. von der Event-Fläche wo es gerade stattfindet... oder kann es sein, dass wenn ich das aktuelle Event nehme, das Skript automatisch den Spieler nimmt, da dieser sich ja auf den Koordinaten befindet wenn die Animation ausgelöst werden soll?

Dann wäre es interessant zu wissen wie sich Autotiles verhalten, da diese ja auch Animationen sind, sich aber nur auf das Tileset beziehen, oder?


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Schweizer Reiter
Schweizer Reiter
Benutzeravatar
Beiträge: 379
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Do Mär 01, 2012 23:51 
Das Skript nimmt nicht automatisch den Spieler. Der Bezugs-Charakter gibt an wer die Animation ausführen soll.
Standart ist nur über dem Charakter. Wo genau welcher Z-Wert gesetzt wird und die Relationen dazu weiß ich grad nicht. Hatte diese Woche auch nicht viel Zeit.

Wenn du noch bis zum WE warten kannst, kann ich sicher was zusammenschneidern.

Autotiles werten intern gemanaged, da hat man keinen Zugriff drauf.

_________________


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Fr Mär 02, 2012 15:01 
TheWhiteShadow hat geschrieben:
Das Skript nimmt nicht automatisch den Spieler. Der Bezugs-Charakter gibt an wer die Animation ausführen soll.
Standart ist nur über dem Charakter. Wo genau welcher Z-Wert gesetzt wird und die Relationen dazu weiß ich grad nicht. Hatte diese Woche auch nicht viel Zeit.

Wenn du noch bis zum WE warten kannst, kann ich sicher was zusammenschneidern.

Autotiles werten intern gemanaged, da hat man keinen Zugriff drauf.


Da wäre ich wirklich sehr froh darum, vielen Dank^^
Ich schau mich derweil weiter im Code herum, denn es ist interessant wie verschiedenen Klassen voneinander abhängig sind und Funktionen von den Modulen integrieren, auch wenn der Zusammenhang nicht sofort ersichtlich ist.


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Schweizer Reiter
Schweizer Reiter
Benutzeravatar
Beiträge: 379
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: So Mär 04, 2012 18:57 
So, ich hab mal was provisorisches zusammengebaut.
Beide Skripte in eine leere Seite über der Main-Seite einfügen.
Im 2. hast du ganz unten zwei mal "$game_variables[1]" stehen. Die Zahl dort steht für eine Spielvariable, wo her die Animations-ID genommen wird. Diese kannst du beliebig anpassen.
Die Animation wird kontinuierlich wiederholt, solange die Variable größer 0 ist.

Die Animation wird nur "unter" dem Spieler angezeigt.
Kampfanimationen funktionieren weiterhin normal. (So weit getestet)
Code:
module RPG
  class Sprite < ::Sprite
    def initialize(viewport = nil)
      super(viewport)
      @_whiten_duration = 0
      @_appear_duration = 0
      @_escape_duration = 0
      @_collapse_duration = 0
      @_damage_duration = 0
      @_animation_duration = 0
      @_blink = false
      @loop_z = 2000
    end
    #--------------------------------------------------------------------------
    def animation_set_sprites(sprites, cell_data, position)
      for i in 0..15
        sprite = sprites[i]
        pattern = cell_data[i, 0]
        if sprite == nil or pattern == nil or pattern == -1
          sprite.visible = false if sprite != nil
          next
        end
        sprite.visible = true
        sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
        if position == 3
          if self.viewport != nil
            sprite.x = self.viewport.rect.width / 2
            sprite.y = self.viewport.rect.height - 160
          else
            sprite.x = 320
            sprite.y = 240
          end
        else
          sprite.x = self.x - self.ox + self.src_rect.width / 2
          sprite.y = self.y - self.oy + self.src_rect.height / 2
          sprite.y -= self.src_rect.height / 4 if position == 0
          sprite.y += self.src_rect.height / 4 if position == 2
        end
        sprite.x += cell_data[i, 1]
        sprite.y += cell_data[i, 2]
        sprite.z = @loop_z
        sprite.ox = 96
        sprite.oy = 96
        sprite.zoom_x = cell_data[i, 3] / 100.0
        sprite.zoom_y = cell_data[i, 3] / 100.0
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
        sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
        sprite.blend_type = cell_data[i, 7]
      end
    end
  end
end

Code:
class Sprite_Character
  def update
    super
    # If tile ID, file name, or hue are different from current ones
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_hue != @character.character_hue
      # Remember tile ID, file name, and hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      # If tile ID value is valid
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      # If tile ID value is invalid
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    # Set visible situation
    self.visible = (not @character.transparent)
    # If graphic is character
    if @tile_id == 0
      # Set rectangular transfer
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    # Set sprite coordinates
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    # Set opacity level, blend method, and bush depth
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    # Animation
    if @character.animation_id != 0
      @loop_z = 2000
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
    if @character == $game_player and
        $game_variables[1] > 0 and
        @_animation_duration == 0
      @loop_z = 0
      loop_animation($data_animations[$game_variables[1]])
    end
  end
end


viel spaß

_________________


Nach oben
 Profil  
Mit Zitat antworten  
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: So Mär 04, 2012 20:32 
TheWhiteShadow hat geschrieben:
So, ich hab mal was provisorisches zusammengebaut.
Beide Skripte in eine leere Seite über der Main-Seite einfügen.
Im 2. hast du ganz unten zwei mal "$game_variables[1]" stehen. Die Zahl dort steht für eine Spielvariable, wo her die Animations-ID genommen wird. Diese kannst du beliebig anpassen.
Die Animation wird kontinuierlich wiederholt, solange die Variable größer 0 ist.

Die Animation wird nur "unter" dem Spieler angezeigt.
Kampfanimationen funktionieren weiterhin normal. (So weit getestet)
Code:
module RPG
  class Sprite < ::Sprite
    def initialize(viewport = nil)
      super(viewport)
      @_whiten_duration = 0
      @_appear_duration = 0
      @_escape_duration = 0
      @_collapse_duration = 0
      @_damage_duration = 0
      @_animation_duration = 0
      @_blink = false
      @loop_z = 2000
    end
    #--------------------------------------------------------------------------
    def animation_set_sprites(sprites, cell_data, position)
      for i in 0..15
        sprite = sprites[i]
        pattern = cell_data[i, 0]
        if sprite == nil or pattern == nil or pattern == -1
          sprite.visible = false if sprite != nil
          next
        end
        sprite.visible = true
        sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
        if position == 3
          if self.viewport != nil
            sprite.x = self.viewport.rect.width / 2
            sprite.y = self.viewport.rect.height - 160
          else
            sprite.x = 320
            sprite.y = 240
          end
        else
          sprite.x = self.x - self.ox + self.src_rect.width / 2
          sprite.y = self.y - self.oy + self.src_rect.height / 2
          sprite.y -= self.src_rect.height / 4 if position == 0
          sprite.y += self.src_rect.height / 4 if position == 2
        end
        sprite.x += cell_data[i, 1]
        sprite.y += cell_data[i, 2]
        sprite.z = @loop_z
        sprite.ox = 96
        sprite.oy = 96
        sprite.zoom_x = cell_data[i, 3] / 100.0
        sprite.zoom_y = cell_data[i, 3] / 100.0
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
        sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
        sprite.blend_type = cell_data[i, 7]
      end
    end
  end
end

Code:
class Sprite_Character
  def update
    super
    # If tile ID, file name, or hue are different from current ones
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_hue != @character.character_hue
      # Remember tile ID, file name, and hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      # If tile ID value is valid
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      # If tile ID value is invalid
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    # Set visible situation
    self.visible = (not @character.transparent)
    # If graphic is character
    if @tile_id == 0
      # Set rectangular transfer
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    # Set sprite coordinates
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    # Set opacity level, blend method, and bush depth
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    # Animation
    if @character.animation_id != 0
      @loop_z = 2000
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
    if @character == $game_player and
        $game_variables[1] > 0 and
        @_animation_duration == 0
      @loop_z = 0
      loop_animation($data_animations[$game_variables[1]])
    end
  end
end


viel spaß


Danke, das hilft mir sehr!^^

Ich hab den Code auch mal schnell überflogen und muss mir im nachhinein an die Stirn klatschen - dass ich die Änderung der Z-Koordinaten in der Sprite_Character Klasse machen muss, auf die Idee bin ich natürlich nicht gekommen... aber eine Frage noch: Muss die Klasse Sprite_Character nicht von RPG::Sprite erben, um die Variable @loop_z zu ändern?

also
class Sprite_Character < RPG::Sprite
statt
class Sprite_Character

Sonst bringt auch der Befehl super in der Klasse nichts, oder?


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Official Oldschool
Official Oldschool
Benutzeravatar
Beiträge: 8917
Alter: 31
Wohnort: BRD, Thüringen
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: So Mär 04, 2012 21:03 
Das ist doch der Fall. Du musst die Superklasse nur beim erstmaligen Definieren der Klasse angeben. Danach ist die Angabe optional.

_________________


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: So Mär 04, 2012 21:09 
Stimmt, mein Fehler, sie existiert ja bereits^^ Danke.


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Sayjaman
Sayjaman
Benutzeravatar
Beiträge: 50
Alter: 31
Wohnort: Frauenfeld (CH)
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Mo Mär 12, 2012 14:01 
Ich hab das ganze nochmals getestet, aber sehe mich mit neuen Problemen konfrontiert.
Die Animation wird solange ausgeführt wie die Variable grösser als 0 ist, aber im Skript gibt es doch gar keinen Befehl, der die Variable verändern würde, bzw. sie bleibt doch immer gleich gross.
Ein anderes Problem ist die Tatsache, dass die Animation immer auf den gleichen Koordinaten ist wie der spieler, es wirkt also mehr wie ein Schatten als ein Sandabdruck der Füsse, welche ja auf dem Sand einige Zeit sichtbar bleiben, auch wenn sich der Spieler weiterbewegt.

Ist das so geplant oder ein Kopierfehler meinerseits?


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Offline
Schweizer Reiter
Schweizer Reiter
Benutzeravatar
Beiträge: 379
 Betreff des Beitrags: Re: Kampfanimation auf der Overworld
BeitragVerfasst: Mo Mär 19, 2012 0:16 
Ja, das ist ja genau der Punkt, an dem DU etwas machen solltest.
$game_variables[1] bezieht sich auf die Variablen, die man auch bei den Event-befehlen benutzt.

Und das Die Animation dem Helden folgt ist normal.

Das was du da beschreibts ist eher eine Art Partikeleffekt.
So etwas lässt sich ohne große Mühe in einem eigenes Skript nicht umsetzten, da der Maker so etwas nicht ansatzweise unterstützt.

_________________


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 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