FC2ブログ

RPGツクールVX RGSS2備忘録その2 戦闘の背景を変える

今年もあとのこすこと数時間となりました。
なので、今日は数分でできる内容にしたいと思います。( ^ω^)
昨日はがんばりすぎましたですしね。

今日は手軽な方法で、戦闘中の背景画像を変えるって言うのを紹介します。
確かサンプルゲームに、マップごとに背景を変えるっていうスクリプト素材が
あったはずですが、もちろんこの場合、素材を新たに用意しなければなりません。
今回は素材を使わないで、ちょっとだけ変えてみるって言うのをやります。

RPGツクールVXには、戦闘中の背景という素材は存在しません。
あの背景画像は、戦闘に入る前に、スクリーンショットを取っておき、
内部的に処理して、つくっているものです。
Spriteset_Battleクラスのcreate_battlebackメソッドの
bitmap.radial_blur(90, 12)ていうのがそれです。
これをコメントアウトすると、戦闘画面直前のマップの画像がそのまま背景となります。

背景がゆらゆら動くのがうざいという方は、
@battleback_sprite.wave_amp = 8ていうところをコメントアウトしてください。
そうするとゆらゆらがとまります。( ^ω^)

また、つぎのは実用的ではありませんが、@battleback_sprite.wave_speed = 120
の120を100倍くらいにすると、画面がプルプルして面白いです。
ずっとこの画面でプレイしたいというひとはいないと思いますが。(´・ω・`)

Supponのお気に入りはこれです。

def create_battleback
source = $game_temp.background_bitmap
bitmap = Bitmap.new(640, 480)
bitmap.stretch_blt(bitmap.rect, source, source.rect)
bitmap.radial_blur(5, 12)
color = Color.new(0, 0, 0, 150)
@battleback_sprite = Sprite.new(@viewport1)
@battleback_sprite.bitmap = bitmap
@battleback_sprite.color = color
@battleback_sprite.ox = 320
@battleback_sprite.oy = 240
@battleback_sprite.x = 272
@battleback_sprite.y = 176
#@battleback_sprite.wave_amp = 8
#@battleback_sprite.wave_length = 240
#@battleback_sprite.wave_speed = 120
end
071231_01.jpg

すこし暗めにするためにSpriteのcolorプロパティを使っています。

bitmap.radial_blur(5, 12)の数値の部分を戦闘ごとに乱数で決めてやるのも面白い
かもしれませんね。
では、今日はこの辺で。
みなさんよいお年を(^▽^)ノシ
スポンサーサイト

テーマ : RPGツクール
ジャンル : ゲーム

RGSS2備忘録その1 壁の上を歩行可能にするスクリプト

今日からRGSS2シリーズをやっていきます。ヤッタネ(^▽^)
ちなみにRGSS2というのはRPGツクールVXでの話しとなります。
XPではないのでお間違えのなく。

で、第1回目は壁グラフィック上を通行可能にする方法であります。
壁グラフィックはダンジョン生成コマンドで使われる壁グラフィックのタイル群です。
071230_01.jpg

通行可能にするのはもちろん、視覚的に水平に見える方です。
垂直に見える壁は、そのまま通行不可のまんまとします。
これ以降、通行可能にする壁グラフィックのことを水平壁と呼ぶことにします。( ・`ω・´)

通常、通行可能、不可能を設定する場合は、ツクール上で通行設定というアイコンを
クリックするか、メニューから選択し、タイル別に○か×を選んでやります。
しかし、そうやると地面と水平壁の間を自由に行き来できるようになってしまいます。
それを回避するために、通行不可のイベントを境目に配置するという方法でも
できなくはないですが入り組んだ一マス分の通路とかは、作れません。(´;ω;`)ウッ
そこで、タイルごとの通行属性を改ざんすることで、そこの問題をうまく回避
しようと思います。

今回は、かなり長くなりそうなのでSupponはここいらで、
お茶を一杯いただこうかとおもいます。

ズズズズズズ←お茶をすする音

(*^▽^)ノアイッ ごちそうさまでした。

では説明にもどります。( ・`ω・´)
まず、タイルグラフィックそれぞれには、個々にIDと通行属性のデータ
が割り当てられています。
それぞれのタイルのIDはトリアコンタンさんという方のホームページに
エクセルのデータとして公開されています。
こちらです→Delusional Field
そちらを拝見すると一目瞭然です。(^▽^)ヤッタネ
一番左上の水平壁のIDは5888はになります。
次に通行属性のデータについてですが、通行可能、不可能はビットでの比較で
行われます。ヘルプやスクリプトにはなぜか、わかりにくい16進数で表記されていますが、
2進数表記であらわすと、わかりやすいです。
↓画像にまとめました。
071230_02.jpg

1の位が0なら歩行可能、1なら歩行不可
2の位が0なら小型船通行可能、1なら通行不可という感じです。
普通の何もない歩行可能な地面なら00000110(0x06)になります。
このような通行属性データがそれぞれのタイルに割り当てられています。

一番左上の水平壁のIDは5888で、その隣は5936になっているのがわかると思います。
なぜこうなっているかというと、オートタイルの組み合わせで、一種類の水平壁は
46通りの組み合わせがあるからなのです。
5936 - 5888 = 48 なので、48通りあるのかと思うかもしれませんが、おそらく残り2つは
使われてないと思います。おそらく48っていうのが 16 * 3 なので、ちょうどキリがいい
数字だから、48ずつIDを割り当ててるんだと思います。
で、どのような組み合わせがあるのかというと、このようになります。多分これで全部です。
わかりやすいように境界を見やすくしました。
071230_03.jpg

この画像に表示されてる番号は、その種のタイルIDの開始番号を差し引いた、それぞれのタイルのIDです。したがって、番号0のタイルのIDは5888です。

続いて、これら46通りの通行属性をつくってみます。
とはいっても、46通りすべて違うデータにする必要はありません。
肝心なのは、4方向で通行可能なのはどの方向かということです。
なので、0番目から15番目までは4方向とも通行可能なので、同じデータでいいっていう
ことがわかるとおもいます。

ここでどのように通行属性を割り当てるかというと、
先ほどの2進数の表記で6の位が空いているのがわかります。なので、水平壁は
とりあえず、この6の位を1とします。そして下4桁で、上下左右の通行可能・不可能を
表したいとおもいます。
とするとこうなります。
071230_04.jpg


だいぶ疲れてきましたが、こんなことでへこたれるSupponではありません( ・`ω・´)
でも、ここで一息いれようと思います。( ^ω^)

ズズズズズ ←ココアをすする音

(*^▽^)ノアイッ ご馳走様でした。

ではつづけます( ・`ω・´)
スクリプト上でこれら46通りのタイルに通行属性を割り当てます。
class Game_Map
  #--------------------------------------------------------------------------
  # ● セットアップ
  #     map_id : マップ ID
  #--------------------------------------------------------------------------
  def setup(map_id)
    @map_id = map_id
    @map = load_data(sprintf("Data/Map%03d.rvdata", @map_id))
    @display_x = 0
    @display_y = 0
    @passages = $data_system.passages
    for m in 0..2
      for k in 0..7
        j = 5888 + 48 * k + 768 * m
        for i in 0..47
          if i < 16
            @passages[i + j] = 0x06
          elsif 16 <= i and  i <= 19
            @passages[i + j] = 0x21
          elsif 20 <= i and  i <= 23
            @passages[i + j] = 0x22
          elsif 24 <= i and  i <= 27
            @passages[i + j] = 0x24
          elsif 28 <= i and  i <= 31
            @passages[i + j] = 0x28
          elsif i == 32
            @passages[i + j] = 0x25
          elsif i == 33
            @passages[i + j] = 0x2a
          elsif i == 34 or i == 35
            @passages[i + j] = 0x23
          elsif i == 36 or i == 37
            @passages[i + j] = 0x26
          elsif i == 38 or i == 39
            @passages[i + j] = 0x2c
          elsif i == 40 or i == 41
            @passages[i + j] = 0x29
          elsif i == 42
            @passages[i + j] = 0x27
          elsif i == 43
            @passages[i + j] = 0x2b
          elsif i == 44
            @passages[i + j] = 0x2d
          elsif i == 45
            @passages[i + j] = 0x2e
          elsif i >= 46
            @passages[i + j] = 0x2f
          end
        end
      end
    end
    referesh_vehicles
    setup_events
    setup_scroll
    setup_parallax
    @need_refresh = false
  end
end
こんな感じになります。(´・ω・`)


新しい通行属性データは、@passagesというインスタンス変数に格納します。

つぎに、Game_CharactorクラスとGame_Playerクラスで
新しい通行判定メソッドを設定してやります。
今回はpassable2?(x, y, self_x, self_y, flag = 0x01)というメソッド
をつくります。
x, yは移動先のタイル、self_x, self_yは今自分が立っている場所のタイルの座標です。

class Game_Charactor
  def map_passable?(x, y)
    return $game_map.passable2?(x, y, @x, @y)
  end
end

class Game_Player
  def map_passable?(x, y)
    case @vehicle_type
    when 0  # 小型船
      return $game_map.boat_passable?(x, y)
    when 1  # 大型船
      return $game_map.ship_passable?(x, y)
    when 2  # 飛行船
      return true
    else    # 徒歩
      return $game_map.passable2?(x, y, @x, @y)
    end
  end
end

最後に、実際の判定処理の改造です。

class Game_Map
  def passable2?(x, y, self_x, self_y, flag = 0x01)
    for event in events_xy(x, y)            # 座標が一致するイベントを調べる
      next if event.tile_id == 0            # グラフィックがタイルではない
      next if event.priority_type > 0       # [通常キャラの下] ではない
      next if event.through                 # すり抜け状態
      pass = @passages[event.tile_id]       # 通行属性を取得
      next if pass & 0x10 == 0x10           # [☆] : 通行に影響しない
      return true if pass & flag == 0x00    # [○] : 通行可
      return false if pass & flag == flag   # [×] : 通行不可
    end
    for i in [2, 1, 0]                      # レイヤーの上から順に調べる
      tile_id = @map.data[x, y, i]          # タイル ID を取得
      return false if tile_id == nil        # タイル ID 取得失敗 : 通行不可
      pass = @passages[tile_id]             # 通行属性を取得
      self_pass = @passages[@map.data[self_x, self_y, 0]]
      if i == 0 and flag == 0x01
        if self_pass & 0x20 == 0x20 #★ 今たっている場所の水平壁判定
          if x > self_x #右を向いている
            return false if self_pass & 0x04 == 0x04
          elsif x < self_x #左を向いている
            return false if self_pass & 0x01 == 0x01
          elsif y > self_y #下を向いている
            return false if self_pass & 0x08 == 0x08
          elsif y < self_y #上を向いている
            return false if self_pass & 0x02 == 0x02
          end
        end
        if pass & 0x20 == 0x20 #★ 移動先の水平壁判定
          if x > self_x #右を向いている
            return false if pass & 0x01 == 0x01
          elsif x < self_x #左を向いている
            return false if pass & 0x04 == 0x04
          elsif y > self_y #下を向いている
            return false if pass & 0x02 == 0x02
          elsif y < self_y #上を向いている
            return false if pass & 0x08 == 0x08
          end
          return true
        end
      end
      next if pass & 0x10 == 0x10           # [☆] : 通行に影響しない
      return true if pass & flag == 0x00    # [○] : 通行可
      return false if pass & flag == flag   # [×] : 通行不可
    end
    return false                            # 通行不可
  end
end



となります。
かなり長いですが、これはSupponの構文の作り方がへたくそだからです。
うまい人だったら、もっと短い文でまとめられるのではないかと思います。

これで、このような立体的なマップもつくれるようになったのではないでしょうか。
071230_05.jpg

では、今日はこのへんで(^▽^)ノシ

テーマ : RPGツクール
ジャンル : ゲーム

RPGツクールVX発売

キタ━━━━(゚∀゚)━━━━ !!!!!
キタ━━━━(゚∀゚)━━━━ !!!!!
キタ━━━━(゚∀゚)━━━━ !!!!!
ついにRPGツクールVXが発売されました(゚∀゚)
で、いきなりスクリプトをいじくり始めたSupponでした。

今日の一枚
071227_01.jpg

戦闘背景画面をかえてみました。
説明は、のちほどいろいろ吟味してからすると思います。

とにかく、今夜はスクリプトをいじくり尽くします。( ^ω^)
ではまた(^▽^)ノシ

テーマ : RPGツクール
ジャンル : ゲーム

RGSS1備忘録その4 他のマップのイベントの呼び出し

どうも、こんばんわ。
今年のクリスマスも一人ぼっちのすっぽんです。(´;ω;`)ウッ

今日は、他のマップからイベントを呼び出すって言うのをやります。( ^ω^)
RPGツクールXPにはもともとイベントを呼び出すっていうコマンドがないので、
この技は結構使えるかもしれません。
で、どうやるのかというと、マップに配置したイベントの
イベントコマンドで、スクリプトを記述して、設定を行います。
次に記述内容ですが、

map = load_data(sprintf("Data/Map%03d.rxdata", map_id))
event = map.events[new_event_id]
id = $game_map.events.size + 1
$game_map.events[id] = Game_Event.new($game_map.map_id, event)
$game_map.events[id].id = id
$scene.refresh_spriteset
となります。赤文字のmap_idに呼び出したいイベントがいるマップID、new_event_idにそのイベントのIDを入れます。もちろん数字で入れます。ここで注意点がひとつ、4行目のGame_Event.newの後の括弧が次の行にまたがるとエラーになります。エンターキーで改行しなくてもエラーになります。なので、「=」のあとで、わざと改行しておくのが無難です。

でわ、説明に移ります。まず1行目ではロードしたマップのデータをmapという変数にいれときます。次の行で、さっきロードしたマップのイベントのデータをeventという変数に入れます。
3行目で、新しく呼び出すイベントのIDを決めます。
4行目では現在のマップのデータ(インスタンス)にさっき今呼び出したイベントを入れちゃいます。Game_Mapクラスの@eventsは、事前にスクリプトエディタでattr_accessorで代入可能な状態にしておいてください。
5行目で新しく呼び出したイベントのイベントIDを設定してあげます。これがないといろいろう具合の発生が予想されます。こちらも、スクリプトエディタで、代入可能な形にしてあげてください。
そして、最後の行で、スプライトとして表示させます。もともとrefresh_spritesetというメソッドは存在しません。やはりこれもスクリプトエディタを使って、メソッドを定義します。
定義の内容は以下のとおりです。

class Scene_Map
def refresh_spriteset
@spriteset.dispose
@spriteset = Spriteset_Map.new
end
end

これで、設定は完了です。頻繁に使う場合は、まとめてひとつのメソッドにしてやるのが得策かと思います。この方法は思いついたばかしなので、いろいろやっているうちにエラーが出るかもしれません。デバックを怠らないようにしましょう。
では今日はこの辺で(^▽^)ノシ

テーマ : RPGツクール
ジャンル : ゲーム

RGSS1備忘録その3 アイテムの分類

皆さんこんばんわ。とうとうVX発売まで10日を切りました。( ^ω^)
が、Supponはまだまだプログラム力を鍛えるためにXPでRGSSをいじくりまわしています。

今日はアイテムの分類をやります。(´・ω・`)
前回までは、スクリプトそのものをザザザ!っと載せていましたが、ブログが長くなるので
今度からは要点だけを書こうと思います。期待していた人ごめんね。
ていうか、だれもいないか( ^ω^)

えー、前回はアイテムと武器と防具の分類の仕方をやりました。見てない人はこちらを
見てください。RGSS1備忘録その2 アイテムウインドウのソート

今日はアイテムに新たに食料という種類を作り、これをアイテムウインドゥ上で分類します。
画面はこのようになります。
ジャジャジャン!
071218_02.jpg

地味ですがいまはこれで勘弁してください。(´;ω;`)ウッ
それで、前回のやり方で、今回新しく「食料」という項目を付け加えます。
前回の記事をみれば、すぐできると思います。「食料の」インデックスは0にしてます。

次にデータベース上でアイテムの属性に食べ物と飲み物というのを作ります。
071218_01.jpg


そしたら、今度はまたスクリプトに戻り、Window_Itemクラスを改造します。
refreshメソッドにアイテムを追加とあるので、そこんところで、
ソートウインドウのインデックスが0のときに
「食べ物」と「飲み物」という属性にチェックが入っているアイテムを追加する
というように、スクリプトを組めば、今回の目的は達成です。
属性にチェックが入っているかどうか調べるには
$data_items[i].element_set.include?(id)といれます。idの部分には属性の
idの番号を入れます。
$data_items[i].element_setは、配列なので、
たとえば「食べ物」の属性idが20で、それにチェックが入っていた場合、
20という数字が$data_items[i].element_setの要素として入っています。
したがって、食料に当てはまる属性のidの番号を使って
$data_items[i].element_set.include?(id)を調べ、trueならアイテムを
追加するというようにすれば、属性の違いによるアイテムの分類が
可能となります。
えー、前回にくらべてかなり簡単に説明しています。
どうしてもわからなくて、聞きたい事がある場合は、コメントの方にお願いします。
では、また(^▽^)ノシ

テーマ : RPGツクール
ジャンル : ゲーム

RGSS1備忘録その2 アイテムウインドウのソート

今日は、アイテムウインドウのソートについてやります。
通常ですとアイテムウインドウには、アイテムと一緒に武器や防具なども一緒に
表示されてしまいます。これだと、持ち物がどんどん増えてくると、探すのに時間がかかり
「あのアイテムねぇぞ、どこいったゴルァ!ヽ(`Д´)ノ」てなことになったりします(´・ω・`)
そこで、アイテム、武器、防具をそれぞれ分類してアイテムウインドウに表示させる
っていうのをやりたいと思います。

まず、スクリプトのScene_Itemの改造から

 


 

class Scene_Item
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★
  attr_reader:sort_window_index     #ソートウインドウのインデックス
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★

  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    #ソートウインドウの作成
    s1 = "アイテム"
    s2 = "武器"
    s3 = "防具"
    @sort_window = Window_Command.new(160, [s1, s2, s3])
    @sort_window.z = 200
    @sort_window_index = 0
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # ヘルプウィンドウ、アイテムウィンドウを作成
    @help_window = Window_Help.new
    @item_window = Window_Item.new
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    @item_window.active = false    #アイテムウインドウを非アクティブ化
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # ヘルプウィンドウを関連付け
    @item_window.help_window = @help_window
    # ターゲットウィンドウを作成 (不可視・非アクティブに設定)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false

    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @help_window.dispose
    @item_window.dispose
    @target_window.dispose
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    @sort_window.dispose
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # ウィンドウを更新
    @help_window.update
    @item_window.update
    @target_window.update
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    @sort_window.update            #sort_windowのアップデート
    #sort_windowがアクティブの場合update_sortを呼ぶ
    if @sort_window.active
      update_sort
      return
    end
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★   
    # アイテムウィンドウがアクティブの場合: update_item を呼ぶ
    if @item_window.active
      update_item
      return
    end
    # ターゲットウィンドウがアクティブの場合: update_target を呼ぶ
    if @target_window.active
      update_target
      return
    end
  end
 
 
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ソートウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_sort
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # メニュー画面に切り替え
      $scene = Scene_Menu.new(0)
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      @item_window.active = true
      @sort_window.active = false
      @sort_window.visible = false
      @item_window.refresh
    end
    if Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN)
      @sort_window_index = @sort_window.index
      @item_window.refresh
    end
  end
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 
end





付け足す部分は、赤くしました。イェーィ
まず、ソートウインドウは、このように表示させます。
071216_02.jpg

ではスクリプトの解説に移ります。
attr_reader:sort_window_indexは、ソートウインドウのインデックスをあとから、
Window_Itemクラスの@item_windowが参照するために設定します。
今回はインデックス0がアイテム、1が武器、2が防具となっています。
アイテムウインドウは@item_window.active = falseで、非アクティブ化にしておきます。
これをしないと、ソートウインドウと、アイテムウインドウが連動して動いてしまいます。
また、@sort_window.disposeで、シーンが変わったときにソートウインドウを解放させます。
これを忘れると、いつまでたってもソートウインドウが表示されたままになってしまいます。

次に、フレームの更新です。
まず、@sort_window.updateでウインドウの動きを視覚化します。
そのあとの文は、ソートウインドウがアクティブであれば、update_sortメソッドを
実行するというものです。
ソートウインドウ、アイテムウインドウ、ターゲットウインドウの3つのうち、
シーンがアイテムに移った直後は、ソートウインドウのみがアクティブになるように
mainのところで、設定したので最初はupdate_sortを実行します。

update_sortでは、Bボタンが押されたときは、メニュー画面に戻る、Cボタンが押されときは
アイテムウインドウに移る、上下ボタンが押されたときは、アイテムウインドウをリフレッシュ
すると言うように設定しました。

次にWindow_Itemクラスのrefreshメソッドの改造です。

  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    if $game_temp.in_battle
      # アイテムを追加
      for i in 1...$data_items.size
        if $game_party.item_number(i) > 0
          @data.push($data_items[i])
        end
      end
    else
      case $scene.sort_window_index
      when 0   # アイテムを追加
        for i in 1...$data_items.size
          if $game_party.item_number(i) > 0
            @data.push($data_items[i])
          end
        end
      when 1   # 武器を追加
        for i in 1...$data_weapons.size
          if $game_party.weapon_number(i) > 0
            @data.push($data_weapons[i])
          end
        end
      when 2   # 防具を追加
        for i in 1...$data_armors.size
          if $game_party.armor_number(i) > 0
            @data.push($data_armors[i])
          end
        end
      end
    end
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # 項目数が 0 でなければビットマップを作成し、全項目を描画
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end

今度は@data = []という部分から # 項目数が・・・という部分までの赤い部分
を付け足します。
ここでは、戦闘中だったらアイテムだけを、またそれ以外で、ソートウインドウのインデックスが
0ならアイテムを、1なら武器を、2なら防具をアイテムウインドウに
表示させるというふうにしています。ソートウインドウのインデックスの参照は
$scene.sort_window_indexで行います。Scene_Itemクラスで、
attr_reader:sort_window_indexを忘れると、Window_Itemクラスで、ソートウインドウの
インデックスの参照ができなくなってしまいますので注意してくださいね( ・`ω・´)。

これで、アイテムが何百個に増えても怖くないと思います。
とはいえ、実は、武器や防具は基本的にはRPGツクールXPでは使えないようになってる
ので、実はこのままではあまりソートの効果はありません。Σ(゚Д゚; エーッ!
ですが、今後アイテム(武器と防具をのぞく)をさらに、分類したいという場合に
今回の方法が役に立ってくると思います。この次はアイテムをさらに分類する方法に
ついて紹介したいと思います。今日はこれまで。
でわまた(^▽^)ノシ

テーマ : RPGツクール
ジャンル : ゲーム

RGSS1備忘録その1 ゲームバトラーのズーム

昨日の会社の飲み会で飲みすぎて、今日半日ぐったりしていたSupponです。Σ(・ω・`;)
今後飲みすぎには、気をつけたいとおもいます。(´;ω;`)ウッ

えー、今日からRGSSの備忘録シリーズをはじめます。
これはなんなのかっつーと、「前に作ったあのスクリプトどうやるんだっけ・・」
と、なった場合にすぐ思い出せるように記録するためのものです。
また、これからRGSSを勉強する人々の糧にもなるかもしれません。
ただ、Suppon自身もRGSSについてはド素人なので、ここで言ってるのが
最善の方法ということはあまりないと思います。
もし、もっといい方法があるよ、という方がございましたら、コメントの方に
よろしくお願いします。
あと、今回はRGSS1となってますが、これはRPGツクールXPでの話となります。
今度出るRPGツクールVXがRGSS2なので、XPではRGSS1というふうにします。

では、本題に入りますイェーィ
今回はゲームバトラーのズームです。
同じ素材で、スクリプト中でスプライトを大きくしたり小さくしたりするものです。
071215_02.jpg

これを使えば、わざわざ大きさの違う素材を準備しなくてもいいので、
容量を節約できます。ただ、あまり拡大しすぎるとギザギザが目立ってくるのが欠点です。

で、どうやるのかというとまず、データベースのシステムで
ズームという名前の属性を作っておきます。名前はなんでもいいです。
そして、拡大・縮小させたいエネミーを属性有効度をつかって設定します。
071215_01.jpg

データベース側は、これだけです。あとはスクリプトに頼ります。

まず・・・いやその前に

必ずバックアップをとっておいてくださいね。「ここに書いてあるとおりにやったら、動かなくなったよ。」なーんてなってもSupponはいっさい責任を負いませんので。


では、本題に戻ります。

class Game_Enemy < Game_Battler
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  attr_reader   :zoom
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     troop_id     : トループ ID
  #     member_index : トループメンバーのインデックス
  #--------------------------------------------------------------------------
  def initialize(troop_id, member_index)
    super()
    @troop_id = troop_id
    @member_index = member_index
    troop = $data_troops[@troop_id]
    @enemy_id = troop.members[@member_index].enemy_id
    enemy = $data_enemies[@enemy_id]
    @battler_name = enemy.battler_name
    @battler_hue = enemy.battler_hue
    @hp = maxhp
    @sp = maxsp
    @hidden = troop.members[@member_index].hidden
    @immortal = troop.members[@member_index].immortal
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    case $data_enemies[@enemy_id].element_ranks[20]
      when 1
        @zoom = 0.5
      when 2
        @zoom = 0.75
      when 3
        @zoom = 1
      when 4
        @zoom = 1.5
      when 5
        @zoom = 2
      when 6
        @zoom = 2.5
    end
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  end

という風にGame_Enemy クラスのinitializeを変更します。


ここでやってるのは、Game_Enemyクラスにzoomというインスタンス変数を
設定して、スプライト生成時に拡大・縮小するというものです。
このzoom変数はSprite_Battlerクラスで参照するのでattr_readerを設定します。
次にエネミーの属性有効度を調べるには$data_enemies[@enemy_id].element_ranks[20]
と入れます。
属性有効度は、データベースでAと設定したものは1となります。Bなら2、Cなら3です。
通常はCが設定されるので、Cを1倍にします。
ここでは、属性有効度Aが0.5倍、Bが0.75倍、Cが1倍、Dが1.5倍、Eが2.0倍、Fが2.5倍
というふうにしました。

つぎに

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # バトラー
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     viewport : ビューポート
  #     battler  : バトラー (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, battler = nil)
    super(viewport)
    @battler = battler
    @battler_visible = false
    #★★★★★★★★★★★★★★★★★★★★★★★★
    if battler.class == Game_Enemy
      self.zoom_x = battler.zoom
      self.zoom_y = battler.zoom
    end
    #★★★★★★★★★★★★★★★★★★★★★★★★
end


というふうにSprite_Battlerクラスinitializeメソッドを変更します。
self.zoom_x = battler.zoomでX方向にズーム、
self.zoom_y = battler.zoomでY方向にズームさせることができます。
これで、属性有効度を使うことによってスプライトの拡大・縮小ができるようになったと
思います。
余談ですが、Spriteクラスには画像を左右反転させるmirrorや、透明度を変更するopacity
というようなメソッドが用意されているので、今回紹介した方法を用いれば、
いろんなふうにスプライトを表示させることができるでしょう。

長くなりましたが、今日はこの辺で(^▽^)ノシ

テーマ : RPGツクール
ジャンル : ゲーム

RPGツクールVX体験版その2

こんばんわ。かなり寒くなってきました。
インフルエンザに感染しないようにうまくウイルスをよけていきましょう。

さて、RPGツクールVXの解像度は544×416 と昨日
かきましたが、スクリプトでGraphics.resize_screen(width, height)
のように、widthに幅、height高さにを入れると解像度を変更できるようです。
最大でXPとおなじ640×480までですが、これで完全にフルスクリーンのゲームが
作れるとおもいます。(^▽^)
ただし、すべてのシーンのウインドウやスプライトがその解像度にフィットするように
改造する必要がありますがね。(´・ω・`)

はなしはかわって、VXではデータベースのアイテムや新たにメモを
打ちこめられるようになっています。これがただのメモなら何でもないんですが
実はここに書いたメモをスクリプト中で文字列として参照できるようになっているのです。
ということは、そこのメモにスクリプトを記述しておけばeval(expr) つかって、
アイテムやエネミー固有のスクリプトを実行できるということです。(^▽^)ヤッタネ!
そうすれば、アイテムの重さや、耐久性などといった新しいパラメータを
作ることもできるとおもいます。
でもQuest Maniaではやらないとおもいます。めんどくさそうなのでね。
では またあした。ノシ

テーマ : ゲーム製作 関連
ジャンル : ゲーム

RPGツクールVX体験版

RPGツクールVX体験版をダウンロードしました。
071211_gazou


買う予定の人はすでにご存知だと思いますが、
プレイ画面の解像度が、544×416という変な値になっています。
一応、フルスクリーンでゲームを起動させるというオプションがありますが、
これをやると、おそらく640×480の解像度で、足りない部分は
黒く塗りつぶされた画面となります。動きは滑らかですがね。

今回からはマップを作るとき、レイヤーの上層や下層を気にすることなく
直感的にタイルを敷くことができるようになってるのですが、
レイヤーの上にもう一個レイヤーを敷くというのができなくなってます。
これはすごく不満です。(´・ω・`)

あと、スクリプトはRGSSからRGSS2に進化したそうですが、
少しグラフィック関係のエフェクトが増えただけで、
あまり以前と変わらないように見えました。

とりあえず今日はこの辺まで。

ブログ開始(^▽^)

ブログを開始しました。(^▽^)ヤッタネ!
RPGツクールVXで作るゲームについて書いていこうとおもいます。
念のため公式ホームページも立ち上げておきました。
まだ、内容はほとんどないようですが。
とりあえず今日はこれだけ。

公式ホームページ
Quest Mania 公式ホームページ

テーマ : ブログはじめました!
ジャンル : 日記

プロフィール

Suppon

Author:Suppon
すっぽんでーす。(^▽^)
カルドラ鋭意制作中( ・`ω・´)
Twitter => suppon01
メールはこちらへ
suppon2008@gmail.com

Twitter...

Twitter Reload

最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる