FC2ブログ

RGSS2 備忘録 その14 臨機応変に行動できる自動戦闘のアクター(修正版)

イヤッホゥ! スリードッグだぜ!(嘘)

今日のは、以前やった臨機応変に行動できる自動戦闘のアクターで、
逃げるのに失敗したときにも、自動戦闘のアクターが行動してしまう
というバグがあるというご指摘がありましたので、
その修正をしました。


class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    $game_temp.in_battle = true
    @spriteset = Spriteset_Battle.new
    @message_window = Window_BattleMessage.new
    @escaping = false #★
    @action_battlers = []
    create_info_viewport
  end
 
  #--------------------------------------------------------------------------
  # ● 逃走の処理
  #--------------------------------------------------------------------------
  def process_escape
    @info_viewport.visible = false
    @message_window.visible = true
    text = sprintf(Vocab::EscapeStart, $game_party.name)
    $game_message.texts.push(text)
    if $game_troop.preemptive
      success = true
    else
      success = (rand(100) < @escape_ratio)
    end
    Sound.play_escape
    if success
      wait_for_message
      battle_end(1)
    else
      @escaping = true #★
      @escape_ratio += 10
      $game_message.texts.push('\.' + Vocab::EscapeFailure)
      wait_for_message
      $game_party.clear_actions
      start_main
    end
  end
 
  #--------------------------------------------------------------------------
  # ● 戦闘行動の処理
  #--------------------------------------------------------------------------
  def process_action
    return if judge_win_loss
    return if $game_temp.next_scene != nil
    set_next_active_battler
    if @active_battler == nil
      @escaping = false
      turn_end
      return
    end
    return if @active_battler.dead?
    @message_window.clear
    wait(5)
    @active_battler.white_flash = true
    unless @active_battler.action.forcing
      @active_battler.action.prepare
    end
    if @active_battler.actor? and ! @escaping#★
      @active_battler.make_action if @active_battler.auto_battle
    end #★

    if @active_battler.action.valid?
      execute_action
    end
    unless @active_battler.action.forcing
      @message_window.clear
      remove_states_auto
      display_current_state
    end
    @active_battler.white_flash = false
    @message_window.clear
  end
end

 



もし導入したいという方は、スクリプトをそのままコピーして
ここに追加という部分に追加するか、
赤い部分だけをご自分で挿入してみてください。
ではまたです。( ^ω^)ノシ
スポンサーサイト

RGSS 備忘録 その13 動くエネミー

タスクマニアの開発は半永久的に休止することになったので、
タスクマニアのためにとっておいた途轍も無い超秘策スクリプトを
さらけ出したいと思います( ^ω^)

今日やるのは動くエネミーというやつです。
動くと言ってもジャンプしたり攻撃モーションをみせたり
っていうのはムリっす。(´;ω;`)

ここでやるのは、ただゆらゆら動かすって言うだけです。
てっとりばやく説明するとヘラクレスの栄光3みたいに
するって言うことです。( ・`ω・´)

ヘラクレスの栄光と言ったらギリシャの3大RPGのうちの
一つなので知らない人はいないと思いますが。( ^ω^)

まーとりあえずみてみたいという方は下記のスクリプトを
ここに追加っていうところに追加してみてください。
エイリアス使ってないので、ほかの追加スクリプトと競合する
確率大です。そういう場合は、赤い部分だけ対応する部分へ
挿入してみてください。

class Sprite_Battler
  def initialize(viewport, battler = nil)
    super(viewport)
    @battler = battler
    @battler_visible = false
    @effect_type = 0            # エフェクトの種類
    @effect_duration = 0        # エフェクトの残り時間
    @t = rand(720) #★
  end
 
  def update
    super
    if @battler == nil
      self.bitmap = nil
    else
      @use_sprite = @battler.use_sprite?
      if @use_sprite
        motion #★
        self.x = @battler.screen_x + @ax #★
        self.y = @battler.screen_y + @ay #★
        self.z = @battler.screen_z
        update_battler_bitmap
      end
      setup_new_effect
      update_effect
    end
  end
 
  def motion #★
    return unless @battler.movable?
    @ax = (Math.sin(Math::PI * @t * 2 / 360.0) * 10).ceil
    @ay = (Math.sin(Math::PI * @t * 1 / 360.0) * 4).ceil
    @t += 1
    @t = 0 if @t >= 720
  end
end



ヘラクレスの栄光3では、ただ斜めに動いてるだけですが、
ここではリサージュ曲線っていうのを使ってます。( ^ω^)
行動不能になるときちんと止まるようになってます。ヤッタネ( ^ω^)

motionの@ax @ayの部分をいじくってみるとおもしろいかもしれません。
でわみなさん。またです。(^▽^)ノシ

RGSS2備忘録その12 選択肢の文をもう少し長く

今更感ありありですが、久々にRGSS2講座を行います。( ^ω^)

今回のは簡単なので、もしかしたら他の人がすでに紹介してるかもしれませんが、
大目にみてやってください。( ^ω^)

RPGツクールVXは、どういうわけか選択肢の文をウインドウの半分くらいまでしか、
入力(表示)することができません。
090216_01.jpg

なので、今回はスクリプトを使って、ウインドウいっぱいまで、文を表示させたいと思います。

class Game_Message
  attr_accessor :texts2
end

class Window_Message < Window_Selectable
  alias o_convert_special_characters convert_special_characters
  def convert_special_characters
    o_convert_special_characters
    @text.gsub!(/\\T\[([0-9]+)\]/i) { $game_message.texts2[$1.to_i] }
  end
end



まず、上のスクリプトを(ここに追加)ってところらへんに追加してください。
使い方を簡単に説明すると、
$game_message.texts2に選択肢となる文を、配列で格納してやります。
つぎに、\T[n] ( ←nは0~3の数字)で、文章を表示させます。

下の画像のようにやるといいです。
090216_03.jpg
090216_04.jpg

するとどうでしょう。
じゃじゃじゃーん!!
090216_02.jpg

これでウインドウいっぱいに選択肢を表示させることができました。
やったね(^▽^)

この調子で、Task Maniaの製作にもせいを出したいと思います。
でわ またです。(^▽^)ノシ

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

RGSS2備忘録その11 新しいシーンの作成

RPGツクールVXの話にもどります。

今日は新しいシーンの作成についてです。。( ^ω^)
シーンのデータはスクリプト上では$sceneというグローバル変数に
格納され、そのクラスが変化することによって、それぞれに対応した
シーンへと移り変わります。
しかし、ここでは、$sceneを使わずに新たにインスタンスを作成して
用いられるシーンを作ろうかと思います。

どんなふうに動かすのかというと、通常の$sceneで動いているシーン
の合間に、新たにインスタンスを発生させ、新しいシーンを
割り込ませるという風にします。
その新しいシーンが終了すれば、もとの$sceneのシーンが中断したところから
続行するという感じになります。

別名「割り込みシーン」といってもいいかもしれません。( ^ω^)
これは、たとえば、ポップアップメッセージを表示させ、なにかボタンが
押されるのを待つといったシーンや、
アクターを選択させるシーンのように、ちょっとした割り込ませたいシーンを
作りたいという場合に便利かと思います。

今日はそのベースとなるスクリプトだけ紹介したいと思います。
Scene_Baseと同じく、これだけでは何もおきませんので注意してください。

class Instant_Scene_Base < Scene_Base
  def initialize
    super
    @exit = false
    @result = nil
  end
 
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    start                         # 開始処理
    perform_transition            # トランジション実行
    post_start                    # 開始後処理
    Input.update                  # 入力情報を更新
    loop do
      Graphics.update             # ゲーム画面を更新
      Input.update                # 入力情報を更新
      update                      # フレーム更新
      break if @exit              # 画面が切り替わったらループを中断
    end
    Graphics.update
    pre_terminate                 # 終了前処理
    #Graphics.freeze              # トランジション準備
    terminate                     # 終了処理
    return @result
  end
end

 



Scene_Baseと違うのは、シーンを終了するときは@exitというインスタンス変数
trueを代入して、シーンを終了させるということと、シーン終了時に、値を出力
させる機能を持っているということです。@resultのことです。

@resultには、選択肢の結果などを入れておくなど、いろいろ使い道があるかもしれません。

この次に、実際にこのクラスのシーンを使うクラスを作ってみようかと思います。
では、またです。( ^ω^)ノシ

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

RGSS2備忘録その10 エネミー大量・ランダム出現

こんばんわ( ^ω^)
RGSSシリーズは、もうやらないとルーカン様に誓いましたが、
やり方を教えてほしいという要望がありましたので、再開
することにしました。

今日やりまするのは、エネミー大量・ランダム出現というものです。
簡単にたくさんのエネミーの組み合わせを作り出せるというスクリプトです。
とにかく、はやくやりたいんだよ!(`・д・´)
という方は、とりあえず以下のスクリプトを、(ここに追加)という部分に
コピーしてください。
今回のは結構長いので、他のスクリプトを導入しているとエラーが起こる可能性があります。
必ずバックアップを取っておいてくださいね。

class Game_Troop
  def setup(troop_id)
    clear
    @troop_id = troop_id
    @enemies = []
    #★
    if $data_troops[troop_id].pages[0].list[0].code == 108
      setup2
      return
    end
    for member in troop.members
      next if $data_enemies[member.enemy_id] == nil
      enemy = Game_Enemy.new(@enemies.size, member.enemy_id)
      enemy.hidden = member.hidden
      enemy.immortal = member.immortal
      enemy.screen_x = member.x
      enemy.screen_y = member.y
      @enemies.push(enemy)
    end
    make_unique_names
  end
 
  def setup2
    index = 0
    enemy_size = 0
    while $data_troops[@troop_id].pages[0].list[index].parameters[0] != nil
      a = eval($data_troops[@troop_id].pages[0].list[index].parameters[0])
      for i in 1..a[1]
        enemy_id = a[rand(a.size - 2) + 2]
        if (a[0] > rand(100)) or (enemy_size == 0)
          enemy = Game_Enemy.new(enemy_size, enemy_id)
          enemy.hidden = false
          enemy.immortal = false
          @enemies.push(enemy)
          enemy_size += 1
        end
      end
      index += 1
    end
    make_unique_names
  end
end

class Spriteset_Battle
  def lined_up_enemies
    whole_x = 0
    i = 1
    for sprite in @enemy_sprites.reverse
      sprite.battler.screen_y = 285
      whole_x += (sprite.width * sprite.zoom_x).ceil
      i += 1
    end
    line = (whole_x / 544) + 1
    j = 1
    for sprite in @enemy_sprites.reverse
      sprite.battler.screen_x = (544 / (1 + @enemy_sprites.size)) * j
      sprite.battler.screen_y -= (j % line) * 15
      j += 1
    end
  end
end
 
class Scene_Battle
  def start
    super
    $game_temp.in_battle = true
    @spriteset = Spriteset_Battle.new
    @message_window = Window_BattleMessage.new
    @action_battlers = []
    create_info_viewport
    @spriteset.lined_up_enemies #★
  end
end

class Window_TargetEnemy
  def initialize
    commands = []
    @enemies = []
    for enemy in $game_troop.members
      next unless enemy.exist?
      commands.push(enemy.name)
      @enemies.push(enemy)
    end
    row = (@enemies.size / 2) + 1
    super(416, commands, 2, row)
    self.height = 4 * WLH + 32
  end
end



スクリプトの説明は省略します。
どうしても訊きたいことがある方はコメントの方にお願いいたします。

エネミーの指定は、バトルイベントの1ページ目の1行目から注釈で次のように
入力してください。
[r, n, ID1, ID2, ID3・・・・]
r = 出現確率 1~100までの数字
n = 繰り返し数 1以上の数字
ID1, ID2・・・ = ランダムに出現させるエネミーのID


IDが、1、2、3のエネミーを80%の出現確率で、最大10匹登場させたい場合は、

[80, 10, 1, 2, 3]

という風になります。
また、括弧おきに改行して、複数の指定もできます。
080417_01.jpg

という風に。


バトルイベントの1ページ目の1行目を注釈にすることによって、今回のスクリプトが
実行されます。注釈で括弧以外のことを書くと、エラーが起こりますので
注意してください。
出現確率をかなり低い値にしても、1匹目は必ず出現します。
戦闘画面に切り替わったが、エネミーが全く登場しなかった、ということは起こりません。

説明は以上ですが、
あまりエネミーを出しすぎると夢にも出てきますので、注意してくださいね( ^ω^)
ではまた(^▽^)ノシ
プロフィール

Suppon

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

Twitter...

Twitter Reload

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

この人とブロともになる