• Anmelden

1

Dienstag, 12. Oktober 2010, 21:17

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:

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!

Motto: ich bin der brennende schinken

  • Nachricht senden

2

Dienstag, 12. Oktober 2010, 21:30

distancex = zielX-startX
? oder wie jetzt?
;( :jagen:

3

Dienstag, 12. Oktober 2010, 21:45

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?
Terranigma 2 - Episode I - Open Beta out now!

RPC - Rpg-Maker Community Platform - Spielübergreifende Erfolge und mehr!

Motto: ich bin der brennende schinken

  • Nachricht senden

4

Dienstag, 12. Oktober 2010, 21:59

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
;( :jagen:

5

Dienstag, 12. Oktober 2010, 22:41

Danke für deine Hilfestellungen,

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!

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

6

Dienstag, 12. Oktober 2010, 23:16

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

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?
(Ungetestet) sollte das so laufen:
x_mitte = ($game_map.display_x / 128) + 10
y_mitte = ($game_map.display_y / 128) + 7
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

7

Mittwoch, 13. Oktober 2010, 21:16

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!

Social Bookmarks