Lieber Besucher, herzlich willkommen bei: RPG Studio - Make your World real. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

1

Samstag, 10. März 2018, 13:52

[Offen] MapTeleporter

Mahzeit,

nach dem erfolgreichen Abschluss des EnemyMapSystems :love: geht es nun an ein weiteres System, das mir
nicht-im-Verhältnis-zum-Nutzen stehende Eventarbeit abnehmen soll.

Es geht um die Teleport-Events auf Maps.
In Wäldern und Dungeons werden Mapausgänge (Teleporter) durch Pfeile gekennzeichnet. (siehe hier oben im Bild).

Und zwar funktioniert das ganze so: Ist der Spieler in einer X Tiles Reichweite (Distanzabfrage) zum Teleportevent, so ändert sich seine Opacity
kontinuierlich von 0 auf 255 (relativ schnell. Dauert max. 20 Frames). Solange der Gegner in Reichweite ist, verbleibt die Opacity des Teleportevents auf 255, sprich:
man sieht diese Pfeile am Maprand. Läuft der Spieler nun wieder aus der Reichweite, so schwindiet die Opacity in gleicher Geschwindigkeit von 255 auf 0.

Eventtechnisch ist das umständlich zu machen, wenn man möchte, dass nach Erreichen der Opacity == 255 bzw. Opacity == 0, der aktuelle Wert erhalten bleibt und
es nicht in einer Schleife dazu kommt, dass zb die Opaciy von 0 auf 255 erhöht wieder (und dann wieder von 0 auf 255). Ich hoffe, dass das Problem verständlich ist.

Eine für mich praktische Skriptlösung wäre eine ähnliche wie beim EnemyMapSystem. Ich bename alle betreffenden Events und gebe die Reichweite an, ab der sich
ihre Opacity auf 255 erhöhen sollen zB. "MapTeleporter(5)".
Die Teleport-Events starten von Haus aus mit der Opacity 0.

Ich hoffe, dass das Problem verständlich wurde. Wenn noch Fragen offen sind, einfach schreiben.

2

Samstag, 10. März 2018, 16:35

Also alles was Du möchtest ist ein Script, was im prinzip das folgende tut?

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Game_Event
  def update
    # ...
    @is_near_player = Math.abs(self.x - $game_player.x) + Math.abs(self.y - $game_player.y) < @minimal_distance
  end
end
class Sprite_Character
  def update
    #...
    if @character.teleport_event?
      if @character.near_player?
        self.opacity += 5
      else
        self.opacity -= 5
      end
    end
  end
end

Ohne Rücksicht auf urpsürnglich eingestellte Opacities von Teleport-Events? Dass sie Teleport-Events sind überschreibt alle durch MoveRoutes oder ähnliches eingestellte opacity Werte?

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

3

Samstag, 10. März 2018, 17:58

Ja, da die Teleportevents starr an den Mapgrenzen platziert sind, gibt es sowieso keine externen Quellen die die Moveroute ändern. Auf Eventbasis ist es halt bescheiden das Ganze einzustellen, da man immer noch Hilfsswitches braucht damit es nicht zu der oben erwähnten "Schleife" kommt. Zumal man das auch für jedes Event einzelnt einstellen muss.

Kommt es beim Skript zu keinem Fehler wenn die Opacity außerhalb von 0 und 255 liegt?

4

Samstag, 10. März 2018, 18:21

Laut Scientia werden Werte ausserhalb des Bereichs automatisch auf die Grenzen korrigiert: RGSS/Sprite#opacity.
Das Bezieht sich aber auf den Sprite. Game_Character kann in seiner @opacity-Variable beliebige Werte speichern, also da würde das +=5 nicht gedecklt werden, was bedeutet, dass wenn der Spieler wieder wegläuft der Char sichtbar bleibt, weil der opacity-Wert vom Game_Event über 500 liegt und es etwas dauert, bis er unter 255 sinkt und sich das auch auf dem Sprite sichtbar macht.

Hm, wo ich gerade drüber nachdenke. Du bräuchtest ja eigentlich solche Funktionen hier:
Spoiler: Quellcode

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # * Calculate City Block Distance between two Characters
  #--------------------------------------------------------------------------
  def distance_to_character( other )
    Math.abs(@x - other.x) + Math.abs(@y - other.y)
  end
  #--------------------------------------------------------------------------
  # * Calculate City Block Distance to the Player
  #--------------------------------------------------------------------------
  def distance_to_player
    Math.abs(@x - $game_player.x) + Math.abs(@y - $game_player.y)
  end
  #--------------------------------------------------------------------------
  def decrease_opacity( amount = 1 )
    @opacity -= amount
    @opacity = 0 if @opacity < 0
  end
  #--------------------------------------------------------------------------
  def increase_opacity( amount = 1 )
    @opacity += amount
    @opacity = 255 if @opacity > 255
  end
end
#==============================================================================
class Game_Player
  #--------------------------------------------------------------------------
  # * Calculate City Block Distance to the Player
  #--------------------------------------------------------------------------
  def distance_to_player
    return 0
  end
end
zum Lesen den Text mit der Maus markieren

Aber wenn Du darüber nachdenkst Dämonenseele von vorne aufzubauen - hast Du dann schonmal überlegt für alle Service-Scripte die Du so hast die selben APIs zu verwenden, statt das jedes Script sich sein eigenes Distanz-bestimmen implementiert, sein eigenes Bla implementiert? Gerade wenn Du Gegner auf der Map hast, müsste es doch schon Implementierungen für Distanz zwischen A und B geben?

Social Bookmarks