Dear visitor, welcome to RPG Studio - Make your World real. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Tuesday, September 30th 2014, 9:36am

Sound starten und beenden wenn Held x Schritte entfernt

Hallo zusammen,

ich hab ein kleines Problem. Wie die Überschrift schon saggt, bin ich auf der Suche nach der
Umserzung für das Szenario, das ein Sound automatisch anfangen soll,
wenn der Held eine bestimmte Schrittanzahl davon entfernt ist. Konkrekt
geht es um den Busbahnhof. Wenn der Held also eine gewisse Anzahl an
Schritten von den Bussen entfernt ist, soll man die Bussmotoren hören, wenn er sich von Bus entfernt wird der Sound leiser.

Den ersten Teil hab ich geschafft, aber ich krieg den zweiten Teil nicht auf die Reihe, sprich: der Sound hört nicht auf, nur weil sich der Held vom Event wegbewegt. Hier hab ich den Code für Euch:
<>Variable [0033: Hero X] = Player X Coordinate
<>Variable [0034: Hero Y] = Player Y Coordinate
<>Variable [0035: Bus X] = Bus X Coordinate
<>Variable [0036: Bus Y] = Bus Y Coordinate
<>Conditional Branch: Variable [0033: Hero X] <= 13
<>Conditional Branch: Variable [0034: Hero Y] <= 13
<>Play SE: 'bus', 65, 100
<>
: Else Handler
<>Conditional Branch: Variable [0033: Hero X] > 13
<>Conditional Branch: Variable [0034: Hero Y] > 13
<>Stop SE
<>
: End
<>
: End
<>
: End
<>
: End
<>


Ich hab im Prinzip das gleiche Problem mit einem anderen Event. Der erste Teil der Bedingung wird ausgeführt, der zweite Teil nicht. Wer kann mir helfen?

Bex

Seher

Motto: Lets have some Fun.

  • Send private message

2

Tuesday, September 30th 2014, 10:09am

Du hast vergessen Minus zu rechnen. Und wenn das ergänzt ist fehlt das nächste, was man dann auf unterschiedlichste weise machen könnte.
Wie sollte dein Code/Methode denn aufgebaut sein? Verstehe zum beispiel nicht den Conditional Branch im Else Case, scheint unnötig zu sein in diesem Fall.
Auch wird dein Sound wohl zig mal in der Sekunde abgespielt,bist du sicher das der erste Teil funktioniert? (Hab leider grad keine Zeit für Lösungen).

3

Tuesday, September 30th 2014, 10:23am

Ich hab den den ersten Teil grad getestet und er funktioniert nur, wenn ich kurz vorm Bus-Event steh.

Was das Minus rechnen angeht, daran hab ich natrülich wieder nicht gedacht...

Wenn Deiner Meinung nach der Conditional Branch überflüssig ist, wie kann ich es einfacher gestalten?

Revito

Rekrut

Motto: Verschwendet ist das Leben viel zu kurz.

  • Send private message

4

Tuesday, September 30th 2014, 10:32am

Die Entfernung zwischen Spieler und Bus soll doch kleiner-gleich 13 sein, damit man den Motor hört.
Dem entsprechend muss das Event eher so aussehen:

Source code

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
<>Variable [0033: Entfernung zum Bus X] = Player X Coordinate
<>Variable [0033: Entfernung zum Bus X] -= Bus X Coordinate
<>Variable [0034: Entfernung zum Bus Y] = Player Y Coordinate
<>Variable [0034: Entfernung zum Bus Y] -= Bus Y Coordinate
<>Conditional Branch: Variable [0033: Entfernung zum Bus X] <= 13
  <>Conditional Branch: Variable [0034: Entfernung zum Bus Y] <= 13
    <>Play SE: 'bus', 65, 100
    <>
  : Else Handler
    <>Stop SE
    <>
  : End
  <>
: End
<>Conditional Branch: Variable [0033: Entfernung zum Bus X] >= -13
  <>Conditional Branch: Variable [0034: Entfernung zum Bus Y] >= -13
    <>Play SE: 'bus', 65, 100
    <>
  : Else Handler
    <>Stop SE
    <>
  : End
  <>
: End
<>
Enslaved - Von Sklaverei und Freiheit

5

Tuesday, September 30th 2014, 11:19am

Danke Revito für den Code, allerdings läuft jetzt von Anfang an das Motorengeräusch des Busses und die Startposition ist viel weiter als 13 Schritte vom Bus entfernt...

Shabraxxx

Projekt: Ressourcenbereich & Seitenredaktion

Motto: Mein Luftkissenfahrzeug ist voller Aale.

  • Send private message

6

Tuesday, September 30th 2014, 11:39am

Hallo kunst79,

hier eine Lösung mit ein wenig Scripthilfe. Zunächst musst Du diese kleine Erweiterung irgendwo oberhalb von Main im Scripteditor einfügen:

Spoiler: Code

Ruby Source code

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
35
36
37
#--------------------------------------------------------------------------
# * Euklidischer Abstand
#
# Berechnet den Abstand zwischen zwei Events in Tiles.
# Wird die Methode ohne Argumente aufgerufen, also nur als dist(), nimmt sie
# automatisch die Koordinaten des Spielers und die des Events, das den Code
# ausführt, als Argumente.
# Wird sie mit zwei Argumenten aufgerufen, interpretiert sie das erste als 
# x-Koordinate, das zweite als y-Koordinate und berechnet den Abstand dieses
# Punkts zum Spieler.
# Vier Argumente schließlich erlauben volle Kontrolle über eine
# Abstandsberechnung.
#--------------------------------------------------------------------------
def dist(x1 = get_character(@event_id).x, y1 = get_character(@event_id).y,
         x2 = $game_player.x,             y2 = $game_player.y)
  Math.hypot(x1 - x2, y1 - y2)
end
#--------------------------------------------------------------------------
# * Dynamische Lautstärke
#
# Erlaubt es, die Lautstärke eines SEs einem Abstand zum Spieler anzupassen.
# Die Methode benötigt im Grunde nur ein Argument, nämlich den Namen der
# Sounddatei als String (also in Anführungszeichen), alle anderen Parameter
# sind optional. Slope, das zweite Argument, gibt an, wie schnell die
# Lautstärke mit zunehmendem Abstand abfällt, je höher desto schneller; x und y
# geben die Koordinaten an, zu denen der Spielerabstand berechnet wird (auch
# hier gilt, dass standardmäßig die Koordinaten des den Code ausführenden Events
# verwendet werden). Max ist die maximale Lautstärke, die der Sound annehmen
# kann, also die Lautstärke, die am Ursprungsort des Geräusches herrscht; pitch
# die Tonhöhe des Sounds.
#--------------------------------------------------------------------------
def se_dist(str,slope = 2,x = get_character(@event_id).x,
                          y = get_character(@event_id).y,max = 100,pitch = 100)
  if max - dist(x,y) * slope >= 0
    Audio.se_play("Audio/SE/" + str,max - dist(x,y) * slope,pitch)
  end
end
highlight to read

Nun kannst Du die Lautstärke des Motors dem Abstand des Spielers zum Bus anpassen, entweder, indem Du im Bus-Event den Code

Ruby Source code

1
se_dist("bus")

ausführen lässt, oder, wenn das Bus-Event nicht als Parallel Process benutzt werden kann, ein Motorevent mit folgendem Code erstellst:

Ruby Source code

1
2
3
4
# für x und y kann statt der festen Koordinaten auch
# get_character(ID des Bus-Events).x bzw. get_character(ID des Bus-Events).y
# verwendet werden.
se_dist("bus",2,x,y)

Ich hoffe, ich konnte dir behilflich sein.
Gruß, Shabz
„Albrecht Dürer, geboren 1471, gestorben 1530.
Der Nürnberger Maler, der ganz Europa faszinierte; mit seinem scharfen Auge, seiner Meisterschaft in Linienführung und Plastizität, sowie seiner Leihwagenfirma.“

7

Tuesday, September 30th 2014, 11:49am

Das ist perferkt! Vielen, vielen Dank! :) :) :)

Revito

Rekrut

Motto: Verschwendet ist das Leben viel zu kurz.

  • Send private message

8

Tuesday, September 30th 2014, 1:10pm

Ein kleiner Denkfehler meinerseits. Dx
So müsste es natürlich lauten:
Spoiler

Source code

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
<>Variable [0033: Entfernung zum Bus X] = Player X Coordinate
<>Variable [0033: Entfernung zum Bus X] -= Bus X Coordinate
<>Variable [0034: Entfernung zum Bus Y] = Player Y Coordinate
<>Variable [0034: Entfernung zum Bus Y] -= Bus Y Coordinate
<>Conditional Branch: Variable [0033: Entfernung zum Bus X] <= 13
  <>Conditional Branch: Variable [0033: Entfernung zum Bus X] >= -13
    <>Conditional Branch: Variable [0034: Entfernung zum Bus Y] <= 13
      <>Conditional Branch: Variable [0034: Entfernung zum Bus Y] >= -13
        <>Play SE: 'bus', 65, 100
        <>
      : Else Handler
        <>Stop SE
        <>
      : End
    : Else Handler
      <>Stop SE
      <>
    : End
  : Else Handler
    <>Stop SE
    <>
  : End
: Else Handler
  <>Stop SE
  <>
: End
<>
highlight to read

Aber Shabraxx Lösung ist natürlich um einiges eleganter und leichter. ^^
Enslaved - Von Sklaverei und Freiheit

9

Tuesday, September 30th 2014, 5:12pm

Ein kleiner Denkfehler meinerseits. Dx
So müsste es natürlich lauten:
Vielen Dank dafür, das hat mir jetzt bei einer anderen, ähnlichen Situation geholfen! :)

Playm

RPG Studio Webmaster

  • Send private message

10

Tuesday, September 30th 2014, 9:12pm

Kleine Anmerkung zu Shabs Skript - da er die Methode get_character und die Instanzvariable @event_id benutzt, sollten diese Methoden in der Klasse Interpreter definiert werden, also an den Anfang von Shabs Skript ein class Interpreter und ans Ende ein end setzen.
Das könnte dann so aussehen:
Spoiler

Ruby Source code

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
35
36
37
38
39
40
41
42
#==============================================================================
# ** Interpreter Erweiterung für Skriptaufrufe im Event
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # * Euklidischer Abstand
  #
  # Berechnet den Abstand zwischen zwei Events in Tiles.
  # Wird die Methode ohne Argumente aufgerufen, also nur als dist(), nimmt sie
  # automatisch die Koordinaten des Spielers und die des Events, das den Code
  # ausführt, als Argumente.
  # Wird sie mit zwei Argumenten aufgerufen, interpretiert sie das erste als 
  # x-Koordinate, das zweite als y-Koordinate und berechnet den Abstand dieses
  # Punkts zum Spieler.
  # Vier Argumente schließlich erlauben volle Kontrolle über eine
  # Abstandsberechnung.
  #--------------------------------------------------------------------------
  def dist(x1 = get_character(@event_id).x, y1 = get_character(@event_id).y,
           x2 = $game_player.x,             y2 = $game_player.y)
    Math.hypot(x1 - x2, y1 - y2)
  end
  #--------------------------------------------------------------------------
  # * Dynamische Lautstärke
  #
  # Erlaubt es, die Lautstärke eines SEs einem Abstand zum Spieler anzupassen.
  # Die Methode benötigt im Grunde nur ein Argument, nämlich den Namen der
  # Sounddatei als String (also in Anführungszeichen), alle anderen Parameter
  # sind optional. Slope, das zweite Argument, gibt an, wie schnell die
  # Lautstärke mit zunehmendem Abstand abfällt, je höher desto schneller; x und y
  # geben die Koordinaten an, zu denen der Spielerabstand berechnet wird (auch
  # hier gilt, dass standardmäßig die Koordinaten des den Code ausführenden Events
  # verwendet werden). Max ist die maximale Lautstärke, die der Sound annehmen
  # kann, also die Lautstärke, die am Ursprungsort des Geräusches herrscht; pitch
  # die Tonhöhe des Sounds.
  #--------------------------------------------------------------------------
  def se_dist(str,slope = 2,x = get_character(@event_id).x,
                            y = get_character(@event_id).y,max = 100,pitch = 100)
    if max - dist(x,y) * slope >= 0
      Audio.se_play("Audio/SE/" + str,max - dist(x,y) * slope,pitch)
    end
  end
end
highlight to read

Shab hatte die Methode für alle Klassen definiert, was etwas unsauber ist.


@Revito: Einen kleinen Helfer für dich findest Du hier. :hi:

Social bookmarks