RPGVX.net
Ressourcen & Tutorials => Tutorials => Thema gestartet von: PatrickStar am Oktober 03, 2009, 20:26:07
-
Freies Springen
Moin moin^^ Ich mache mal ein Tutorial über freies Springen damit das Forum nicht mehr zugespammt wird.
Also als erstes gehen wir in die Database und dann auf generelles Ereignis.
Und machen ein Ereignis mit der Bedingung Schalter X ist an.
Auslöser ist ein Paralleler Prozess.
Dann machen wir in der Eventseite eine Bedingung.
In diesem Fall "Button X wurde gedrückt" (X Gamepad-Taste = A Tastaturtaste)
Dann fragen wir ab in welcher Richtung der Spieler steht.
Also Bedingung Spieler ist Richtung rechts andernfalls Bedingung Spieler ist links ...USW.
Ich habe vor jedem Jump noch ein SE eingefügt und am Ende einen kleinen Wait.
Das Ganze kann dann so aussehen:
(http://www.qpic.ws/images/FpC93292.png)
Dannach gehen wir auf Skript Editor : (dieses Zeichen (http://www.qpic.ws/images/AYv93486.png))
Scrollen runter.
Und fügen Woratana´s Skript einfach über Main ein. Damit man nicht aus dem Bildschirm springen kann und Ähnliches. (bei Benutzung Crediteintrag für Woratana)
Skript:
#===============================================================
# ? [VX] ? Improved & Special Move Commands ? ?
#--------------------------------------------------------------
# ? by Woratana [woratana@hotmail.com]
# ? Released on: 20/03/2008
# ? Version: 1.0
#--------------------------------------------------------------
=begin
?=====?=====?=====?=====?=====?=====?=====?=====?=====?
+ COMMANDS LIST +
?=====?=====?=====?=====?=====?=====?=====?=====?=====?
################################
? IMPROVED MOVE COMMANDS ?
? SAFE JUMP:
Don't Jump if its destination is OUT OF THE SCREEN (or) NOT PASSABLE.
(Old jump will not check before jump)
? IMPROVED RANDOM MOVE
Find the movable direction before move.
(Old random move will just skip to move in that frame, if its destination is not passable.)
? IMPROVED COLLIDE_WITH_CHARACTERS CHECK
'Same as Characters' events are able to walk on other 'Below Characters' events.
? Note: If you don't want one of this improved command, just delete its part.
(I put all of their command name above their script part)
################################
################################
? SPECIAL(NEW) MOVE COMMANDS ?
++[HOW TO USE]++
? Open 'Move Route' window, (or event command 'Set Move Route')
Click 'Script...' and type the move command you want...
? MOVE TOWARD POSITION X/Y
move_toward_pos(x,y)
? MOVE AWAY FROM POSITION X/Y
move_away_from_pos(x,y)
? MOVE TOWARD EVENT ID
move_toward_event(id)
? MOVE AWAY FROM EVENT ID
move_away_from_event(id)
? TURN TOWARD POSITION X/Y
turn_toward_pos(x,y)
? TURN AWAY FROM POSITION X/Y
turn_away_from_pos(x,y)
? TURN TOWARD EVENT ID
turn_toward_event(id)
? TURN AWAY FROM EVENT ID
turn_away_from_event(id)
################################
=end
class Game_Character
##################################################################
# IMPROVED MOVE COMMANDS
##################################################################
#-------------------------------------------------------------
# SAFE JUMP
#-------------------------------------------------------------
def jump(x_plus, y_plus)
if x_plus.abs > y_plus.abs # ??????????
x_plus < 0 ? turn_left : turn_right
elsif x_plus.abs > y_plus.abs # ??????????
y_plus < 0 ? turn_up : turn_down
end
new_x = @x + x_plus
new_y = @y + y_plus
if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y)
@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
end
#-------------------------------------------------------------
# IMPROVED RANDOM MOVE
#-------------------------------------------------------------
def move_random
safe = false
checked = []
while safe == false
break if checked.include?(0) and checked.include?(1) and
checked.include?(2) and checked.include?(3)
case rand(4)
when 0; return if checked.include?(0); checked.push 0
if passable?(@x, @y + 1)
safe = true; move_down(false)
end
when 1; return if checked.include?(1); checked.push 1
if passable?(@x - 1, @y)
safe = true; move_left(false)
end
when 2; return if checked.include?(2); checked.push 2
if passable?(@x + 1, @y)
safe = true; move_right(false)
end
when 3; return if checked.include?(3); checked.push 3
if passable?(@x - 1, @y)
safe = true; move_up(false)
end
end
end
end
#----------------------------------------------------------------------
# IMPROVED COLLIDE_WITH_CHARACTERS CHECK
#----------------------------------------------------------------------
def collide_with_characters?(x, y)
for event in $game_map.events_xy(x, y) # Matches event position
unless event.through # Passage OFF?
return true if event.priority_type == 1 # Target is normal char
end
end
if @priority_type == 1 # Self is normal char
return true if $game_player.pos_nt?(x, y) # Matches player position
return true if $game_map.boat.pos_nt?(x, y) # Matches boat position
return true if $game_map.ship.pos_nt?(x, y) # Matches ship position
end
return false
end
##################################################################
# SPECIAL(NEW) MOVE COMMANDS
##################################################################
#--------------------------------------------------------------------------
# * Move toward Position
#--------------------------------------------------------------------------
def move_toward_pos(x,y)
sx = distance_x_from_pos(x)
sy = distance_y_from_pos(y)
if sx != 0 or sy != 0
if sx.abs > sy.abs # Horizontal distance is longer
sx > 0 ? move_left : move_right # Prioritize left-right
if @move_failed and sy != 0
sy > 0 ? move_up : move_down
end
else # Vertical distance is longer
sy > 0 ? move_up : move_down # Prioritize up-down
if @move_failed and sx != 0
sx > 0 ? move_left : move_right
end
end
end
end
#--------------------------------------------------------------------------
# * Move away from Position
#--------------------------------------------------------------------------
def move_away_from_pos(x,y)
sx = distance_x_from_pos(x)
sy = distance_y_from_pos(y)
if sx != 0 or sy != 0
if sx.abs > sy.abs # Horizontal distance is longer
sx > 0 ? move_right : move_left # Prioritize left-right
if @move_failed and sy != 0
sy > 0 ? move_down : move_up
end
else # Vertical distance is longer
sy > 0 ? move_down : move_up # Prioritize up-down
if @move_failed and sx != 0
sx > 0 ? move_right : move_left
end
end
end
end
#--------------------------------------------------------------------------
# * Move toward Event
#--------------------------------------------------------------------------
def move_toward_event(id)
move_toward_pos($game_map.events[id].x,$game_map.events[id].y)
end
#--------------------------------------------------------------------------
# * Move away from Event
#--------------------------------------------------------------------------
def move_away_from_event(id)
move_away_from_pos($game_map.events[id].x,$game_map.events[id].y)
end
#--------------------------------------------------------------------------
# * Turn toward Position
#--------------------------------------------------------------------------
def turn_toward_pos(x,y)
sx = distance_x_from_pos(x)
sy = distance_y_from_pos(y)
if sx.abs > sy.abs # Horizontal distance is longer
sx > 0 ? turn_left : turn_right
elsif sx.abs < sy.abs # Vertical distance is longer
sy > 0 ? turn_up : turn_down
end
end
#--------------------------------------------------------------------------
# * Turn away from Position
#--------------------------------------------------------------------------
def turn_away_from_pos(x,y)
sx = distance_x_from_pos(x)
sy = distance_y_from_pos(y)
if sx.abs > sy.abs # Horizontal distance is longer
sx > 0 ? turn_right : turn_left
elsif sx.abs < sy.abs # Vertical distance is longer
sy > 0 ? turn_down : turn_up
end
end
#--------------------------------------------------------------------------
# * Turn toward Event
#--------------------------------------------------------------------------
def turn_toward_event(id)
turn_toward_pos($game_map.events[id].x,$game_map.events[id].y)
end
#--------------------------------------------------------------------------
# * Turn away from Event
#--------------------------------------------------------------------------
def turn_away_from_event(id)
turn_away_from_pos($game_map.events[id].x,$game_map.events[id].y)
end
#--------------------------------------------------------------------------
# * Calculate X Distance From Event
#--------------------------------------------------------------------------
def distance_x_from_pos(x)
sx = @x - x
if $game_map.loop_horizontal? # When looping horizontally
if sx.abs > $game_map.width / 2 # Larger than half the map width?
sx -= $game_map.width # Subtract map width
end
end
return sx
end
#--------------------------------------------------------------------------
# * Calculate Y Distance From Event
#--------------------------------------------------------------------------
def distance_y_from_pos(y)
sy = @y - y
if $game_map.loop_vertical? # When looping vertically
if sy.abs > $game_map.height / 2 # Larger than half the map height?
sy -= $game_map.height # Subtract map height
end
end
return sy
end
end
Ok das wars dann auch schon.
Für Leute bei denen Fehler kommen etc.
Hier noch eine kleine Demo: http://www.mediafire.com/download.php?m0nma2d42wb
Viel Spass Wünscht
¥ PatrickStar ¥
-
hab das selbe schon mal ohne script nur über Database gemacht.
Bloß konnte man da überall springen.
Das heißt auch auf gesperrte Gegenstände (mit einem X belegt) wie Wände konnte man springen.
Und auch aus dem Bildschirm.
Korigiert das Script beide Fehler?
-
? IMPROVED MOVE COMMANDS ?
? SAFE JUMP:
Don't Jump if its destination is OUT OF THE SCREEN (or) NOT PASSABLE.
(Old jump will not check before jump)
Wer lesen und englisch kann ist klar im Vorteil.
Nochmal für die, dies nicht können: Ja.
-
Ach du Kacke dieser alte Beitrag war so peinlich und bähh das ich ihn geändert hab. wär froh wenn jemand ihn löschen würde.
-
? IMPROVED MOVE COMMANDS ?
? SAFE JUMP:
Don't Jump if its destination is OUT OF THE SCREEN (or) NOT PASSABLE.
(Old jump will not check before jump)
Wer lesen und englisch kann ist klar im Vorteil.
Nochmal für die, dies nicht können: Ja.
Super! Ich wollt halt nicht den ganzen Code durchlesen..
den meistens sind die Mega Lang und ich blick Ruby eh nicht.
Trotzdem danke...
(hätte man vorher schon besser beschreiben können)
-
ich will ja jetzt nicht auf dir rumhacken .... aber:
[....]Und fügen Woratana´s Skript einfach über Main ein. Damit man nicht aus dem Bildschirm springen kann und Ähnliches.
^^
-
Ach du Kacke dieser alte Beitrag war so peinlich und bähh das ich ihn geändert hab. wär froh wenn jemand ihn löschen würde.
-
Cooles Tutorial. Ist dir gut gelungen^^
-
Cooles Tutorial. Ist dir gut gelungen^^
Danke,
ich freue mich wirklich über alle Antworten.
mfg
Offtopic:
Juhu 50. Beitrag^^
-
Geht Hamma ^^ aber manchmal springt er einfach nich
-
Geht Hamma ^^ aber manchmal springt er einfach nich
Ja wegen dem Wait.
Es wäre ja sche***e wenn man tausendmal hintereinander springen könnte.
Ich find Abstände besser als sowas.
Aber wer will kann den Wait auch wegmachen.
mfg
PatrickStar
-
Man kann das Problem auf 2 Arten minimieren:
1. Das wait einfach hinter das Springen setzten
2. Das wait kürzer machen.
Hoffe, dass das hilft.
MfG
-
Gutes Tutorial^^
Werd damit mal rumspielen wenn ich Zeit hab x)
-
Gutes tut
-
Gut tut
allerdings...
...würde ich den ganzen CE in einer folgenden Skriptbedingung stecken, und zwar unter false :
$game_map.interpreter.running?
Sonst würde der Character auch springen, wenn man einen event anspricht und sonst auch auf der map .
-
hab das jetzt alles so gemacht wie es sich gehört aber bei mir öffnet der nur das menü...
was machen?
-
Leg dann Button X auf eine andere Taste ;). Dann kommt auch kein Menü mehr. Am besten auf (ich glaube) C war das. Das wäre dann Enter.
-
jeah danke
-
Hallo,
das geht auch ganz einfach ohne Skript, mit sehr wenig Eventbefehlen.
Hier mal eine Demo wie das mit Events funktioniert.
A-Taste springen
Du kannst überall springen.
Du kannst nicht in Wände springen.
Du kannst aber über 1Feld breite Hindernisse springen.
Du hast kein Skript am laufen das vieleicht Fehler mit anderen Verursacht^^und es ist genauso Performance schonend.
Der Mechanismus für Fehlerfreies Event Jumping,viel Spass damit :adore:
http://www.npshare.de/files/d6a5bb1f/EventSpringenFehlerfrei.rar (http://www.npshare.de/files/d6a5bb1f/EventSpringenFehlerfrei.rar)
-
Die Idee ist wirklich richtig gut! Das so abzufragen, darauf muss man erstmal kommen, allerdings gibt es doch ein kleines Problem:
Man kann senkrecht durch Bäume Springen, d.h. von vorne nach hinten oder von hinten nach vorne(nicht von links nach rechts) und das ist nicht möglich, weil der Baum ja viel höher ist als der Char. Schade ich habe mich gerade schon auf ein funktionierendes Springsystem in meinem Spiel gefreut :sad:
-
Ja man kann leider durch alles springen was ein Feld breit ist,und wo dahinter ein leeres begehbares Feld ist.
Man muss auf den Karten wo das Sprungsystem aktiev ist,für alles was nicht übersprungen werden soll,das
Hinderniss 2Felder breit machen.
Wegen dieser Mapping einschränkung nutze ich es auch nur als Feature auf ein paar Karten^^
Naja hab die Skriptvariante oben nicht getestet,von daher ist die vieleicht ok.
Gruss Bex
-
Das Skript, welcher der OP gepostet hat, dient nicht allein dem Springen. Es ändert nur die Art des Springens etwas ab bzw. fügt einige Abfragen hinzu. Und ja, beides ist möglich ohne das Skript. ;)
? SAFE JUMP:
Don't Jump if its destination is OUT OF THE SCREEN (or) NOT PASSABLE.
(Old jump will not check before jump)
-
ich würds ganz einfach ohne script machen,
indem man vor dem springen einfach das in einer scriptbedingung abfragt:
$game_map.passable?($game_variables[0003],$game_variables[0004])
natürlich so abändern, das es das feld auf das man springen will abfragt , wenn das nicht
passierbar ist also false rauskommt darf man nicht springen.
-
@Boogatie Roll
genauso funktioniert es ja ,nur mit nem Event anstelle des Eventskriptbefehls.
(Wie würd denn der Eventskriptbefehl lauten um die Passabilität eines Feldes abzufragen?)
Gruss Bex
-
Der Skriptbefehl, den Boogatie genannt hast IST die einzig mögliche Passabilitätsabfrage per Event.
Das Skript, dass der OP verwendet führt diese Abfrage (und vllt. auchnoch andere) automatisch beim Aufrufen der Move-Action "Jump" aus. ;)
-
Oh ich Blitzmerker :hehe:,
das war also schon der richtige Eventskriptcode: $game_map.passable?($game_variables[0003],$game_variables[0004]).
Ist der Branch automatisch erfüllt wenn true wiedergegeben wird?
oder muss man da einen extra Abfragebefehl einfügen?
Werd es demnächst mal testen.
Gruss Bex
-
wenns in der branch ausgeführt wird, und die X und Y Koordinate begehbar sind, ists true ansonsten false.
Es wär das selbe wie wenn du gucken würdest ob ne Variable gleich oder größer/kleiner als ein Wert ist, da
gibt es auch automatisch true aus wenns gleich is (:
lg flip
-
Edit: Frage hat sich beantwortet,deshalb hab ichs editiert^^
Danke für eure Hilfe. Gruss Bex :haha: