1

Dienstag, 30. September 2014, 09:36

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.

  • Nachricht senden

2

Dienstag, 30. September 2014, 10:09

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

Dienstag, 30. September 2014, 10:23

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.

  • Nachricht senden

4

Dienstag, 30. September 2014, 10:32

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:

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
<>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

Dienstag, 30. September 2014, 11:19

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.

  • Nachricht senden

6

Dienstag, 30. September 2014, 11:39

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 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
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
zum Lesen den Text mit der Maus markieren

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

Ruby Quellcode

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 Quellcode

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

Dienstag, 30. September 2014, 11:49

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

Revito

Rekrut

Motto: Verschwendet ist das Leben viel zu kurz.

  • Nachricht senden

8

Dienstag, 30. September 2014, 13:10

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

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
<>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
<>
zum Lesen den Text mit der Maus markieren

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

9

Dienstag, 30. September 2014, 17:12

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! :)

10

Dienstag, 30. September 2014, 21:12

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 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
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
zum Lesen den Text mit der Maus markieren

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


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

Ähnliche Themen

Social Bookmarks