Diagonles Map-Scrolling
Hi,
kurz und schmerzlos: Ich arbeite an ner Methode um die Map in beliebiger Richtung diagonal scrollen zu können. Zu beachten ist nur dass ich jetzt nicht 8 Richtungen zum scrollen haben will, sondern einfach die x und y - Weite angebe. Deswegen jetzt meine Frage: Wie rechne ich mir das mathematisch aus, dass der Bildschirm genau zeitgleich x und y abgearbeitet hat? Hier die Methode die ich verwende:
Steh leider gerade etwas auf der Leitung wie ich jetzt die Tatsächliche x und y-Distance bekomme. Soweit ich das skizzenhaft in meinem Kopf durchdenken kann hat das was mit Winkelfunktionien, Satz von Pythagors, usw zu tun.. hat jemand eine Lösung? (vllt sogar eine einfachere als ich ;) )
kurz und schmerzlos: Ich arbeite an ner Methode um die Map in beliebiger Richtung diagonal scrollen zu können. Zu beachten ist nur dass ich jetzt nicht 8 Richtungen zum scrollen haben will, sondern einfach die x und y - Weite angebe. Deswegen jetzt meine Frage: Wie rechne ich mir das mathematisch aus, dass der Bildschirm genau zeitgleich x und y abgearbeitet hat? Hier die Methode die ich verwende:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Game_Map
def start_scroll_diag(distance1, distance2, speed)
@scroll_rest_1 = distance1
@scroll_rest_2 = distance2
@scroll_speed = speed
end
def update
super
if @scroll_restx > 0 || @scroll_resty > 0
distance = 2 ** @scroll_speed
distancex = #berechnen
distancey = #berechnen
@scroll_restx -= distancex
@scroll_resty -= distancey
end
end
end |
Steh leider gerade etwas auf der Leitung wie ich jetzt die Tatsächliche x und y-Distance bekomme. Soweit ich das skizzenhaft in meinem Kopf durchdenken kann hat das was mit Winkelfunktionien, Satz von Pythagors, usw zu tun.. hat jemand eine Lösung? (vllt sogar eine einfachere als ich ;) )
Terranigma 2 - Episode I - Open Beta out now!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
Nein, so einfach ist es leider nicht. Sry hab mich wohl nicht verständlich ausgedrückt.
Die Problematik bei meiner Art von Scrolling ist die: Zum einen verwende ich eine feste Geschwindigkeit, mit der sich der Bildschirm bewegen soll. Zum anderen muss sich diese Geschwindigkeit aber auf 2 Achsen ausbereiten. Ähm, ist irgendwie schwer zu erklären, wurde mir auch erst klar wie ich begonnen habe das update dafür zu schreiben.. Ich erklärs anhand eines Beispiels:
Sagen wir mal, der Bildschirm soll 128 Pixel nach rechts und 256 Pixel nach unten scrollen, und das bei einer Geschwindigkeit von 32 Pixel pro Scrolling. Diese 32 Pixel müssen nun auf beide Richtungen aufgeteilt werden, damit der Bildschirm auch wirklich gleichzeitig am gewünschten Punkt 128,256 ankommt. Ist es so verständlicher?
Die Problematik bei meiner Art von Scrolling ist die: Zum einen verwende ich eine feste Geschwindigkeit, mit der sich der Bildschirm bewegen soll. Zum anderen muss sich diese Geschwindigkeit aber auf 2 Achsen ausbereiten. Ähm, ist irgendwie schwer zu erklären, wurde mir auch erst klar wie ich begonnen habe das update dafür zu schreiben.. Ich erklärs anhand eines Beispiels:
Sagen wir mal, der Bildschirm soll 128 Pixel nach rechts und 256 Pixel nach unten scrollen, und das bei einer Geschwindigkeit von 32 Pixel pro Scrolling. Diese 32 Pixel müssen nun auf beide Richtungen aufgeteilt werden, damit der Bildschirm auch wirklich gleichzeitig am gewünschten Punkt 128,256 ankommt. Ist es so verständlicher?
Terranigma 2 - Episode I - Open Beta out now!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
Bin zwar grad was benebelt aber ich hätte 3 ideen:
speedx = (zielX-startX) / speed
speedy = (zielY-startY) / speed
anschließend in der update funktion immer den speed zur jeweiligen achse addieren oder es in der update methode selbst machen und dann addieren ODER:
x += arctan( (startX-zielX)/(startY-zielY) )*speed
y += arctan( (startY-zielY)/(startX-zielX) )*speed
speedx = (zielX-startX) / speed
speedy = (zielY-startY) / speed
anschließend in der update funktion immer den speed zur jeweiligen achse addieren oder es in der update methode selbst machen und dann addieren ODER:
x += arctan( (startX-zielX)/(startY-zielY) )*speed
y += arctan( (startY-zielY)/(startX-zielX) )*speed
;( :jagen:
Danke für deine Hilfestellungen,
meine vorzeitige funktionierende Lösung sieht so aus:
Der Vorteil hiervon ist, dass die Geschwindigkeit für die tatsächliche Bewegung auf dem Richtungsvector (also addierte x + y-Bewegung) hergenommen und entsprechend den Verhältnissen geteilt wird. Deine erste Lösung ist bisschen am Ziel vorbei, erstens Mal würde die Geschwindigkeit sinken, je größer speed wird, und die Geschwindigkeit würde größer werden, ja länger die Distanz ist. Trotzdem danke, hab durch ideen das fehlende Teil gefunden damit ich meinen "Algorithmus" verfolständigen konnte.
Jetzt aber noch eine andere Frage zu diesem Thema:
Ich möchte auch noch eine ScrollTo(x, y)-Methode einbauen, welche den Bildschirmausschnitt mittels meiner Diagonal-Bewegungs-Methode direkt zum angegebenen Punkt bringt. Hat jemand einen Plan wie ich die Koordinaten des Tiles kriege, auf dem der Mittelpunkt des Bildschirmausschnittes liegt? Also quasi X/Y vom Bildschirmittelpunkt im 32*32-Felder-System des Makers? Bis auf das funktioniert das ganze schon ganz gut. Eventuell lad ich das ganze als Script hoch wenn es fertig ist..
meine vorzeitige funktionierende Lösung sieht so aus:
|
|
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 |
def update
if @scroll_restx > 0 && @scroll_resty > 0
@scroll_restx -= @distancex
@scroll_resty -= @distancey
if @dirx
scroll_right(@distancex)
else
scroll_left(@distancex)
end
if @diry
scroll_down(@distancey)
else
scroll_up(@distancey)
end
end
end
def start_scroll_diag(distance1, distance2, speed)
@scroll_restx = distance1.abs
@scroll_resty = distance2.abs
if distance1 > 0
@dirx = true
else
@dirx = false
end
if distance2 > 0
@diry = true
else
@diry = false
end
@scroll_speed = speed
distance = 2 ** speed
xy = @scroll_restx + @scroll_resty
@distancex = distance * @scroll_restx / xy
@distancey = distance * @scroll_resty / xy
end |
Der Vorteil hiervon ist, dass die Geschwindigkeit für die tatsächliche Bewegung auf dem Richtungsvector (also addierte x + y-Bewegung) hergenommen und entsprechend den Verhältnissen geteilt wird. Deine erste Lösung ist bisschen am Ziel vorbei, erstens Mal würde die Geschwindigkeit sinken, je größer speed wird, und die Geschwindigkeit würde größer werden, ja länger die Distanz ist. Trotzdem danke, hab durch ideen das fehlende Teil gefunden damit ich meinen "Algorithmus" verfolständigen konnte.
Jetzt aber noch eine andere Frage zu diesem Thema:
Ich möchte auch noch eine ScrollTo(x, y)-Methode einbauen, welche den Bildschirmausschnitt mittels meiner Diagonal-Bewegungs-Methode direkt zum angegebenen Punkt bringt. Hat jemand einen Plan wie ich die Koordinaten des Tiles kriege, auf dem der Mittelpunkt des Bildschirmausschnittes liegt? Also quasi X/Y vom Bildschirmittelpunkt im 32*32-Felder-System des Makers? Bis auf das funktioniert das ganze schon ganz gut. Eventuell lad ich das ganze als Script hoch wenn es fertig ist..
Terranigma 2 - Episode I - Open Beta out now!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
Benutzerinformationen überspringen
Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.
[php]class Game_Map
alias_method :nb_aliasmethod_newscroll, :setup
def setup(id)
nb_aliasmethod_newscroll(id)
@new_scroll_speed_x = 0
@new_scroll_speed_y = 0
@new_scroll_target_x = 0
@new_scroll_target_y = 0
@new_scroll_tempmove_x = 0.0
@new_scroll_tempmove_y = 0.0
end
def update
refresh if need_refresh
update_scrolling
@events.each_value {|i| i.update}
@common_events.each_value {|i| i.update}
update_fog
end
def new_scroll_to(x, y, speed = 40)
start_new_scroll(x*128 - display_x, y*128 - display_y, speed)
end
def start_new_scroll(x_dist, y_dist, speed)
@new_scroll_speed_x = x_dist / speed.to_f
@new_scroll_speed_y = y_dist / speed.to_f
@new_scroll_target_x = display_x + x_dist
@new_scroll_target_y = display_y + y_dist
end
def start_scroll(direction, distance, speed)
case direction
when 1 then x, y = -1, 1
when 2 then x, y = 0, 1
when 3 then x, y = 1, 1
when 4 then x, y = -1, 0
when 6 then x, y = 1, 0
when 7 then x, y = -1, -1
when 8 then x, y = 0, -1
when 9 then x, y = 1, -1
end
start_new_scroll(x * distance * 128, y * distance * 128, 2 ** speed)
end
def update_fog
# Manage fog scrolling
@fog_ox -= @fog_sx / 8.0
@fog_oy -= @fog_sy / 8.0
# Manage change in fog color tone
if @fog_tone_duration >= 1
d = @fog_tone_duration
target = @fog_tone_target
@fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
@fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
@fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
@fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
@fog_tone_duration -= 1
end
# Manage change in fog opacity level
if @fog_opacity_duration >= 1
d = @fog_opacity_duration
@fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
@fog_opacity_duration -= 1
end
end
def update_scrolling
@new_scroll_tempmove_x += @new_scroll_speed_x
@new_scroll_tempmove_y += @new_scroll_speed_y
if @new_scroll_tempmove_x < 0
scroll_left(@new_scroll_tempmove_x.abs.to_i)
else
scroll_right(@new_scroll_tempmove_x.abs.to_i)
end
@new_scroll_tempmove_x %= 1
if @new_scroll_tempmove_y < 0
scroll_up(@new_scroll_tempmove_y.abs.to_i)
else
scroll_down(@new_scroll_tempmove_y.abs.to_i)
end
@new_scroll_tempmove_y %= 1
if ((display_x >= @new_scroll_target_x and @new_scroll_speed_x >= 0) or
(display_x <= @new_scroll_target_x and @new_scroll_speed_x <= 0)) and
((display_y >= @new_scroll_target_y and @new_scroll_speed_y >= 0) or
(display_y <= @new_scroll_target_y and @new_scroll_speed_y <= 0))
@new_scroll_speed_x = 0
@new_scroll_speed_y = 0
@new_scroll_target_x = 0
@new_scroll_target_y = 0
@new_scroll_tempmove_x = 0.0
@new_scroll_tempmove_y = 0.0
end
end
end[/php]
alias_method :nb_aliasmethod_newscroll, :setup
def setup(id)
nb_aliasmethod_newscroll(id)
@new_scroll_speed_x = 0
@new_scroll_speed_y = 0
@new_scroll_target_x = 0
@new_scroll_target_y = 0
@new_scroll_tempmove_x = 0.0
@new_scroll_tempmove_y = 0.0
end
def update
refresh if need_refresh
update_scrolling
@events.each_value {|i| i.update}
@common_events.each_value {|i| i.update}
update_fog
end
def new_scroll_to(x, y, speed = 40)
start_new_scroll(x*128 - display_x, y*128 - display_y, speed)
end
def start_new_scroll(x_dist, y_dist, speed)
@new_scroll_speed_x = x_dist / speed.to_f
@new_scroll_speed_y = y_dist / speed.to_f
@new_scroll_target_x = display_x + x_dist
@new_scroll_target_y = display_y + y_dist
end
def start_scroll(direction, distance, speed)
case direction
when 1 then x, y = -1, 1
when 2 then x, y = 0, 1
when 3 then x, y = 1, 1
when 4 then x, y = -1, 0
when 6 then x, y = 1, 0
when 7 then x, y = -1, -1
when 8 then x, y = 0, -1
when 9 then x, y = 1, -1
end
start_new_scroll(x * distance * 128, y * distance * 128, 2 ** speed)
end
def update_fog
# Manage fog scrolling
@fog_ox -= @fog_sx / 8.0
@fog_oy -= @fog_sy / 8.0
# Manage change in fog color tone
if @fog_tone_duration >= 1
d = @fog_tone_duration
target = @fog_tone_target
@fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
@fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
@fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
@fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
@fog_tone_duration -= 1
end
# Manage change in fog opacity level
if @fog_opacity_duration >= 1
d = @fog_opacity_duration
@fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
@fog_opacity_duration -= 1
end
end
def update_scrolling
@new_scroll_tempmove_x += @new_scroll_speed_x
@new_scroll_tempmove_y += @new_scroll_speed_y
if @new_scroll_tempmove_x < 0
scroll_left(@new_scroll_tempmove_x.abs.to_i)
else
scroll_right(@new_scroll_tempmove_x.abs.to_i)
end
@new_scroll_tempmove_x %= 1
if @new_scroll_tempmove_y < 0
scroll_up(@new_scroll_tempmove_y.abs.to_i)
else
scroll_down(@new_scroll_tempmove_y.abs.to_i)
end
@new_scroll_tempmove_y %= 1
if ((display_x >= @new_scroll_target_x and @new_scroll_speed_x >= 0) or
(display_x <= @new_scroll_target_x and @new_scroll_speed_x <= 0)) and
((display_y >= @new_scroll_target_y and @new_scroll_speed_y >= 0) or
(display_y <= @new_scroll_target_y and @new_scroll_speed_y <= 0))
@new_scroll_speed_x = 0
@new_scroll_speed_y = 0
@new_scroll_target_x = 0
@new_scroll_target_y = 0
@new_scroll_tempmove_x = 0.0
@new_scroll_tempmove_y = 0.0
end
end
end[/php]
zum Lesen den Text mit der Maus markieren
(Ungetestet) sollte das so laufen:
Zitat
Hat jemand einen Plan wie ich die Koordinaten des Tiles kriege, auf dem der Mittelpunkt des Bildschirmausschnittes liegt? Also quasi X/Y vom Bildschirmittelpunkt im 32*32-Felder-System des Makers?
x_mitte = ($game_map.display_x / 128) + 10
y_mitte = ($game_map.display_y / 128) + 7
Funktioniert beides so wie es sollte. Thx ;)
Terranigma 2 - Episode I - Open Beta out now!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!
Ähnliche Themen
-
Events & Technik »-
Map Scroll Und Event Move
(29. September 2010, 22:09)
-
Einsteigerhilfe »-
"lightmap" einfügen [RPGVX]
(4. Juli 2010, 12:27)
-
RGSS 1 Probleme & Talk »-
Kann mir jemand dies scrolling menu script ein bauen ?
(22. Juli 2007, 22:55)
-
Eventtechnik Archiv »-
Ich finde diese verfluchte Funktion einfach nich mehr !
(11. Dezember 2004, 13:02)
-
Eventtechnik Archiv »-
Ich finde diese verfluchte Funktion einfach nich mehr !
(11. Dezember 2004, 13:02)

