class TileSprite < Sprite
def initialize(width, height, tilemap, viewport)
super(viewport)
self.bitmap = Bitmap.new(Game::DISPLAY_WIDTH, Game::DISPLAY_HEIGHT)
self.x = 0
self.y = 0
self.ox = 0
self.oy = 0
self.z = 0
@backbuffer = TileBitmap.new(width, height, tilemap)
@bg = Sprite.new(viewport)
@bg.z = 1
@bg.blend_type = 1
@bg.bitmap = Cache.picture('bg')
@mapx = -999
@mapy = -999
@x_plus = (width - Game::DISPLAY_WIDTH) / 2
@y_plus = 128 #(height - Game::DISPLAY_HEIGHT) / 2
@draw_count = false
@x_table = Table.new(416)
@y_table = Table.new(416)
set_render_table(45)
end
def dispose
@bg.dispose if @bg
@backbuffer.dispose if @backbuffer
self.bitmap.dispose if self.bitmap
super
end
def hide
self.visible = false
@bg.visible = false
end
def show
self.visible = true
@bg.visible = true
end
def set_render_table(angle)
return false if angle == @angle
@angle = angle
d = 400.0
rad = angle * Math:

I / 180
sina = Math.sin(rad)
cosa = Math.cos(rad)
x_zoom = 272 * 1.5
for i in 0...416
sy = 208 - i
unless angle == 90
aaa = sy == 0 ? 0: (90 - angle) / 208.0 * sy
aaa = sy < 0 ? 90 + aaa : 90 - aaa
rad = aaa * Math:

I / 180
sy = (sy / Math.sin(rad)) * (d + (sy * Math.cos(rad))) / d
end
to_y = sina.zero? ? -256: ((sy / sina) * (d + (sy * cosa)) / d).round
#to_y = sina.zero? ? -256: ((sy / sina) * (d + (sy * cosa)) / d).round
@y_table[i] = 208 - to_y
#y=1のときのx
to_x = (-x_zoom * (d + (sy * -cosa)) / d) + x_zoom
@x_table[i] = - (272 * to_x / (272 - to_x )).round
end
#一応bgのサイズもかえとく
#90が0で45が100
case @angle
when 45
@bg.zoom_y = 1.0
when 90
@bg.zoom_y = 0.0
else
@bg.zoom_y = (1.0 / 45) * (90 - @angle)
end
@bg.opacity = 255 * @bg.zoom_y
return true
end
#マップ上の座標で設定
def update_map(ox, oy)
return unless self.visible
aox = ($game_map.display_x >> 3 & 31) + @x_plus
aoy = ($game_map.display_y >> 3 & 31) + @y_plus
ud = set_render_table($game_map.get_angle)
sd = @backbuffer.set_map(ox, oy)
return if !sd && !ud && aox == @mapx && aoy == @mapy
update_bitmap(aox, aoy)
end
def update_bitmap(aox, aoy)
@mapx = aox
@mapy = aoy
unless aox == @x_plus && aoy == @y_plus
@draw_count = !@draw_count
return if @draw_count
end
bmp = self.bitmap
bmp.clear
bmph = bmp.height
bmpw = bmp.width
yt = @y_table
xt = @x_table
bb = @backbuffer
from_r = Rect.new(0, 0, 1 , 1)
to_r = Rect.new(0, 0, bmpw, 1)
i = 0
while i < bmph
to_y = yt[i]
if to_y < -@y_plus
i += 1
next
end
to_x = xt[i]
to_r.y = i
ww = 0
while i < bmph
ww += 1
i += 1
break unless to_x == xt[i] && to_y + ww == yt[i]
end
to_r.height = ww
from_r.set(to_x + aox, to_y + aoy, bmpw - to_x - to_x, ww)
bmp.stretch_blt(to_r, bb, from_r)
end
end
end
class Game_Map
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :mode3D
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias a9_003_initialize initialize
def initialize
a9_003_initialize
@mode3D = true
@angle3D = 45
end
#--------------------------------------------------------------------------
def set_angle(v)
@angle3D = v
end
#--------------------------------------------------------------------------
def get_angle
@angle3D
end
end
class Spriteset_Map
#--------------------------------------------------------------------------
# ● ビューポートの作成
#--------------------------------------------------------------------------
alias a9_003_create_viewports create_viewports
def create_viewports
a9_003_create_viewports
@viewport_invisible = Viewport.new(0, 0, 1, 1)
@viewport_invisible.visible = false
end
#--------------------------------------------------------------------------
# ● ビューポートの解放
#--------------------------------------------------------------------------
alias a9_003_dispose_viewports dispose_viewports
def dispose_viewports
a9_003_dispose_viewports
@viewport_invisible.dispose
end
#--------------------------------------------------------------------------
# ● タイルマップの作成
#--------------------------------------------------------------------------
alias a9_003_create_tilemap create_tilemap
def create_tilemap
a9_003_create_tilemap
@tilemap.visible = false
@tile_sprite = TileSprite.new(544+448, 416+128, @tilemap, @viewport1)
end_3d
end
#--------------------------------------------------------------------------
def begin_3d
@tilemap.viewport = @viewport_invisible
@mode3d = true
@tile_sprite.show
end
#--------------------------------------------------------------------------
def end_3d
@tilemap.viewport = @viewport1
@mode3d = false
@tile_sprite.hide
end
#--------------------------------------------------------------------------
# ● タイルマップの解放
#--------------------------------------------------------------------------
alias a9_003_dispose_tilemap dispose_tilemap
def dispose_tilemap
a9_003_dispose_tilemap
@tile_sprite.dispose
end
#--------------------------------------------------------------------------
# ● タイルマップの更新
#--------------------------------------------------------------------------
alias a9_003update_tilemap update_tilemap
def update_tilemap
g = $game_map
unless g.mode3D == @mode3d
@mode3d ? end_3d: begin_3d
end
unless @mode3d
a9_003update_tilemap
else
@tile_sprite.update_map((g.display_x >> 8) - 7, (g.display_y >> 8) - 4)
end
end
end
#==============================================================================
# ■ Game_Vehicle
#------------------------------------------------------------------------------
# 乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。
# 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。
#==============================================================================
class Game_Vehicle < Game_Character
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias a9_003_update update
def update
a = @altitude
a9_003_update
update_angle(a)
end
def update_angle(alti)
def set_angle
$game_map.set_angle(90 - (45 / 8 * (@altitude / 4 + 1)))
end
end
end