Project1

标题: 新人求教一个cp问题 [打印本页]

作者: 1192939463    时间: 2014-7-17 15:05
标题: 新人求教一个cp问题
RUBY 代码复制
  1. module XRXS65
  2.   #
  3.   # 「バトルスピード」(数値が高いほど早い)
  4.   #
  5.   SPEED = 0.7
  6.   #
  7.   # 戦闘開始時 CP。 固定値と占有率
  8.   #
  9.   CP_PRESET_FIXNUM = 0
  10.   CP_PRESET_RATIO  = 2.0
  11.   #
  12.   # ターンコントローラ (nil  : カウント/ターンを有効。
  13.   #                     数値 : そのインデックスをもつエネミーが支配)
  14.   #
  15.   TC = 0
  16.   #
  17.   # カウント/ターン (TCが有効な場合は無視)
  18.   #
  19.   CPT = 40
  20.   #
  21.   # CP スキン
  22.   #
  23.   SKIN        = "Line"  # スキンファイル名(Graphics/Windowskinsフォルダ)
  24.   LINE_HEIGHT =  6        # スキンの"一行"の縦幅[単位:ピクセル]
  25.   #
  26.   # 表示位置セッティング
  27.   #
  28.   X_OFFSET = 164    # 横位置
  29.   Y_OFFSET = 464    # 縦位置
  30.   ALIGN    =   2    #「位置揃え」(CPメーターの位置。0:左寄せ 1:中央 2:右寄せ)
  31.   MAX      =   4    # 確保するサイズ[単位:~人分]
  32.   #
  33.   # アクターコマンドがポップしたときの効果音
  34.   #
  35.   COMMAND_UP_SE = "Audio/SE/select.ogg"
  36. end
  37. #==============================================================================
  38. # --- CP メーターの描画情報の取得 --- (Game_Battlerにインクルードされます)
  39. #==============================================================================
  40. module XRXS_CP
  41.   #--------------------------------------------------------------------------
  42.   # ○ スキンライン (スキンの何行目を使うか)
  43.   #--------------------------------------------------------------------------
  44.   def cp_linetype
  45.     # CP フルの場合はスキンの 2 行目を使う
  46.     return 2 if self.cp_full?
  47.     # 通常はスキンの 1 行目を使う
  48.     return 1
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ○ メーター量[単位:%]
  52.   #--------------------------------------------------------------------------
  53.   def cp_lineamount
  54.     # 戦闘不能の場合は 0 %として表示させる
  55.     return 0 if self.dead?
  56.     # CP値を%値に変換して返却する
  57.     return 100 * self.cp / self.max_cp
  58.   end
  59. end
  60. #
  61. # カスタマイズポイントここまで。
  62. #------------------------------------------------------------------------------
  63.  
  64.  
  65.  
  66. #==============================================================================
  67. # --- XRXS. CP機構 ---
  68. #==============================================================================
  69. module XRXS_CP_SYSTEM
  70.   #----------------------------------------------------------------------------
  71.   # ○ 合計 AGI の取得
  72.   #----------------------------------------------------------------------------
  73.   def self.total_agi
  74.     total = 0
  75.     for battler in $game_party.actors + $game_troop.enemies
  76.       total += battler.agi
  77.     end
  78.     return total
  79.   end
  80. end
  81. #==============================================================================
  82. # --- バトラーにCP機能を追加 モジュール ---
  83. #==============================================================================
  84. module XRXS_CP
  85.   #--------------------------------------------------------------------------
  86.   # ○ 最大 CP の取得
  87.   #--------------------------------------------------------------------------
  88.   def max_cp
  89.     return 65535
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ○ CP の取得と設定
  93.   #--------------------------------------------------------------------------
  94.   def cp
  95.     return @cp == nil ? @cp = 0 : @cp
  96.   end
  97.   def cp=(n)
  98.     @cp = [[n.to_i, 0].max, self.max_cp].min
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ○ CP 初期設定
  102.   #--------------------------------------------------------------------------
  103.   def cp_preset
  104.     percent = self.max_cp * XRXS65::CP_PRESET_RATIO * (rand(16) + 16) * self.agi / XRXS_CP_SYSTEM.total_agi / 24
  105.     self.cp = XRXS65::CP_PRESET_FIXNUM + percent
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ○ CP カウントアップ
  109.   #--------------------------------------------------------------------------
  110.   def cp_update
  111.     self.cp += XRXS65::SPEED * 4096 * self.agi / XRXS_CP_SYSTEM.total_agi
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ○ CP 満タン?
  115.   #--------------------------------------------------------------------------
  116.   def cp_full?
  117.     return @cp == self.max_cp
  118.   end
  119. end
  120. class Game_Battler
  121.   include XRXS_CP
  122. end
  123. #==============================================================================
  124. # --- ガード機能 ---
  125. #==============================================================================
  126. class Game_Battler
  127.   #--------------------------------------------------------------------------
  128.   # ○ ガードフラグ
  129.   #--------------------------------------------------------------------------
  130.   def guarding=(n)
  131.     @guarding = n
  132.   end
  133.   #--------------------------------------------------------------------------
  134.   # ● 防御中判定 [再定義]
  135.   #--------------------------------------------------------------------------
  136.   def guarding?
  137.     return @guarding
  138.   end
  139. end
  140. #==============================================================================
  141. # --- アクター「コマンド入力可能判定」:CPがないとコマンドしない ---
  142. #==============================================================================
  143. module XRXS_CP_INPUTABLE
  144.   def inputable?
  145.     return (self.cp_full? and super)
  146.   end
  147. end
  148. class Game_Actor < Game_Battler
  149.   include XRXS_CP_INPUTABLE
  150. end
  151. #==============================================================================
  152. # --- エネミー「行動可能判定」:CPがないとコマンドしない ---
  153. #==============================================================================
  154. module XRXS_CP_MOVABLE
  155.   def movable?
  156.     return (self.cp_full? and super)
  157.   end
  158. end
  159. class Game_Enemy < Game_Battler
  160.   include XRXS_CP_MOVABLE
  161. end
  162. #==============================================================================
  163. # --- 戦闘時 CPカウント ---
  164. #==============================================================================
  165. module XRXS_CP_Battle
  166.   #--------------------------------------------------------------------------
  167.   # ○ パーティ全員の CP を初期設定
  168.   #--------------------------------------------------------------------------
  169.   def cp_preset_party
  170.     for actor in $game_party.actors
  171.       actor.cp_preset
  172.     end
  173.   end
  174.   #--------------------------------------------------------------------------
  175.   # ○ トループ全員の CP を初期設定
  176.   #--------------------------------------------------------------------------
  177.   def cp_preset_troop
  178.     for enemy in $game_troop.enemies
  179.       enemy.cp_preset
  180.     end
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ○ バトラー全員の CP をカウントアップ
  184.   #--------------------------------------------------------------------------
  185.   def cp_update
  186.     for battler in $game_party.actors + $game_troop.enemies
  187.       battler.cp_update
  188.     end
  189.   end
  190. end
  191. class Scene_Battle
  192.   include XRXS_CP_Battle
  193. end
  194. #==============================================================================
  195. # ■ Scene_Battle
  196. #==============================================================================
  197. class Scene_Battle
  198.   #--------------------------------------------------------------------------
  199.   # ● メイン処理
  200.   #--------------------------------------------------------------------------
  201.   alias xrxs65_main main
  202.   def main
  203.     # エクストラスプライトの初期化
  204.     @extra_sprites = [] if @extra_sprites == nil
  205.     # CP の初期化
  206.     cp_preset_party
  207.     # CP メーターの作成
  208.     @cp_meters = CP_Meters.new
  209.     # CP メーターをエクストラスプライトへ登録
  210.     @extra_sprites.push(@cp_meters)
  211.     # 呼び戻す
  212.     xrxs65_main
  213.     # メーターの解放
  214.     @cp_meters.dispose
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ● プレバトルフェーズ開始
  218.   #--------------------------------------------------------------------------
  219.   alias xrxs65_start_phase1 start_phase1
  220.   def start_phase1
  221.     # 呼び戻す
  222.     xrxs65_start_phase1
  223.     # CP の初期化
  224.     cp_preset_troop
  225.     # CP メーターの更新
  226.     @cp_meters.refresh
  227.     # インデックスを計算
  228.     @cp_escape_actor_command_index = @actor_command_window.height/32 - 1
  229.     # アクターコマンドウィンドウに追加
  230.  
  231.   end
  232.   #--------------------------------------------------------------------------
  233.   # ● パーティコマンドフェーズ開始
  234.   #--------------------------------------------------------------------------
  235.   alias xrxs65_start_phase2 start_phase2
  236.   def start_phase2
  237.     # 呼び戻す
  238.     xrxs65_start_phase2
  239.     # パーティコマンドウィンドウを無効化
  240. #去掉的地方    @party_command_window.active  = false
  241. #去掉的地方    @party_command_window.visible = false
  242.     # 強制的にフェイズ 2 を保持
  243.     @phase = 2
  244.     # ただし、既に行動可能者が存在する場合は 3 へ
  245.     start_phase3 if anybody_movable?
  246.   end
  247.   #--------------------------------------------------------------------------
  248.   # ○ CP制での ターンのカウント
  249.   #--------------------------------------------------------------------------
  250.   def cp_turn_count
  251.     $game_temp.battle_turn += 1
  252.     # バトルイベントの全ページを検索
  253.     for index in 0...$data_troops[@troop_id].pages.size
  254.       # このページのスパンが [ターン] の場合
  255.       if $data_troops[@troop_id].pages[index].span == 1
  256.         # 実行済みフラグをクリア
  257.         $game_temp.battle_event_flags[index] = false
  258.       end
  259.     end
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # ● フレーム更新 (パーティコマンドフェーズ)
  263.   #--------------------------------------------------------------------------
  264.   alias xrxs65_update_phase2 update_phase2
  265.   def update_phase2
  266.     # パーティコマンドウィンドウのインデックスを無効化
  267. #去掉    @party_command_window.index = -1
  268.     # 呼び戻す
  269.     xrxs65_update_phase2
  270.     # 例外補正
  271.     @turn_count_time = 1 if @turn_count_time == nil
  272.     # ターンのカウント
  273.     if @turn_count_time > 0
  274.       @turn_count_time -= 1
  275.       if @turn_count_time == 0
  276.         cp_turn_count
  277.         @turn_count_time = XRXS65::CPT if XRXS65::TC == nil
  278.       end
  279.     end
  280.     # CP のフレーム更新
  281.     cp_update
  282.     @cp_meters.refresh
  283.     # フル CP のバトラーが存在する場合、ターン開始
  284.     start_phase3 if anybody_movable?
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ○ フル CP バトラーが存在するか?
  288.   #--------------------------------------------------------------------------
  289.   def anybody_movable?
  290.     for battler in $game_party.actors + $game_troop.enemies
  291.       return true if battler.cp_full?
  292.     end
  293.     return false
  294.   end
  295.   #--------------------------------------------------------------------------
  296.   # ● アクターコマンドウィンドウのセットアップ
  297.   #--------------------------------------------------------------------------
  298.   alias xrxs65_phase3_setup_command_window phase3_setup_command_window
  299.   def phase3_setup_command_window
  300.     # 効果音の再生
  301.     Audio.se_play(XRXS65::COMMAND_UP_SE) rescue nil
  302.     # 呼び戻す
  303.     xrxs65_phase3_setup_command_window
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド)
  307.   #--------------------------------------------------------------------------
  308.  
  309.   #--------------------------------------------------------------------------
  310.   # ● メインフェーズ開始
  311.   #--------------------------------------------------------------------------
  312.   alias xrxs65_start_phase4 start_phase4
  313.   def start_phase4
  314.     # ターン数を引くことによって擬似的にカウントに変化を起こさせない
  315.     $game_temp.battle_turn -= 1
  316.     # フラグを退避
  317.     save_flags = $game_temp.battle_event_flags.dup
  318.     # 呼び戻す
  319.     xrxs65_start_phase4
  320.     # フラグを復旧
  321.     $game_temp.battle_event_flags = save_flags
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # ● 行動順序作成
  325.   #--------------------------------------------------------------------------
  326.   alias xrxs65_make_action_orders make_action_orders
  327.   def make_action_orders
  328.     # 呼び戻す
  329.     xrxs65_make_action_orders
  330.     # CPが不足している場合は @action_battlers から除外する
  331.     for battler in @action_battlers.dup
  332.       @action_battlers.delete(battler) unless battler.cp_full?
  333.     end
  334.   end
  335.   #--------------------------------------------------------------------------
  336.   # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  337.   #--------------------------------------------------------------------------
  338.   alias xrxs65_update_phase4_step2 update_phase4_step2
  339.   def update_phase4_step2
  340.     # ガードの解除
  341.     @active_battler.guarding = false
  342.     # CPの消費
  343.     @active_battler.cp = 0
  344.     # CP メーターの更新
  345.     @cp_meters.refresh
  346.     # 呼び戻す
  347.     xrxs65_update_phase4_step2
  348.     # 例外補正
  349.     return if @active_battler == nil
  350.     # ターンコントローラ
  351.     if @active_battler.is_a?(Game_Enemy) and @active_battler.index == XRXS65::TC
  352.       cp_turn_count
  353.     end
  354.   end
  355.   #--------------------------------------------------------------------------
  356.   # ● 基本アクション 結果作成
  357.   #--------------------------------------------------------------------------
  358.   alias xrxs65_make_basic_action_result make_basic_action_result
  359.   def make_basic_action_result
  360.     # 呼び戻す
  361.     xrxs65_make_basic_action_result
  362.     # 防御の場合
  363.     if @active_battler.current_action.basic == 1
  364.       @active_battler.guarding = true
  365.       return
  366.     end
  367.     # パーティの逃亡の場合
  368.     if @active_battler.current_action.basic == 4
  369.       # 逃走可能ではない場合
  370.       if $game_temp.battle_can_escape == false
  371.         # ブザー SE を演奏
  372.         $game_system.se_play($data_system.buzzer_se)
  373.         return
  374.       end
  375.  
  376.       # パーティ全員の CP をクリア
  377.       for actor in $game_party.actors
  378.         actor.cp = 0
  379.       end
  380.       # CP メーターの更新
  381.       @cp_meters.refresh
  382.       # 逃走処理
  383.       update_phase2_escape
  384.       return
  385.     end
  386.   end
  387.   #--------------------------------------------------------------------------
  388.   # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  389.   #--------------------------------------------------------------------------
  390.   alias xrxs65_update_phase4_step5 update_phase4_step5
  391.   def update_phase4_step5
  392.     # 呼び戻す
  393.     xrxs65_update_phase4_step5
  394.     # CP メーターの更新
  395.     @cp_meters.refresh
  396.   end
  397. end
  398. #==============================================================================
  399. # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ ---
  400. #==============================================================================
  401. class CP_Meters
  402.   #--------------------------------------------------------------------------
  403.   # ○ オブジェクト初期化
  404.   #--------------------------------------------------------------------------
  405.   def initialize
  406.     # メーター群の生成
  407.     @meters = []
  408.     for i in 0...$game_party.actors.size
  409.       make_meter(i)
  410.     end
  411.     refresh
  412.   end
  413.   #--------------------------------------------------------------------------
  414.   # ○ リフレッシュ
  415.   #--------------------------------------------------------------------------
  416.   def refresh
  417.     # 戦闘メンバー数の変更を判別
  418.     for i in @meters.size...$game_party.actors.size
  419.       make_meter(i)
  420.     end
  421.     for i in $[email]game_party.actors.size...@meters.size[/email]
  422.       @meters[i].dispose
  423.       @meters[i] = nil
  424.     end
  425.     @meters.compact!
  426.     # 表示更新
  427.     for i in 0...$game_party.actors.size
  428.       actor = $game_party.actors[i]
  429.       @meters[i].line   = actor.cp_linetype
  430.       @meters[i].amount = actor.cp_lineamount
  431.     end
  432.   end
  433.   #--------------------------------------------------------------------------
  434.   # ○ メーターひとつの生成
  435.   #--------------------------------------------------------------------------
  436.   def make_meter(i)
  437.     # スキンの取得
  438.     skin = RPG::Cache.windowskin(XRXS65::SKIN)
  439.     #
  440.     space = 640 / XRXS65::MAX
  441.     case XRXS65::ALIGN
  442.     when 0
  443.       actor_x = i * space + 4
  444.     when 1
  445.       actor_x = (space * ((XRXS65::MAX - $game_party.actors.size)/2.0 + i)).floor
  446.     when 2
  447.       actor_x = (i + XRXS65::MAX - $game_party.actors.size) * space + 4
  448.     end
  449.     meter = MeterSprite.new(skin, XRXS65::LINE_HEIGHT)
  450.     meter.x = actor_x + XRXS65::X_OFFSET - skin.width
  451.     meter.y = XRXS65::Y_OFFSET
  452.     @meters[i] = meter
  453.   end
  454.   #--------------------------------------------------------------------------
  455.   # ○ 可視状態
  456.   #--------------------------------------------------------------------------
  457.   def visible=(b)
  458.     @meters.each{|sprite| sprite.visible = b }
  459.   end
  460.   #--------------------------------------------------------------------------
  461.   # ○ 解放
  462.   #--------------------------------------------------------------------------
  463.   def dispose
  464.     @meters.each{|sprite| sprite.dispose }
  465.   end
  466. end
  467. #==============================================================================
  468. # --- XRXS. レクタンギュラーメーター表示・極 ---
  469. #==============================================================================
  470. class MeterSprite < Sprite
  471.   #--------------------------------------------------------------------------
  472.   # ○ オブジェクト初期化
  473.   #--------------------------------------------------------------------------
  474.   def initialize(skin, line_height)
  475.     [url=home.php?mod=space&uid=81523]@skin[/url]   = skin
  476.     @width  = @skin.width
  477.     [url=home.php?mod=space&uid=291977]@height[/url] = line_height
  478.     [url=home.php?mod=space&uid=401263]@line[/url]   = 1
  479.     @amount = 0
  480.     @base_sprite = Sprite.new
  481.     @base_sprite.bitmap = @skin
  482.     @base_sprite.src_rect.set(0, 0, @width, @height)
  483.     @base_sprite.z = 601
  484.     super()
  485.     self.z = @base_sprite.z + 1
  486.     self.bitmap = @skin
  487.     self.line = 1
  488.   end
  489.   #--------------------------------------------------------------------------
  490.   # ○ 値の設定
  491.   #--------------------------------------------------------------------------
  492.   def line=(n)
  493.     @line = n
  494.     refresh
  495.   end
  496.   def amount=(n)
  497.     @amount = n
  498.     refresh
  499.   end
  500.   def refresh
  501.     self.src_rect.set(0, @line * @height, @width * @amount / 100, @height)
  502.   end
  503.   #--------------------------------------------------------------------------
  504.   # ○ 座標の設定
  505.   #--------------------------------------------------------------------------
  506.   def x=(n)
  507.     super
  508.     @base_sprite.x = n
  509.   end
  510.   def y=(n)
  511.     super
  512.     @base_sprite.y = n
  513.   end
  514.   #--------------------------------------------------------------------------
  515.   # ○ 解放
  516.   #--------------------------------------------------------------------------
  517.   def dispose
  518.     @base_sprite.dispose
  519.     super
  520.   end
  521. end



怎么更改cp条的位置和大小。。还有怎么改成竖着的呢。
新人求教啊。
作者: 白鬼    时间: 2014-7-17 19:26
我没有看完全
但是脚本中有这一段
  1.   SKIN        = "Line"  # スキンファイル名(Graphics/Windowskinsフォルダ)  
  2. LINE_HEIGHT =  6        # スキンの"一行"の縦幅[単位:ピクセル]  
  3. #  
  4. # 表示位置セッティング  
  5. #  
  6. X_OFFSET = 164    # 横位置  
  7. Y_OFFSET = 464    # 縦位置
复制代码
先解释:
X_OFFSET = 164    # 横位置  
Y_OFFSET = 464    # 縦位置
就是这个CP轴的起点位置

SKIN        = "Line"  
是这个CP轴的素材
你可以先从修改开始一点一点来

首先把这个 SKIN        = "Line"   替换成一个竖条的
然后慢慢调整X_OFFSET= 、Y_OFFSET = ,调整到你觉得满意的位置上

然后看看效果

如果我没有记错,这个CP脚本会自动识别CP条的长度
但是CP条的横纵是否自动识别,我不太清楚
你先试一下,如果只是轴过去了,CP图标还是横着走
咱们再说
作者: 1192939463    时间: 2014-7-18 08:49
白鬼 发表于 2014-7-17 19:26
我没有看完全
但是脚本中有这一段先解释:
X_OFFSET = 164    # 横位置  

嗯,谢谢。我先试试。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1