PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine XP-Script-Sammlung ...



Kelven
08.02.2014, 13:59
... für alle, die keine Lust haben Ruby zu lernen und trotzdem ein paar mehr Funktionen haben wollen, als der Maker normalerweise bietet. Es handelt sich im Grunde zwar nur um Kleinigkeiten, aber wenn man die mit dem Eventcode scripten wollte, wäre das viel umständlicher. Vielleicht kann der eine oder andere sie ja gebrauchen. Ich weiß nicht, ob die Scripte auch im VX oder Ace benutzt werden können, weil ich dessen Syntax nicht kenne. Ich hab im Code auf allzu kryptische Ausdrücke verzichtet, weil ich nichts von denen halte, wobei das für die Ruby-Uninteressierten wohl sowieso egal ist. Und mir ist bewusst, dass man die Scripte vielleicht hätte besser lösen können, z. B. indem man sie direkt bei Game_Character einbindet, aber für die Funktionalität ist das ja nicht so entscheidend. Falls es Fehler gibt, sagt bitte sofort Bescheid. Falls die Scripte Unsinn sind natürlich auch.

Um die Scripte zu benutzen, müsst ihr den Code im Spoiler in den Script-Editor einfügen:
- Script markieren und mit Strg+c kopieren
- F11 im Maker drücken
- In der linken Liste ganz nach unten zu Main scrollen
- Rechte Maustaste, Insert auswählen
- Beim neuen Eintrag einen beliebigen Namen eingeben
- Das Script im rechten Bereich mit Strg+v einfügen

Im Moment gibt es folgende Methoden:

eventInBereich(event, x1, y1, x2, y2)
Testet, ob sich das Event mit der ID 'event' innerhalb der Koordinaten befindet. Beim Event 0 wird der Held getestet. 'x1' und 'y1' sind die obere linke Ecke,
'x2' und 'y2' die untere rechte des Bereiches.

Aufrufen könnt ihr das Script so:
- im Eventcode "Conditional Branch" auswählen
- auf der letzten Seite "Script" anklicken
- Falls ihr z. B. testen wollt, ob sich Event 1 innerhalb der Koordinaten 0,0 bis 2,2 befindet, gebt ihr Folgendes ein: Sammlung.eventInBereich(1, 0, 0, 2, 2) == true
- Wenn ihr testen wollt, ob sich das Event nicht innerhalb der Koordinaten befindet, schreibt ihr: Sammlung.eventInBereich(1, 0, 0, 2, 2) == false

inReichweite(event1, event2, radius)
Testet, ob das Event mit der ID 'event1' 'radius' Felder oder weniger vom Event mit der ID 'event2' entfernt ist. Beim Event 0 wird wieder der Held genommen.

Aufrufen könnt ihr das Script so:
- im Eventcode "Conditional Branch" auswählen
- auf der letzten Seite "Script" anklicken
- Falls ihr z. B. testen wollt, ob sich Event 1 3 oder weniger Felder von Event 2 entfernt ist, gebt ihr Folgendes ein: Sammlung.inReichweite(1, 2, 3) == true
- wenn ihr testen wollt, ob Event 1 außerhalb der Entfernung ist, schreibt ihr: Sammlung.inReichweite(1, 2, 3) == false

stepTowardEvent(event1, event2)
Diese Methode funktioniert genauso wie step toward hero, nur dass ein beliebiges Event mit der ID 'event1' zum Event mit der ID 'event2' geht. Beim Event 0 wird wieder der Held genommen.

Aufrufen könnt ihr das Script so:
- im Eventcode "Script" auswählen
- falls ihr z. B. wollt, dass Event 1 zu Event 2 geht, gebt ihr Folgendes ein: Sammlung.stepTowardEvent(1, 2)
- ihr müsst danach aber je nachdem wie schnell euer Event ist selbst ein Wait eingeben (s. u. bei Schritttempo) und es wird auch nur ein einziger Schritt gemacht.




module Sammlung
# Testet, ob sich das Event 'event' innerhalb der Koordinaten
# 'x1, y1' (obere linke) Ecke und 'x2, y2' (untere rechte Ecke) befindet.
# Wenn 'event' = 0 ist, wird die Spielfigur genommen.
def self.eventInBereich(event, x1, y1, x2, y2)
if existiert(event)
x = eventKoordinate(event, 1)
y = eventKoordinate(event, 2)

if x >= x1 && x <= x2 && y >= y1 && y <= y2 then return true end
end

return false
true # Wegen Bug vom XP
end

# Ermittelt die Entfernung zwischen den beiden Events 'event1' und 'event2'.
# Die Entfernung wird in ganzen Tiles angegeben. Wenn 'event1' = 0 oder
# 'event2' = 0 sind, wird jeweils die Spielfigur genommen.
def self.eventEntfernung(event1, event2)
if existiert(event1) && existiert(event2)
x1 = eventKoordinate(event1, 1)
y1 = eventKoordinate(event1, 2)
x2 = eventKoordinate(event2, 1)
y2 = eventKoordinate(event2, 2)
return (x1-x2).abs + (y1-y2).abs
end

return nil
end

# Testet, ob das Event 'event2' 'radius' Tiles oder weniger von Event 'event1'
# entfernt ist. Wenn 'event1' = 0 oder 'event2' = 0 sind, wird jeweils
# die Spielfigur genommen.
def self.inReichweite(event1, event2, radius)
if eventEntfernung(event1, event2) <= radius then return true end

return false
true # Wegen Bug vom XP
end

# Funktioniert wie step toward hero, nur dass 'event1' zu 'event2' geht.
# Wenn 'event1' = 0 oder 'event2' = 0 sind, wird jeweils die Spielfigur
# genommen.
# Wichtig: Das Wait für die Bewegung muss manuell im Eventcode gesetzt
# werden.
def self.stepTowardEvent(event1, event2)
if existiert(event1) && existiert(event2)
# Es müssen unterschiedliche Events sein
if event1 != event2
# Grundsätzlich die gleiche Methode wie unter Game_Charakter 3,
# nur mit zwei Events.
sx = eventKoordinate(event1, 1) - eventKoordinate(event2, 1)
sy = eventKoordinate(event1, 2) - eventKoordinate(event2, 2)

if sx == 0 and sy == 0
# Koordinaten sind identisch, abbrechen
return
end
abs_sx = sx.abs
abs_sy = sy.abs
# Wenn horizontale und vertikale Entfernung gleich sind ...
if abs_sx == abs_sy
# ... eine zufällig erhöhen.
if rand(2) == 0
abs_sx += 1
else
abs_sy += 1
end
end
# Wenn die horizontale Entfernung größer ist ...
if abs_sx > abs_sy
# Bewegung nach links und rechts hat höhere Priorität
if event1 == 0
if sx > 0
$game_player.move_left
else
$game_player.move_right
end
if not $game_player.moving? && sy != 0
if sy > 0
$game_player.move_up
else
$game_player.move_down
end
end
else
if sx > 0
$game_map.events[event1].move_left
else
$game_map.events[event1].move_right
end
if not $game_map.events[event1].moving? && sy != 0
if sy > 0
$game_map.events[event1].move_up
else
$game_map.events[event1].move_down
end
end
end
# Wenn die vertikale Entfernung größer ist ...
else
# Bewegung nach unten und oben hat höhere Priorität
if event1 == 0
if sy > 0
$game_player.move_up
else
$game_player.move_down
end
if not $game_player.moving? && sx != 0
if sx > 0
$game_player.move_left
else
$game_player.move_right
end
end
else
if sy > 0
$game_map.events[event1].move_up
else
$game_map.events[event1].move_down
end
if not $game_map.events[event1].moving? && sx != 0
if sx > 0
$game_map.events[event1].move_left
else
$game_map.events[event1].move_right
end
end
end
end
end
end
end

# Hilfsmethode: Testet, ob das Event 'event' existiert.
def self.existiert(event)
if event == 0
# Spielfigur
return true
else
if $game_map.events[event] == nil
return false
else
# Event
return true
end
end
end

# Hilfsmethode: Liefert die x- oder y-Koordinate von 'event'. 'koordinate'
# kann entweder 1 oder 2 sein. Die Methode geht davon aus, dass 'event'
# existiert.
def self.eventKoordinate(event, koordinate)
if event == 0
# Spielfigur
if koordinate == 1
return $game_player.x
elsif koordinate == 2
return $game_player.y
end
else
# Event
if koordinate == 1
return $game_map.events[event].x
elsif koordinate == 2
return $game_map.events[event].y
end
end

return nil
end
end


Schritttempo (bei höchster Frequenz):
1: Slowest - Wait 32
2: Slower - Wait 16
3: Slow - Wait 8
4: Fast - Wait 4
5: Faster - Wait 2
6: Fastest - Wait 1

Cepanks
10.02.2014, 01:01
return false
true # Wegen Bug vom XP
Das bringt so aber nichts, das true wird ja nie erreicht.

Kelven
10.02.2014, 08:07
Dann tritt das Problem also nur auf, wenn man eine Variable auf false setzt? Ich war mir da nicht so sicher. Es ist auf jeden Fall so, dass der Interpreter, wenn der letzte Befehl ein false liefert, den Code nicht vernünftig ausführt.

Cornix
10.02.2014, 09:42
Dann tritt das Problem also nur auf, wenn man eine Variable auf false setzt? Ich war mir da nicht so sicher. Es ist auf jeden Fall so, dass der Interpreter, wenn der letzte Befehl ein false liefert, den Code nicht vernünftig ausführt.

Das ist nicht ganz korrekt.
Es geht darum, dass die Methode als ganzes immer ein "true" zurück liefern muss. In Ruby besitzt jede Methode einen Return-Wert, selbst diejenigen, welche kein "return" im Code stehen haben.
Der Wert der zurückgegeben wird ist dann immer die Auswertung des letzten Commandos.

Allerdings ist das natürlich nur dann relevant wenn du die Methode außerhalb des Conditional-Branches verwenden willst.
Im Übrigen ist dieses Verhalten des Interpreters im XP ein Programmierfehler soweit ich das erkennen kann. Es scheint so als würde es absolut keinem Zweck entsprechen und sei durch unachtsamkeit entstanden. Es könnte natürlich auch sein, dass ich dabei etwas übersehe, aber das scheint mir höchst unwahrscheinlich.

Mizukix
17.03.2014, 19:14
Halloa.
Ich versuche im Moment ein Script zu gestalten in dem ein Event eine Sichtlinie hat und wenn der Spieler diese berührt soll ein Event ausgelöst werden. Ich habe mir den XP neulich erst zugelegt und bin daher noch sehr frisch mit all diesen Dingen. Es wäre nett wenn mir jemand ein Tutorial oder ein Skript geben könnte. Ich habe gegoogelt bis die Finger Bluten aber nur kram für den Vx Ace gefunden.