スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

web拍手 by FC2   

[RGSS]狙い打ち

使い方は → こちら

[RGSS]狙い打ち
最終更新:2011/06/06

狙い撃ちスキル(プレイヤーがカーソルを動かしてエネミーを狙う)を作れます。

※このスクリプトは今後修正する可能性があります

スクリーンショット サムネイルクリックで拡大画像が見られます。
rgss_neraiuti.jpg

プログラムは続きにあります。

=begin
===============================================================================
  ☆★☆★☆★☆★ 狙い打ち ★☆★☆★☆★☆
=============================================================================== 

 製作・開発:STERS

  Page::http://gamemaking.web.fc2.com/

導入方法------------------------------------------------------------------

    このスクリプトを Scene_Debug より下 Main より上に
   新しく作ったセクションにコピペして入れてください。
    
--------------------------------------------------------------------------

これを導入することで
狙い打ちができるようになります。

使い方--------------------------------------------------------------------
1.まずはこのスクリプトを導入してください。

2.設定項目を編集してください

3.設定項目にて作ったスキルを作成し、
  アクターに覚えさせる。

--------------------------------------------------------------------------
対象画像の中心に近いほどダメージが大きくなります。

スキルの対象範囲内から一体狙い撃つ、という仕様のため、
スキルの対象は 敵全体 または 味方全体 のみで機能します。

=end
#==============================================================================
# ★ 設定項目
#==============================================================================
class Scene_Battle
  $data_system = load_data("Data/System.rxdata") # ←消去不可
  
  #
  # 狙い打ち属性
  #
  NERAIUTI = $data_system.elements.index("狙い打ち")
  
  #
  # 狙い打ちのバトラーのファイル名( Battlersへ放り込んでください )
  #
  NERAI_CHARA = "target.png"
  
  #
  # ダメージ倍率 //不要な場合はすべて同じ数値にしてください。
  #
  #   [ギリギリはいってる, 通常, ほぼ真ん中]
  #
  NERAI_DAMAGE_EX = [0.2, 1.0, 3.0]
  
  #
  # 狙い打ちの移動速度
  #
  #   単位は Pixel です
  #
  NERAI_MOVE_SPEED = 10
  
  #
  # 狙う時間
  #
  #  単位はフレームで
  #    Graphics.frame_rate :1秒間に画面を更新する回数
  #
  NERAI_TIME = 1 * Graphics.frame_rate  #これで、約1秒間
#==============================================================================
# ■ Scene_Battle
#==============================================================================
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias neraiuti_make_skill_action_result make_skill_action_result unless $@
  def make_skill_action_result
    @skill = $data_skills[@active_battler.current_action.skill_id]
    for ele in @skill.element_set
      next unless ele == NERAIUTI
      neraiuti
      @nerai.dispose
      @nerai2.bitmap.dispose
      @nerai2.dispose
      @phase4_step = 6
      return
    end
    neraiuti_make_skill_action_result
  end
  #--------------------------------------------------------------------------
  # ★ 狙い打ち専用ターゲット処理メソッド
  #--------------------------------------------------------------------------
  def nerai_target_effect(user, skill)
    a = [@nerai2.x + @nerai.bitmap.width/2, @nerai2.y + @nerai.bitmap.height/2]
    dmg = false
    for target in @target_battlers
      b = [
            [target.screen_x, target.screen_y - target.height/2],
            [target.screen_x - target.width/2, target.screen_y - target.height],
            [target.screen_x + target.width/2, target.screen_y],
            [target.width/2/10, target.height/2/10]
          ]
      next unless b[1][0] <= a[0] && a[0] <= b[2][0] && b[1][1] <= a[1] && a[1] <= b[2][1]
      if ((skill.scope == 3 or skill.scope == 4) and target.hp == 0) or
         ((skill.scope == 5 or skill.scope == 6) and target.hp >= 1)
        next
      end
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= target.pdef * skill.pdef_f / 200
        power -= target.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      damage = power * (rate / 20)
      if skill.variance > 0 and damage.abs > 0
        amp = [damage.abs * skill.variance / 100, 1].max
        damage += rand(amp+1) + rand(amp+1) - amp
      end
      if ((skill.scope == 4 or skill.scope == 6) and damage <= 0) or 
         (skill.scope == 2 and damage > 0)
        i = 0
        if b[0][0] - b[3][0] <= a[0] && a[0] <= b[0][0] + b[3][0] &&
           b[0][1] - b[3][1] <= a[1] && a[1] <= b[0][1] + b[3][1]
          i = 2
        elsif b[0][0] - b[3][0]*7 <= a[0] && a[0] <= b[0][0] + b[3][0]*7 &&
              b[0][1] - b[3][1]*7 <= a[1] && a[1] <= b[0][1] + b[3][1]*7
          i = 1
        end
        damage = (damage * NERAI_DAMAGE_EX[i]).round
        target.damage = damage
        target.hp -= damage
        target.damage_pop = true
        dmg = true
      end
    end
    return dmg
  end
  #--------------------------------------------------------------------------
  # ★ 狙い打ちメソッド
  #--------------------------------------------------------------------------
  def neraiuti
    @nerai = RPG::Sprite.new
    @nerai2 = RPG::Sprite.new
    @nerai2.bitmap = RPG::Cache.battler(NERAI_CHARA,0)
    @nerai.bitmap = Bitmap.new(@nerai2.bitmap.width,@nerai2.bitmap.height)
    @nerai.x = @nerai2.x = 320 - @nerai.bitmap.width / 2
    @nerai.y = @nerai2.y = 160 - @nerai.bitmap.height / 2
    @nerai.z = @nerai2.z = 99999
    @count = 0
    @active_battler.sp -= @skill.sp_cost
    @status_window.refresh
    @help_window.set_text(@skill.name, 1)
    @active_battler.white_flash = true
    loop do
      update_windows_and_ex
      break if Input.trigger?(Input::C) or @count >= NERAI_TIME
    end
    set_target_battlers(@skill.scope)
    f = nerai_target_effect(@active_battler, @skill)
    @nerai.animation($data_animations[@skill.animation2_id], f)
    @nerai.x = @nerai2.x
    @nerai.y = @nerai2.y
    @count = 0
    loop do
      update_windows_and_ex
      break if @count / Graphics.frame_rate >= 0.5
    end
  end
  #--------------------------------------------------------------------------
  # ★ 更新
  #--------------------------------------------------------------------------
  def update_windows_and_ex
    Graphics.update
    Input.update
    @help_window.update
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    @message_window.update
    @spriteset.update
    @nerai.update
    @count += 1
    target_move unless @count >= NERAI_TIME
  end
  #--------------------------------------------------------------------------
  # ★ 狙い打ちのキャラを動かすメソッド
  #--------------------------------------------------------------------------
  def target_move
    @nerai2.x += NERAI_MOVE_SPEED if Input.press?(Input::RIGHT)
    @nerai2.x -= NERAI_MOVE_SPEED if Input.press?(Input::LEFT)
    @nerai2.y += NERAI_MOVE_SPEED if Input.press?(Input::DOWN)
    @nerai2.y -= NERAI_MOVE_SPEED if Input.press?(Input::UP)
    @nerai2.x = 0 if @nerai2.x <= 0
    @nerai2.y = 0 if @nerai2.y <= 0
    @nerai2.x = (640 - @nerai2.bitmap.width) if @nerai2.x >= (640 - @nerai2.bitmap.width)
    @nerai2.y = (480 - @nerai2.bitmap.height) if @nerai2.y >= (480 - @nerai2.bitmap.height) 
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  def width
    return (RPG::Cache.battler(@battler_name,0).width)
  end
  def height
    return (RPG::Cache.battler(@battler_name,0).height)
  end
end


web拍手 by FC2   

コメントの投稿


非公開コメント

コメント

STERS's Development Room

STERSの開発室っぽい何か。


プロフィール

Name:STERS
Unity3D/C#/PHP/js/C++/VB
などを勉強中です

[STERS's Room]
[ファイル置き場]

カテゴリー
最近の記事
最近のコメント
カレンダー
08 ≪│2017/09│≫ 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
RSSリンクの表示
ブログ内Google検索
Google
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。