RPGVX.net

  RPG-Maker VX => VX Skripte [Fertiger Code] => Thema gestartet von: MelekTaus am Juni 26, 2009, 15:55:12

Titel: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: MelekTaus am Juni 26, 2009, 15:55:12
MelekTaus' ScrollingTeleport 0.7

Inhalt
Wie der Name schon sagt, anstatt ein Ausblenden und Wieder-Einblenden beim Spieler-Teleport zu verwenden, kann man nun auch den altbekannten Scroll-Übergang nutzen.
UPDATE: Man kann jetzt jede Map-Größe verwenden, trotzdem würde ich empfehlen die Demo zu laden, weil man doch eine Kleinigkeit beachten muss.

Anleitung
Eigentlich relativ simple:

Hinweis

Script
#==============================================================================
# MelekTaus' ScrollingTeleport
# Version: 0.7
#==============================================================================
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  SCROLLING_TELEPORT_SWITCH_ID = 1
  SCROLLING_MAP_X_SPEED = 8
  SCROLLING_MAP_Y_SPEED = 6
  #--------------------------------------------------------------------------
end
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  attr_reader :scrolling_teleport_direction
  #--------------------------------------------------------------------------
  def get_display_x(x = $game_player.x)
    return 0 if x < 9
    return width - 17 if x > width - 9
    return x - 8
  end
  #--------------------------------------------------------------------------
  def get_display_y(y = $game_player.y)
    return 0 if y < 7
    return height - 13 if y > height - 7
    return y - 6
  end
  #--------------------------------------------------------------------------
  def get_screen_x(x = $game_player.x)
    return adjust_x(x * 256) / 256
  end
  #--------------------------------------------------------------------------
  def get_screen_y(y = $game_player.y)
    return adjust_y(y * 256) / 256
  end
  #--------------------------------------------------------------------------
  def setup(map_id, scrolling_teleport_direction = 0, x = nil, y = nil)
    @old_map_id = @map_id
    @old_map = @map
    @old_map_x = get_display_x
    @old_map_y = get_display_y
    @map_id = map_id
    @map = load_data(sprintf("Data/Map%03d.rvdata", @map_id))
    if scrolling_teleport_direction > 0
      @map_x = get_display_x(x)
      @map_y = get_display_y(y)
      build_scroll_map(scrolling_teleport_direction)
    else
      @display_x = 0
      @display_y = 0
      @passages = $data_system.passages
      referesh_vehicles
      setup_events
      setup_scroll
      setup_parallax
      @need_refresh = false
    end
  end
  #--------------------------------------------------------------------------
  def build_scroll_map(scrolling_teleport_direction)
    if scrolling_teleport_direction > 2 and scrolling_teleport_direction < 8
      new_map = RPG::Map.new(34, 13)
      new_map.data = Table.new(34, 13, 3)
      for x in 0...17
        for y in 0...13
          for z in 0...3
            if scrolling_teleport_direction == 6
              new_map.data[x, y, z] = @old_map.data[@old_map_x+x, @old_map_y+y, z]
            else
              new_map.data[x, y, z] = @map.data[@map_x+x, @map_y+y, z]
            end
          end
        end
      end
      for x in 0...17
        for y in 0...13
          for z in 0...3
            if scrolling_teleport_direction == 6
              new_map.data[x + 17, y, z] = @map.data[@map_x+x, @map_y+y, z]
            else
              new_map.data[x + 17, y, z] = @old_map.data[@old_map_x+x, @old_map_y+y, z]
            end
          end
        end
      end
    else
      new_map = RPG::Map.new(17, 26)
      new_map.data = Table.new(17, 26, 3)
      for x in 0...17
        for y in 0...13
          for z in 0...3
            if scrolling_teleport_direction == 2
              new_map.data[x, y, z] = @old_map.data[@old_map_x+x, @old_map_y+y, z]
            else
              new_map.data[x, y, z] = @map.data[@map_x+x, @map_y+y, z]
            end
          end
        end
      end
      for x in 0...17
        for y in 0...13
          for z in 0...3
            if scrolling_teleport_direction == 2
              new_map.data[x, y + 13, z] = @map.data[@map_x+x, @map_y+y, z]
            else
              new_map.data[x, y + 13, z] = @old_map.data[@old_map_x+x, @old_map_y+y, z]
            end
          end
        end
      end
    end
    temp_map = @map
    @map = new_map
    new_events = {}
    index = 0
    for i in @events.keys
      if @events[i].x >= @old_map_x and @events[i].x < @old_map_x + 17
      if @events[i].y >= @old_map_y and @events[i].y < @old_map_y + 13
        @events[i].event.x = @events[i].x - @old_map_x
        @events[i].event.x += 17 if scrolling_teleport_direction == 4
        @events[i].event.y = @events[i].y - @old_map_y
        @events[i].event.y += 13 if scrolling_teleport_direction == 8
        new_events[index += 1] = Game_Event.new(@map_id, @events[i].event)
        new_events[index].set_direction(@events[i].direction)
        new_events[index].wait_count = 800
      end; end
    end
    for i in temp_map.events.keys
      if temp_map.events[i].x >= @map_x and temp_map.events[i].x < @map_x + 17
      if temp_map.events[i].y >= @map_y and temp_map.events[i].y < @map_y + 13
        temp_map.events[i].x -= @map_x
        temp_map.events[i].x += 17 if scrolling_teleport_direction == 6
        temp_map.events[i].y -= @map_y
        temp_map.events[i].y += 13 if scrolling_teleport_direction == 2
        new_events[index += 1] = Game_Event.new(@map_id, temp_map.events[i])
        new_events[index].wait_count = 800
      end; end
    end
    @events = new_events
  end
  #--------------------------------------------------------------------------
end
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  attr_reader   :event
  attr_accessor :wait_count
  #--------------------------------------------------------------------------
end
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  def perform_transfer(scrolling_teleport_direction = 0)
    if scrolling_teleport_direction > 0 and $game_map.map_id == @new_map_id
      $game_map.setup(@new_map_id)
      @new_x = 0 if scrolling_teleport_direction == 6
      @new_x = $game_map.width - 1 if scrolling_teleport_direction == 4
      @new_y = 0 if scrolling_teleport_direction == 2
      @new_y = $game_map.height - 1 if scrolling_teleport_direction == 8
      moveto(@new_x, @new_y)
    else
      return unless @transferring
      @transferring = false
      set_direction(@new_direction)
      x = @new_x
      y = @new_y
      s_dir = scrolling_teleport_direction
      if $game_map.map_id != @new_map_id
        $game_map.setup(@new_map_id, s_dir, x, y)
      end
      case s_dir
      when 2
        x = $game_map.get_screen_x
        y = 12
      when 4
        x = 17
        y = $game_map.get_screen_y
      when 6
        x = 16
        y = $game_map.get_screen_y
      when 8
        x = $game_map.get_screen_x
        y = 13
      end
      moveto(x, y)
    end
  end
  #--------------------------------------------------------------------------
  def move_slowly_forward(scrolling_teleport_direction)
    case scrolling_teleport_direction
      when 2;  s_dir = 16
      when 4;  s_dir = 17
      when 6;  s_dir = 18
      when 8;  s_dir = 19
    end
    move_route = RPG::MoveRoute.new
    move_route.repeat = false
    move_route.list[0] = RPG::MoveCommand.new(s_dir)
    move_route.list[1] = RPG::MoveCommand.new(29, [2])
    move_route.list[2] = RPG::MoveCommand.new(12)
    move_route.list[3] = RPG::MoveCommand.new(15, [100])
    move_route.list[4] = RPG::MoveCommand.new(0)
    force_move_route(move_route)
  end
  #--------------------------------------------------------------------------
  def share_input
    move_route = RPG::MoveRoute.new
    move_route.repeat = false
    move_route.list[0] = RPG::MoveCommand.new(29, [4])
    move_route.list[1] = RPG::MoveCommand.new(0)
    force_move_route(move_route)
  end
  #--------------------------------------------------------------------------
end
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  def update_viewports
    @viewport1.tone = $game_map.screen.tone
    @viewport2.color = $game_map.screen.flash_color
    @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
    @viewport1.update
    @viewport2.update
    @viewport3.update
  end
  #--------------------------------------------------------------------------
  def x;          return @viewport1.ox;   end
  #--------------------------------------------------------------------------
  def x=(value);  @viewport1.ox = value;  end
  #--------------------------------------------------------------------------
  def y;          return @viewport1.oy;   end
  #--------------------------------------------------------------------------
  def y=(value);  @viewport1.oy = value;  end
  #--------------------------------------------------------------------------
end
#==============================================================================
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  attr_accessor :scrolling_teleport_direction
  #--------------------------------------------------------------------------
  def initialize
    @scrolling_teleport_direction = 0
    @update_scrolling_teleport = 0
  end
  #--------------------------------------------------------------------------
  alias melektaus_scene_map_update update
  def update
    melektaus_scene_map_update
    update_scrolling_teleport
  end
  #--------------------------------------------------------------------------
  def update_transfer_player
    return unless $game_player.transfer?
    s_dir = 0
    if $game_switches[SCROLLING_TELEPORT_SWITCH_ID]
      p = $game_player
      s_dir = 4 if p.x == 0
      s_dir = 6 if p.x == $game_map.width - 1
      s_dir = 8 if p.y == 0
      s_dir = 2 if p.y == $game_map.height - 1
    end
    @scrolling_teleport_direction = s_dir
    if s_dir > 0
      @spriteset.dispose
      $game_player.perform_transfer(s_dir)
      @spriteset = Spriteset_Map.new
      case s_dir
        when 2;  @spriteset.y = -192
        when 4;  @spriteset.x = 256
        when 6;  @spriteset.x = -256
        when 8;  @spriteset.y = 192
      end
      $game_player.move_slowly_forward(s_dir)
      @update_scrolling_teleport = 1
    else
      fade = (Graphics.brightness > 0)
      fadeout(30) if fade
      @spriteset.dispose
      $game_player.perform_transfer
      $game_map.autoplay
      $game_map.update
      Graphics.wait(15)
      @spriteset = Spriteset_Map.new
      fadein(30) if fade
      Input.update
    end
  end
  #--------------------------------------------------------------------------
  def update_scrolling_teleport
    s_dir = @scrolling_teleport_direction
    if @update_scrolling_teleport == 1
      case s_dir
      when 2
        @spriteset.y += SCROLLING_MAP_Y_SPEED
        @spriteset.y = 192 if @spriteset.y > 192
        @update_scrolling_teleport = 2 if @spriteset.y == 192
      when 4
        @spriteset.x -= SCROLLING_MAP_X_SPEED
        @spriteset.x = -256 if @spriteset.x < -256
        @update_scrolling_teleport = 2 if @spriteset.x == -256
      when 6
        @spriteset.x += SCROLLING_MAP_X_SPEED
        @spriteset.x = 256 if @spriteset.x > 256
        @update_scrolling_teleport = 2 if @spriteset.x == 256
      when 8
        @spriteset.y -= SCROLLING_MAP_Y_SPEED
        @spriteset.y = -192 if @spriteset.y < -192
        @update_scrolling_teleport = 2 if @spriteset.y == -192
      end
    end
    if @update_scrolling_teleport == 2
      @spriteset.dispose
      $game_player.perform_transfer(s_dir)
      $game_map.autoplay
      $game_map.update
      @spriteset = Spriteset_Map.new
      Input.update
      $game_player.share_input
      @scrolling_teleport_direction = 0
      @update_scrolling_teleport = 0
    end
  end
  #--------------------------------------------------------------------------
end
#==============================================================================

Demo
MelekTaus' ScrollingTeleport.zip (http://www.mediafire.com/file/yre1zmtfmzz/MelekTaus' ScrollingTeleport.zip)

Zukünftige Verbesserungen


MfG, MelekTaus
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Herendil am Juni 26, 2009, 16:21:12
Sieht super aus! Sehr schön, das könnte ich echt gebrauchen. Ich freue mich auf den Ptach, weil Maps meist größer sind als 17*13 :D
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Geoflare am Juni 26, 2009, 21:34:25
Hort sich sehr toll an freu mich auf Update

Geoflare
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Nizuke am Juni 26, 2009, 21:51:42
Nicht schlecht, dafür, dass es eines deiner ersten Beiträge ist, ist er ziemlich Brauchbar.
Das Script ist nicht schlecht, allerdings werde ich es, wenn überhaupt erst dann verwenden, wenn es
sozusagen makellos ist. (Habs mal in nem test-projekt ausprobiert).

Weiter so! ^^

-Edit-

Ja, wie Papilion es sagt... Ich hätte jetzt auch nicht unbedingt die Lust, alles umzumappen.

@Papilion: Das DU diese Zelda Übergänge brauchst war mir klar =D
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Prince am Juni 27, 2009, 09:06:33
Klasse, solche Übergänge sind eh besser als die teleports ^^
Ich werds mit Sicherheit (sobald ich ein neues Projekt anfange ^^) verwenden

MfG
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: papilion am Juni 27, 2009, 09:31:53
Haa! super!
Das hat mir noch gefehlt!
Sobalt es auch für größere Maps geht, werde ichs auch einsetzen.

Weil ,
alles umbauen, wäre jetzt auch nicht mein Fall^^

Papilion
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Bilbo am Juni 27, 2009, 16:00:05
Sowas habe ich gesucht, danke, allerdings warte ich auch noch auf das Update, weil meine Maps auch größer sind als 17x13 ^^

Aber auf jeden Fall klasse!

MfG
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Colonios am Juni 27, 2009, 16:08:24
Ich hab es auch ausgetestet und es ist wirklich nice :D nur 2 sachen stören mich: 1. das schon erwähnte, dass die Maps größer sein sollten und 2. dass man nicht auf irgenteine stelle der map teleportieren kann.

Zu 2.: Du könntest ja noch eine Funktion einbauen, die Filmlike ist - also einen Umbruch álla Windows Moviemaker, den man selbst bestimmen kann (zB.: der effeckt "Rechteck" oder "Kreis")

Ist das möglich?

*Wunschliste* xD

MfG
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: MelekTaus am Juni 27, 2009, 16:46:23
Also, morgen werde ich mich hinsetzen und es so anpassen, dass es auf jeder Map-Größe funktioniert^^

@Colonios: Naja, auf irgendeine Stelle teleportieren wird es nicht geben, weil es ja nicht im Sinne des Scripts ist. Die Technik des Scripts ist die, dass während des ScrollingTeleports die zweite Map geladen und der vorherigen Map angehängt wird (das ist nämlich das Schwierige gewesen^^). Das Einzige, was man sich nachher schon aussuchen kann ist, wo genau am Rand (zB am oberen Rand weiter rechts, oder weiter links ;))

Das mit den Effekten ist jedoch locker machbar, das klingt gut (und da kann man sich dann schon aussuchen wo man hinteleportieren will :P)
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Colonios am Juni 27, 2009, 17:26:06
Ich meinte das ja auch nicht im scrolling style, sondern halt im "fade" style ^^

Aber cool, dass du dich dem annimmst ;)
Titel: Re: MelekTaus' ScrollingTeleport 0.6 (Zelda-Like^^)
Beitrag von: Onkel Hell am Juni 27, 2009, 17:31:00
nette umsetzung,
da ich selbst ein zelda scrolling hab meine empfehlung an dich is das mit dem use_scrolling_teleport genau anders rum zu machen
also das der scrolling teleport der standard teleport is und man für nen normalen teleport nur nen schalter umlegen muss
macht die sache einfacher und erhöht die usability
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: xelawebdev am Juni 29, 2009, 02:37:41
Find ich auch super das Script, aber das mit Switch OFF funktioniert nicht bei mir, also im Demo schon, weiss aber nicht woran das liegt.
Habe Switch OFF wenn ich aus dem Wald in die Worldmap rausgehe, aber dennoch teleportiert er wie mit Switch ON.
Brauch Hilfe xD
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: Kyoshiro am Juni 29, 2009, 09:22:12
Sehr schönes Script, habe mir eben mal die Demo angeguckt und ich finde es sehr interessant.
Da ich das aber nicht unbedingt für ein Projekt brauche weiß ich noch nicht ob ich es nutze.
Für Zeldaspiele oder generell Spiele mit AKS ist es aber sicherlich eine gute Wahl. :)

Kyoshiro
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: Colonios am Juni 29, 2009, 13:39:47
Also so wie ich das sehe müssen die Maps die gleiche Höhe bzw. Breite haben (je nach dem wo der Teleport ist), damit der Teleport richtig funktioniert, oder?

MfG
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: MelekTaus am Juni 29, 2009, 14:47:57
Nicht unbedingt^^ Die Teleporter sollten immer Kamera-abhängig platziert werden:

Sprich: bewegt man sich im mittleren Bereich der Map so befindet sich der Spieler genau in der Mitte vom Screen, also sollte es auch nach dem Teleport auch so aussehen. Wenn der Spieler 2 Kästchen vom Rand entfernt ist, so muss er auch nach dem Teleport ebenfalls 2 Kästchen entfernt sein, weil die Kamera genau so verschoben ist.
Man muss es halt einfach nur ausprobieren, dann kommt man auch dahinter ;)

Ich hoffe, dass war jetzt irgendwie verständlich :)

MfG, MelekTaus
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: Kiige am Juli 05, 2009, 17:29:51
also ich bin jetzt auch mal dazu gekommen mir die Demo anzuschauen
und ich bin absolut fasziniert ^^

am besten wäre es noch wenn die position von events gespeichert werden ^^
ich hab nen script gesehn dass das kann also müsste es reintheoretisch möglich sein
aber es sieht auch schon so absolut genial aus ^^

ich wünschte ich hätte ein Projekt wo ich das nutzen könnte XD
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: Prince am Juli 07, 2009, 20:20:29
Ähm ich hab ma die neue Demo gezogen und versucht, aber irgendiwe steht da wenn ich nen transfer starte steht das: siehe anhang
Hilfe bitte.

MfG Prince

[gelöscht durch Administrator]
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: MelekTaus am Juli 07, 2009, 23:10:57
Also, du brachst keine "use_scrolling_teleport"-Methode per Event-Script aufrufen (jetzt nicht mehr, seit dem update^^)

mit SCROLLING_TELEPORT_SWITCH_ID (am Anfang vom Script) legst du einen Control-Switch fest mit dem du dann steurst ob du den Scrolling-Übergang verwendest oder nicht ;)

MfG, MelekTaus
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: Prince am Juli 08, 2009, 09:23:12
Upps, habs ganz vergessen zu entfernen ^^ Danke für die Hilfe, jetzt läufts zwar aber sie selbst. Gibts nen Weg das zu umgehen? (und zwar außer der Methode die Maps einfach anzupassen)

MfG Prince

[gelöscht durch Administrator]
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: MelekTaus am Juli 08, 2009, 12:14:31
Da muss ich mir echt noch etwas einfallen lassen, das Problem ist nämlich folgendes (ich versuche es mal bildlich darzustellen)

(http://img149.imageshack.us/img149/8709/scrollingproblem.png)

Die Frage ist nun was soll ich im "? ? ? ?"-Bereich darstellen (theoretisch muss sich die Kamera verschieben^^)
Wie gesagt ich muss mir was einfallen lassen ;)

MfG, MelekTaus
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: Kiige am Juli 08, 2009, 12:21:53
naja ich finds nich wirklich toll wenn man da jetz was künstliches hinsetzt
einfach die map vergrößern is doch kein problem
wenn man dort jetz einen platz halter hinsetzt sieht das nur unpassend aus

ansonsten lässt du einfach vorher die kamera nochmal umschwenken damit es passt
in seinem fall heißt das bevor der teleport startet schiebst die kamera noch künstlich runter
damits zur anderen passt, is eher die frage ob das nich zu kompliziert ist
ansonsten kann man das in den events auch selber machen
Titel: Re: MelekTaus' ScrollingTeleport 0.7 (Zelda-Like^^)
Beitrag von: xelawebdev am Juli 24, 2009, 00:51:49
Also Malek, ich würde vorschlagen so zu machen das es irgendwas automatisch generiert in dieses Feld, z.B Wald-->Wald2 kleiner als Wald aber im Feld Bäume (aus dem Wald), natürlich ist es wieder eingegrenzt, wenn man aus Wald-->Stadt kommt als Beispiel, aber wenn man es aussuchen kann das Set was generiert werden soll ist das doch eig. ok.
So bisschen Mapping Arbeit ist doch wirklich nichts schlimmes für soein Script^^

SimplePortal 2.3.3 © 2008-2010, SimplePortal