Зельда-скроллинг
Информация:
Автор: DeadElf79
Версия скрипта: 1.4
Версия мейкера для использования: VX Ace
Условия использования: используйте как хотите, меня можно не указывать.
Описание:
Скрипт добавляет скроллинг карты как в зельде: карта разделяется на несколько независимых "экранов" (персонаж не всегда находится в центрне экрана), при переходе между "экранами" игровой экран смещается. Кто играл в первую легенду о зельде, тот сразу поймет, о чем этот скрипт.
Примечание:
Знаю, что в какой-то игре видел уже такой скрипт, но хоть убейте, не вспомню название. Помню, что это была третья часть (вроде как) и там была доработанная графика из ртп. Поэтому написал своё с нуля. Прошу любить и использовать без указания автора.
Установка:
1. установите скрипт как обычно
2. в note карты, на которой вы хотите использовать, добавьте слово zelda на отдельной строке.
3. убедитесь, что ваша карта имеет следующие размеры:
- по ширине карта должна быть кратна ширине графики игры, разделенной на 32 (640/32 = 20 тайлов)
- по высоте карта должна быть кратна высоте графики игры, разделенной на 32 (480/32 = 15 тайлов)
Например: для создания карты с двумя "экранами" по ширине и двумя по высоте для графики игры размером 640х480 пикселей задайте ей размер 40х30 тайлов.
Код:# de79 zelda scrolling
# version 1.4
module De79Zelda
REGEXP_MAP_NOTE = /zelda/i
SCROLL_SPEED = 6
WAIT_FOR_SCROLL = true
def self.wait_processing
@wait_processing |= false
end
def self.wait_processing=(value)
@wait_processing = value
end
end
class Game_Map
alias de79setup setup
def setup(map_id)
de79setup(map_id)
@zelda = is_zelda?
end
def is_zelda?
@map.note.each_line("\n") { |line|
return true unless (line =~ De79Zelda::REGEXP_MAP_NOTE).nil?
}
false
end
def zelda_map?
@zelda
end
def modw(x)
return (x.to_f / ($game_map.screen_tile_x)).to_i
end
def modh(y)
return (y.to_f / ($game_map.screen_tile_y)).to_i
end
end
class Game_Event
def on_screen?
gm = $game_map
gp = $game_player
if $game_map.zelda_map?
gm = $game_map
gp = $game_player
screen = Rect.new(
gm.modw(gp.x),
gm.modh(gp.y),
gm.screen_tile_x,
gm.screen_tile_y
)
else
screen = Rect.new(
gp.x - gm.screen_tile_x/2,
gp.y - gm.screen_tile_y/2,
gm.screen_tile_x,
gm.screen_tile_y
)
end
if (screen.x * 16..screen.x * 16 + screen.width).include? @x
if (screen.y * 16..screen.y * 16 + screen.height).include? @y
return true
end
end
false
end
end
class Game_Player
def update
last_real_x = @real_x
last_real_y = @real_y
last_moving = moving?
if De79Zelda.wait_processing
unless $game_map.scrolling?
De79Zelda.wait_processing = false
end
else
move_by_input
end
super
if $game_map.zelda_map?
update_zelda_scroll(last_real_x,last_real_y)
else
update_scroll( last_real_x, last_real_y )
end
update_vehicle
update_nonmoving( last_moving ) unless moving?
@followers.update
end
def center(x, y)
if $game_map.zelda_map?
new_x = modw(x)*$game_map.screen_tile_x
new_y = modh(y)*$game_map.screen_tile_y
$game_map.set_display_pos( new_x, new_y )
else
$game_map.set_display_pos(x - center_x, y - center_y)
end
end
def update_zelda_scroll( last_x, last_y )
ax1 = modw( last_x )
ay1 = modh( last_y )
ax2 = modw( @real_x )
ay2 = modh( @real_y )
direction = 0
direction = 2 if ay2 > ay1
direction = 4 if ax2 < ax1
direction = 6 if ax2 > ax1
direction = 8 if ay2 < ay1
distance = case direction
when 2,8
$game_map.screen_tile_y
when 4,6
$game_map.screen_tile_x
else
0
end
if direction > 0
$game_map.start_scroll( direction, distance, De79Zelda::SCROLL_SPEED )
De79Zelda.wait_processing = true if De79Zelda::WAIT_FOR_SCROLL
end
end
def modw(x)
return (x.to_f / ($game_map.screen_tile_x)).to_i
end
def modh(y)
return (y.to_f / ($game_map.screen_tile_y)).to_i
end
end