=begin ▼ 乗り物擬似3D化 コンパス表示 ver. 2.1 RPGツクールVXAce用スクリプト 制作 : 木星ペンギン URL : http://woodpenguin.blog.fc2.com/ ------------------------------------------------------------------------------ 概要 □ 乗り物搭乗中、方角と座標を表示します。 □ 本スクリプトは、乗り物疑似3D化スクリプトのオプションです。 乗り物疑似3D化より下に導入してください。 =end #////////////////////////////////////////////////////////////////////////////// # # 設定項目 # #////////////////////////////////////////////////////////////////////////////// module WdTk::Veh3D::OP1 #-------------------------------------------------------------------------- # ● コンパスグラフィック名の設定 # コンパスの中心に表示されるグラフィックです。 # グラフィックは Graphics/System/ から読み込みます。 #-------------------------------------------------------------------------- CompassName = "" #-------------------------------------------------------------------------- # ● コンパスの位置と大きさの設定 #-------------------------------------------------------------------------- Compass_X = 88 # X 座標 Compass_Y = 48 # Y 座標 Compass_W = 80 # 幅 Compass_H = 40 # 高さ #-------------------------------------------------------------------------- # ● 方角グラフィック名の設定 # 方角名を表記するグラフィックの名前です。 # グラフィックは Graphics/System/ から読み込みます。 # 設定されていない場合、文字描写を行なって作成します。 #-------------------------------------------------------------------------- DirNames = ["", "", "", ""] # 東, 西, 南, 北 #-------------------------------------------------------------------------- # ● 方角描写のフォントの設定 # 詳しくはRPGツクールVXAceのヘルプにある Font クラスの説明を見てください。 #-------------------------------------------------------------------------- DirFont = Font.new DirFont.name = "MS 明朝" if Font.exist?("MS 明朝") DirFont.size = 20 DirFont.bold = true DirFont.italic = true #-------------------------------------------------------------------------- # ● 北のフォント色の設定 #-------------------------------------------------------------------------- NorthColor = Color.new(255, 64, 64) #-------------------------------------------------------------------------- # ● 座標を表記する位置 # 0 : 表記しない # 1 : 方角表記の上 # 2 : 方角表記の下 #-------------------------------------------------------------------------- DrawPos = 2 #-------------------------------------------------------------------------- # ● 座標表記の背景タイプ # 0 : なし # 1 : 背景を暗くする #-------------------------------------------------------------------------- PosBack = 1 #-------------------------------------------------------------------------- # ● 座標表記の小数点以下の桁数 #-------------------------------------------------------------------------- Digits = 1 end #////////////////////////////////////////////////////////////////////////////// # # 以降、変更する必要なし # #////////////////////////////////////////////////////////////////////////////// module WdTk @material << :Veh3D_OP1 end #============================================================================== # ■ Spriteset_Vehicle #============================================================================== class Spriteset_Vehicle < Spriteset_Map #-------------------------------------------------------------------------- # ◯ オブジェクト初期化 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op1_initialize initialize def initialize(viewport) @sprite_compass = Sprite_Compass.new(viewport) _wdtk_veh3d_op1_initialize(viewport) end #-------------------------------------------------------------------------- # ◯ 解放 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op1_dispose dispose def dispose @sprite_compass.dispose _wdtk_veh3d_op1_dispose end #-------------------------------------------------------------------------- # ◯ フレーム更新 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op1_update update def update _wdtk_veh3d_op1_update @sprite_compass.update end end #============================================================================== # ■ Sprite_Compass #============================================================================== class Sprite_Compass < Sprite #-------------------------------------------------------------------------- # ● モジュール #-------------------------------------------------------------------------- include WdTk::Veh3D::OP1 #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- BackColor1 = Color.new(0, 0, 0, 128) BackColor2 = Color.new(0, 0, 0, 0) #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport) super @vehicle = $game_player.vehicle self.bitmap = Cache.system(CompassName) self.x = Compass_X self.y = Compass_Y self.ox = bitmap.width / 2 self.oy = bitmap.height / 2 create_dir_sprites create_pos_sprite update end #-------------------------------------------------------------------------- # ● 方角標示スプライトの作成 #-------------------------------------------------------------------------- def create_dir_sprites @dir_sprites = [] DirNames.each_with_index do |name, i| sprite = Sprite.new(viewport) if name.empty? size = DirFont.size sprite.bitmap = Bitmap.new(size * 2, size) sprite.bitmap.font = DirFont.dup sprite.bitmap.font.color = NorthColor.dup if i == 0 text = ["N", "E", "S", "W"][i] sprite.bitmap.draw_text(0, 0, size * 2, size, text, 1) else sprite.bitmap = Cache.system(name) end sprite.ox = sprite.width / 2 sprite.oy = sprite.height / 2 @dir_sprites << sprite end end #-------------------------------------------------------------------------- # ● 座標スプライトの作成 #-------------------------------------------------------------------------- def create_pos_sprite @pos_sprite = Sprite.new(viewport) @x = @y = 0 bitmap.font.size = 18 width = bitmap.text_size(pos_text).width + 64 @pos_sprite.bitmap = Bitmap.new(width, 16) @pos_sprite.bitmap.font.size = 18 @pos_sprite.bitmap.font.outline = true @pos_sprite.x = self.x case DrawPos when 1 @pos_sprite.y = self.y - Compass_H when 2 @pos_sprite.y = self.y + Compass_H end @pos_sprite.ox = @pos_sprite.width / 2 @pos_sprite.oy = @pos_sprite.height / 2 @pos_sprite.visible = DrawPos != 0 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @dir_sprites.each do |sprite| sprite.bitmap.dispose sprite.dispose end @pos_sprite.bitmap.dispose @pos_sprite.dispose bitmap.dispose super end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update ox = Compass_W / 2 oy = Compass_H / 2 oy = oy * (@vehicle.altitude + 100) / 200 if @vehicle.flight? @dir_sprites.each_with_index do |sprite, i| radian = (@vehicle.angle + 90 * i) * Math::PI / 180 sprite.x = self.x + ox * Math.sin(radian) sprite.y = self.y - oy * Math.cos(radian) end if DrawPos != 0 && Graphics.frame_count % 3 == 0 @pos_sprite.bitmap.clear if PosBack == 1 rect = @pos_sprite.bitmap.rect rect.width /= 2 @pos_sprite.bitmap.gradient_fill_rect(rect, BackColor2, BackColor1) rect.x += rect.width @pos_sprite.bitmap.gradient_fill_rect(rect, BackColor1, BackColor2) end @pos_sprite.bitmap.draw_text(0, -1, @pos_sprite.width, 20, pos_text, 1) end end #-------------------------------------------------------------------------- # ● 座標表記のてテキスト取得 #-------------------------------------------------------------------------- def pos_text m = Digits n = 4 + (m == 0 ? -1 : m) sprintf("X:%#{n}.#{m}f, Y:%#{n}.#{m}f", @vehicle.x, @vehicle.y) end end