Snugglebit

Krieger

  • »Snugglebit« ist der Autor dieses Themas

Motto: Menschen sind doof, Tiere sind doof, Pflanzen sind doof... Steine sind okay.

  • Nachricht senden

1

Mittwoch, 27. September 2017, 15:29

Springen ohne Skript

Da bin ich schonwieder.

Dieses Mal stehe ich bei meinem selbstgebastelten Sprung-Event vor einem Problem.
Ich habe ein Common Event erstellt mit welchem man springen kann, wenn die Taste W gedrückt wird. Das funktioniert so weit auch prima. Man kann in jede Richtung springen - abhängig davon in welche man schaut. Man springt 2 Blöcke weit, denn der Sprung soll den Sinn haben, über schmale Hindernisse hinwegspringen zu können.
Das Problem: Man kann in unpassierbare Objekte hineinspringen.
Daher meine Frage: Kann man abfragen, ob der Block hinter dem Block welchen man überspringen will, passierbar ist oder nicht? Wenn ja: spring drüber weg - wenn nicht: spring nicht (oder auf der Stelle).

Edit Optimalerweise wäre es auch gut, wenn Tiles, die über dem Spieler sind, ebenfalls als "unpassierbar" gelten würden. Denn täten sie es nicht, könnte man über Bäume u. ä. hinwegspringen. Wäre kein großes Drama, aber sicherlich ein wenig... eigenartig.
Was lebt, das kann man töten. Was tot ist, das kann man essen.
--------------------------------------------------------------------------
:map: Mapping: :star::star::star::star::star:
:compile: Scripting: :star-empty::star-empty::star-empty::star-empty::star-empty:
:system-monitor: Event: :star::star::star::star::star:
:doc: Story: :star::star::star::star::star-empty:
:pencil: Zeichnen: :star::star::star::star::star:
:palette: Pixeln: :star::star::star-half::star-empty::star-empty:
:music-beam-16: Musik & Sounds: :star::star::star::star-empty::star-empty:
--------------------------------------------------------------------------
Bevorzugter Maker: :ace:
Ebenfalls im Besitzt: :rmxp: :rmvx: :rmmv:

2

Mittwoch, 27. September 2017, 18:04

Oha. Ich glaube das ist keine Absicht, aber tatsächlich prüft der Maker scheinbar bei Jumps überhaupt nichts. Ein Event kann auch aus der Map rausspringen.
Im RMXP wurde noch geprüft, ob ein Sprung so überhaupt möglich ist.

Zitat von »RPG Maker VX Ace«

Spoiler: Code

Ruby Quellcode

308
309
310
311
312
313
314
315
316
317
318
319
320
321
  def jump(x_plus, y_plus)
    if x_plus.abs > y_plus.abs
      set_direction(x_plus < 0 ? 4 : 6) if x_plus != 0
    else
      set_direction(y_plus < 0 ? 8 : 2) if y_plus != 0
    end
    @x += x_plus
    @y += y_plus
    distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
    @jump_peak = 10 + distance - @move_speed
    @jump_count = @jump_peak * 2
    @stop_count = 0
    straighten
  end
zum Lesen den Text mit der Maus markieren

Zitat von »RPG Maker XP«

Spoiler: Code

Ruby Quellcode

304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
  def jump(x_plus, y_plus)
    # If plus value is not (0,0)
    if x_plus != 0 or y_plus != 0
      # If horizontal distnace is longer
      if x_plus.abs > y_plus.abs
        # Change direction to left or right
        x_plus < 0 ? turn_left : turn_right
      # If vertical distance is longer, or equal
      else
        # Change direction to up or down
        y_plus < 0 ? turn_up : turn_down
      end
    end
    # Calculate new coordinates
    new_x = @x + x_plus
    new_y = @y + y_plus
    # If plus value is (0,0) or jump destination is passable
    if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
      # Straighten position
      straighten
      # Update coordinates
      @x = new_x
      @y = new_y
      # Calculate distance
      distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
      # Set jump count
      @jump_peak = 10 + distance - @move_speed
      @jump_count = @jump_peak * 2
      # Clear stop count
      @stop_count = 0
    end
  end
zum Lesen den Text mit der Maus markieren


Die Skripte sind fast identisch, bis darauf, dass der RMXP in Zeile 320/321 noch abfragt, ob die Figur auf der Stelle springt, oder das Zielfeld passierbar ist.

:hand-point: Würde es dir helfen, wenn der Jump einfach dahingehend geändert wird, dass er *nichts* tut, wenn das Sprungziel invalide ist, oder möchtest Du selber abfragen, ob das Zielfeld angesprungen werden darf?

Für letzteres gibt es Methoden, um zu prüfen ob da ein Event im Weg steht oder das Zielfeld an sich unpassierbar ist - damit Du das aber einfach in einem ConditionalBranch-Eventbefehl abfragen kannst würde man dann vermutlich eine Extramethode schreiben, die das alles in einem abfragt.

Snugglebit

Krieger

  • »Snugglebit« ist der Autor dieses Themas

Motto: Menschen sind doof, Tiere sind doof, Pflanzen sind doof... Steine sind okay.

  • Nachricht senden

3

Mittwoch, 27. September 2017, 20:44

Theoretisch wäre es ok, wenn man gar nicht springt, wenn der Sprung nicht möglich ist. Natürlicher würde es erscheinen, wenn man auf der Stelle springen würde, wenn man es versucht. So würde es weniger "geskriptet" wirken - von daher würde ich das bevorzugen ^^

Ich hänge einfach mal mein Common Event an. Vielleicht hilft es ein bisschen, die Technik dahinter zu sehen. Möglicherweise verstehe ich hier etwas falsch ^^'
»Snugglebit« hat folgende Datei angehängt:
Was lebt, das kann man töten. Was tot ist, das kann man essen.
--------------------------------------------------------------------------
:map: Mapping: :star::star::star::star::star:
:compile: Scripting: :star-empty::star-empty::star-empty::star-empty::star-empty:
:system-monitor: Event: :star::star::star::star::star:
:doc: Story: :star::star::star::star::star-empty:
:pencil: Zeichnen: :star::star::star::star::star:
:palette: Pixeln: :star::star::star-half::star-empty::star-empty:
:music-beam-16: Musik & Sounds: :star::star::star::star-empty::star-empty:
--------------------------------------------------------------------------
Bevorzugter Maker: :ace:
Ebenfalls im Besitzt: :rmxp: :rmvx: :rmmv:

4

Donnerstag, 28. September 2017, 22:36

Hmm, Du kannst ja mal folgenden Edit ausprobieren. Einfach als neues Script bei Material einfügen und schauen, ob es hilft oder irgendwas anderes bei dir dafür kaputt geht.
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
#==============================================================================
# ** MoveRoute JUMP-Edit for Game_Player
#==============================================================================
class Game_Player
  #--------------------------------------------------------------------------
  # * Determine if Passable as jump target
  #     d : Direction (2,4,6,8)
  #--------------------------------------------------------------------------
  def jump_passable?(x, y, d)
    return false unless $game_map.valid?(x, y)
    return true if @through || debug_through?
    return false unless map_passable?(x, y, d)
    return false if collide_with_characters?(x, y)
    return true
  end
  #--------------------------------------------------------------------------
  # * Edit jump to check destination for passability
  #--------------------------------------------------------------------------
  def jump(x_plus, y_plus)
    if x_plus.abs > y_plus.abs
      set_direction(x_plus < 0 ? 4 : 6) if x_plus != 0
    else
      set_direction(y_plus < 0 ? 8 : 2) if y_plus != 0
    end
    new_x = @x + x_plus
    new_y = @y + y_plus
    if jump_passable?(new_x, new_y, @direction)
      @x += x_plus
      @y += y_plus
      distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
    else
      distance = 0
    end
    @jump_peak = 10 + distance - @move_speed
    @jump_count = @jump_peak * 2
    @stop_count = 0
    straighten
  end
end
zum Lesen den Text mit der Maus markieren

Snugglebit

Krieger

  • »Snugglebit« ist der Autor dieses Themas

Motto: Menschen sind doof, Tiere sind doof, Pflanzen sind doof... Steine sind okay.

  • Nachricht senden

5

Donnerstag, 28. September 2017, 23:30

Bis jetzt funktioniert es einwandfrei, vielen Dank! :hi:
Das einzige, was jetzt noch ein wenig eigenartig erscheint ist folgendes Szenario:
Man springt 2 Blöcke weit. Heißt, man kann über ein Block breite Hindernisse springen.
Wenn man nun aber mit einem Abstand von einem Block vor einem unpassierbaren Tile steht, springt man ebenfalls auf der Stelle - obwohl das Tile direkt vor einem passierbar wäre. In dem Fall wäre es ja ideal, wenn man dort dann nur einen Block weit springen würde.

Ich könnte darüber hinwegsehen, denn es funktioniert ansonsten problemlos. Aber könnte man dagegen etwas unternehmen? Vielleicht auch in meinem Common Event?
Was lebt, das kann man töten. Was tot ist, das kann man essen.
--------------------------------------------------------------------------
:map: Mapping: :star::star::star::star::star:
:compile: Scripting: :star-empty::star-empty::star-empty::star-empty::star-empty:
:system-monitor: Event: :star::star::star::star::star:
:doc: Story: :star::star::star::star::star-empty:
:pencil: Zeichnen: :star::star::star::star::star:
:palette: Pixeln: :star::star::star-half::star-empty::star-empty:
:music-beam-16: Musik & Sounds: :star::star::star::star-empty::star-empty:
--------------------------------------------------------------------------
Bevorzugter Maker: :ace:
Ebenfalls im Besitzt: :rmxp: :rmvx: :rmmv:

Ähnliche Themen

Social Bookmarks