FC2ブログ

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ツクール
ジャンル : ゲーム

プロフィール

Suppon

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

Twitter...

Twitter Reload

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

この人とブロともになる