#超级横版战斗 module RPG class Class def name name = @name.split(/,/)[0] return name != nil ? name : '' end def name2 name = @name.split(/,/)[1] return name != nil ? name : '' end end class Weapon def name name = @name.split(/,/)[0] return name != nil ? name : '' end def name2 name = @name.split(/,/)[1] return name != nil ? name : '' end end end class Game_Actor #-------------------------------------------------------------------------- # ● 更改名称 # name : 新的名称 #-------------------------------------------------------------------------- def picturephase name = $data_classes[class_id].name2 return name != nil ? name : "66RPG" end end class Game_Enemy #-------------------------------------------------------------------------- # ● 获取名称 #-------------------------------------------------------------------------- def name name = $data_enemies[@enemy_id].name.split(/,/)[0] return name != nil ? name : '' end def picturephase name = $data_enemies[@enemy_id].name.split(/,/)[1] return name != nil ? name : "66RPG" end end class Animated_Sprite < RPG::Sprite #-------------------------------------------------------------------------- # - Accessible instance variables. #-------------------------------------------------------------------------- attr_accessor :frames # Number of animation frames attr_accessor :delay # Delay time between frames (speed) attr_accessor :frame_width # Width of each frame attr_accessor :frame_height # Height of each frame attr_accessor :offset_x # X coordinate of the 1st frame attr_accessor :offset_y # Y coordinate of all frames attr_accessor :current_frame # Current animation frame attr_accessor :moving # Is the sprite moving? def initialize(viewport = nil) super(viewport) @frame_width, @frame_height = 0, 0 change # A basic change to set initial variables @old = Graphics.frame_count # For the delay method @goingup = true # Increasing animation? (if @rm2k_mode is true) @once = false # Is the animation only played once? @animated = true # Used to stop animation when @once is true end def change(frames = 0, delay = 0, offx = 0, offy = 0, startf = 0, once = false) @frames = frames @delay = delay @offset_x, @offset_y = offx, offy @current_frame = startf @once = once x = @current_frame * @frame_width + @offset_x self.src_rect = Rect.new(x, @offset_y, @frame_width, @frame_height) @goingup = true @animated = true end def update super if self.bitmap != nil and delay(@delay) and @animated x = @current_frame * @frame_width + @offset_x self.src_rect = Rect.new(x, @offset_y, @frame_width, @frame_height) @current_frame = (@current_frame + 1) unless @frames == 0 @animated = false if @current_frame == @frames and @once @current_frame %= @frames end end def move(x, y, speed = 1, delay = 0) @destx = x @desty = y @move_speed = speed @move_delay = delay @move_old = Graphics.frame_count @moving = true end #-------------------------------------------------------------------------- # - Move sprite to destx and desty #-------------------------------------------------------------------------- def update_move return unless @moving movinc = @move_speed == 0 ? 1 : @move_speed if Graphics.frame_count - @move_old > @move_delay or @move_speed != 0 self.x += movinc if self.x < @destx self.x -= movinc if self.x > @destx self.y += movinc if self.y < @desty self.y -= movinc if self.y > @desty self.z = self.y @move_old = Graphics.frame_count end if @move_speed > 1 # Check if sprite can't reach that point self.x = @destx if (@destx - self.x).abs % @move_speed != 0 and (@destx - self.x).abs <= @move_speed self.y = @desty if (@desty - self.y).abs % @move_speed != 0 and (@desty - self.y).abs <= @move_speed end if self.x == @destx and self.y == @desty @moving = false end end def delay(frames) update_move if (Graphics.frame_count - @old >= frames) @old = Graphics.frame_count return true end return false end end class Game_Actor < Game_Battler def screen_x # 返回计算后的队伍 X 坐标的排列顺序 case self.index when 0 return 300 when 1 return 395 when 2 return 490 when 3 return 580 else return 1000 end end def screen_y case self.index when 0 return 380 when 1 return 340 when 2 return 300 when 3 return 250 else return 1000 end end def screen_z # 返回计算后的队伍 Z 坐标的排列顺序 if self.index != nil return 104 - self.index else return 0 end end end # RPG's snipplet... class Spriteset_Battle attr_accessor :actor_sprites attr_accessor :enemy_sprites alias original_initialize initialize def initialize #@start_party_number = $game_party.actors.size # ビューポートを作成 @viewport0 = Viewport.new(0, 0, 640, 480) @viewport1 = Viewport.new(0, 0, 640, 480) @viewport2 = Viewport.new(0, 0, 640, 480) @viewport3 = Viewport.new(0, 0, 640, 480) @viewport4 = Viewport.new(0, 0, 640, 480) @viewport1.z = 50 @viewport2.z = 50 @viewport3.z = 200 @viewport4.z = 5000 @battleback_sprite = Sprite.new(@viewport0) @enemy_sprites = [] for enemy in $game_troop.enemies #.reverse @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy)) end @actor_sprites = [] @actor_sprites.push(Sprite_Battler.new(@viewport2,$game_party.actors[0])) @actor_sprites.push(Sprite_Battler.new(@viewport2,$game_party.actors[1])) @actor_sprites.push(Sprite_Battler.new(@viewport2,$game_party.actors[2])) @actor_sprites.push(Sprite_Battler.new(@viewport2,$game_party.actors[3])) @weather = RPG::Weather.new(@viewport1) @picture_sprites = [] for i in 51..100 @picture_sprites.push(Sprite_Picture.new(@viewport3, $game_screen.pictures[i])) end @timer_sprite = Sprite_Timer.new update end alias original_update update def update @viewport1.z = 50 and @viewport2.z = 51 #if $actor_on_top == true # @viewport1.z = 51 and @viewport2.z = 50 if $actor_on_top == false # 刷新角色的活动块 (对应角色的替换) @actor_sprites[0].battler = $game_party.actors[0] @actor_sprites[1].battler = $game_party.actors[1] @actor_sprites[2].battler = $game_party.actors[2] @actor_sprites[3].battler = $game_party.actors[3] # 战斗背景的文件名与现在情况有差异的情况下 if @battleback_name != $game_temp.battleback_name @battleback_name = $game_temp.battleback_name if @battleback_sprite.bitmap != nil @battleback_sprite.bitmap.dispose end @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name) @battleback_sprite.src_rect.set(0, 0, 640, 480) end # 刷新战斗者的活动块 for sprite in @enemy_sprites + @actor_sprites sprite.update end # 刷新天气图形 @weather.type = $game_screen.weather_type @weather.max = $game_screen.weather_max @weather.update # 刷新图片活动块 for sprite in @picture_sprites sprite.update end # 刷新计时器活动块 @timer_sprite.update # 设置画面的色调与震动位置 @viewport1.tone = $game_screen.tone @viewport1.ox = $game_screen.shake # 设置画面的闪烁色 @viewport4.color = $game_screen.flash_color # 刷新显示端口 @viewport1.update @viewport2.update @viewport4.update end end class Sprite_Battler < Animated_Sprite attr_accessor :battler attr_reader :index attr_accessor :target_index attr_accessor :frame_width def initialize(viewport, battler = nil) super(viewport) @battler = battler @pattern_b = 0 # @counter_b = 0 # @index = 0 # if @battler != nil tempbitmap = RPG::Cache.battler(@battler.battler_name, @battler.battler_hue) @frame_width = tempbitmap.width/4 picturephase = @battler.picturephase @frame_height = tempbitmap.height/8 else @frame_width, @frame_height = 1,1 end # start sprite @battler.is_a?(Game_Enemy) ? enemy_pose(1) : pose(1) @battler_visible = false if $target_index == nil $target_index = 0 end end def index=(index) # @index = index # update # end # def dispose if self.bitmap != nil self.bitmap.dispose end super end def enemy # $target_index += $game_troop.enemies.size $target_index %= $game_troop.enemies.size return $game_troop.enemies[$target_index] # end # def actor # $target_index += $game_party.actors.size $target_index %= $game_party.actors.size return $game_party.actors[$target_index] # end def pose(number, frames = 4) case number when 0 # run change(frames, 5, 0, 0, 0) when 1 # standby change(frames, 5, 0, @frame_height) when 2 # defend change(frames, 5, 0, @frame_height * 2) when 3 # Hurt, loops change(frames, 5, 0, @frame_height * 3) when 4 # attack no loop change(frames, 5, 0, @frame_height * 4, 0, true) when 5 # skill change(frames, 5, 0, @frame_height * 5) when 6 # death change(frames, 5, 0, @frame_height * 6) when 7 # winning pose change(frames, 5, 0, @frame_height * 7) when 8 # no sprite change(frames, 5, 0, @frame_height * 8) when 9 # no sprite change(frames, 5, 0, @frame_height * 9) when 10 # no sprite change(frames, 5, 0, @frame_height * 10) when 11 # no sprite change(frames, 5, 0, @frame_height * 11) when 12 # no sprite change(frames, 5, 0, @frame_height * 12) when 13 # no sprite change(frames, 5, 0, @frame_height * 13) when 14 # no sprite change(frames, 5, 0, @frame_height * 14) when 15 # no sprite change(frames, 5, 0, @frame_height * 15) when 16 # no sprite change(frames, 5, 0, @frame_height * 16) when 17 # no sprite change(frames, 5, 0, @frame_height * 17) when 18 # no sprite change(frames, 5, 0, @frame_height * 18) when 19 # no sprite change(frames, 5, 0, @frame_height * 19) when 20 # no sprite change(frames, 5, 0, @frame_height * 20) # ...etc. else change(frames, 5, 0, @frame_height * number, 0) end end #-------------------------------------------------------------------------- # - Change the battle pose for an enemy # number : pose' number #-------------------------------------------------------------------------- def enemy_pose(number ,enemy_frames = 4) case number when 0 # 前进 change(enemy_frames, 5, 0, 0, 0) when 1 # 等待 change(enemy_frames, 5, 0, @frame_height) when 2 # 防御 change(enemy_frames, 5, 0, @frame_height * 2) when 3 # 挨打 change(enemy_frames, 5, 0, @frame_height * 3) when 4 # 物理攻击 change(enemy_frames, 5, 0, @frame_height * 4, 0, true) when 5 # 法术 change(enemy_frames, 5, 0, @frame_height * 5) when 6 # 死亡 change(enemy_frames, 5, 0, @frame_height * 6) when 7 # 胜利待机 change(enemy_frames, 5, 0, @frame_height * 7) # ...etc. else change(enemy_frames, 5, 0, @frame_height * number, 0) end end #============================================================================== # sniplet end... #============================================================================== def update super if @battler == nil self.bitmap = nil loop_animation(nil) return end if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue @battler_name = @battler.battler_name @battler_hue = @battler.battler_hue self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue) @width = bitmap.width @height = bitmap.height self.ox = @frame_width / 2 self.oy = @frame_height if @battler.dead? or @battler.hidden self.opacity = 0 end self.x = @battler.screen_x self.y = @battler.screen_y self.z = @battler.screen_z end if @battler.damage == nil and @battler.state_animation_id != @state_animation_id @state_animation_id = @battler.state_animation_id loop_animation($data_animations[@state_animation_id]) end if @battler.is_a?(Game_Actor) and @battler_visible if $game_temp.battle_main_phase self.opacity += 3 if self.opacity < 255 else self.opacity -= 3 if self.opacity > 207 end end if battler.state?(51) self.opacity = 100 end if @battler.blink blink_on else blink_off end unless @battler_visible if not @battler.hidden and not @battler.dead? and (@battler.damage == nil or @battler.damage_pop) appear @battler_visible = true end if not @battler.hidden and (@battler.damage == nil or @battler.damage_pop) and @battler.is_a?(Game_Actor) appear @battler_visible = true end end if @battler_visible if @battler.hidden $game_system.se_play($data_system.escape_se) escape @battler_visible = false end if @battler.white_flash whiten @battler.white_flash = false end if @battler.animation_id != 0 animation = $data_animations[@battler.animation_id] animation(animation, @battler.animation_hit) @battler.animation_id = 0 end if @battler.damage_pop damage(@battler.damage, @battler.critical) @battler.damage = nil @battler.critical = false @battler.damage_pop = false end if @battler.damage == nil and @battler.dead? if @battler.is_a?(Game_Enemy) $game_system.se_play($data_system.enemy_collapse_se) collapse @battler_visible = false #定义的角色死亡音效 else case @battler.id when 1 Audio.se_play("Audio/SE/"+"X-01-女-死亡",90,100) unless @dead when 2 Audio.se_play("Audio/SE/"+"Y-01-男-死亡",90,100) unless @dead when 3 Audio.se_play("Audio/SE/"+"X-02-女-死亡",90,100) unless @dead when 4 Audio.se_play("Audio/SE/"+"Y-02-男-死亡",90,100) unless @dead when 5 Audio.se_play("Audio/SE/"+"X-03-女-死亡",90,100) unless @dead when 6 Audio.se_play("Audio/SE/"+"Y-03-男-死亡",90,100) unless @dead when 7 Audio.se_play("Audio/SE/"+"7",90,100) unless @dead when 8 Audio.se_play("Audio/SE/"+"8",90,100) unless @dead when 9 Audio.se_play("Audio/SE/"+"9",90,100) unless @dead end @dead = true pose(6) end else @dead = false end end # end end #============================================================================== # Scene_Battle Costum Battle System #============================================================================== class Scene_Battle def update_phase4 case @phase4_step when 1 update_phase4_step1 when 2 update_phase4_step2 when 3 update_phase4_step3 when 4 update_phase4_step4 when 5 update_phase4_step5 when 6 update_phase4_step6 when 7 update_phase4_step7 when 8 update_phase4_step8 end end def make_basic_action_result if @active_battler.is_a?(Game_Actor) $actor_on_top = true elsif @active_battler.is_a?(Game_Enemy) $actor_on_top = false end if @active_battler.current_action.basic == 0 if @active_battler.is_a?(Game_Actor) if $data_weapons[@active_battler.weapon_id] == nil @weapon_sprite = 4 else @weapon_sprite = 4 end else @weapon_sprite_enemy = 4 end @animation1_id = @active_battler.animation1_id @animation2_id = @active_battler.animation2_id if @active_battler.is_a?(Game_Enemy) if @active_battler.restriction == 3 target = $game_troop.random_target_enemy elsif @active_battler.restriction == 2 target = $game_party.random_target_actor else index = @active_battler.current_action.target_index target = $game_party.smooth_target_actor(index) end x = target.screen_x - RPG::Cache.battler(@active_battler.battler_name, @active_battler.battler_hue).width/6 @spriteset.enemy_sprites[@active_battler.index].enemy_pose(0) @spriteset.enemy_sprites[@active_battler.index].move(x, target.screen_y, 10) end if @active_battler.is_a?(Game_Actor) if @active_battler.restriction == 3 target = $game_party.random_target_actor elsif @active_battler.restriction == 2 target = $game_troop.random_target_enemy else index = @active_battler.current_action.target_index target = $game_troop.smooth_target_enemy(index) end x = target.screen_x + RPG::Cache.battler(@active_battler.battler_name, @active_battler.battler_hue).width/8 @spriteset.actor_sprites[@active_battler.index].pose(0) @spriteset.actor_sprites[@active_battler.index].move(x, target.screen_y, 10) end @target_battlers = [target] for target in @target_battlers target.attack_effect(@active_battler) end return end if @active_battler.current_action.basic == 1 if @active_battler.is_a?(Game_Actor) @spriteset.actor_sprites[@active_battler.index].pose(2) #defence else @spriteset.enemy_sprites[@active_battler.index].enemy_pose(2) #defence end @help_window.set_text($data_system.words.guard, 1) return end if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2 @help_window.set_text("逃走", 1) @active_battler.escape return end if @active_battler.current_action.basic == 3 $game_temp.forcing_battler = nil @phase4_step = 1 return end if @active_battler.current_action.basic == 4 if $game_temp.battle_can_escape == false $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) update_phase2_escape return end end #-------------------------------------------------------------------------- # skill aktion... #-------------------------------------------------------------------------- def make_skill_action_result @skill = $data_skills[@active_battler.current_action.skill_id] unless @active_battler.current_action.forcing unless @active_battler.skill_can_use?(@skill.id) $game_temp.forcing_battler = nil @phase4_step = 1 return end end @active_battler.sp -= @skill.sp_cost @status_window.refresh @help_window.set_text(@skill.name, 1) if @active_battler.is_a?(Game_Actor) if @skill.name != "one of the skills" # <--skill doesn't exist => all the skills have the skill animation! @spriteset.actor_sprites[@active_battler.index].pose(5) # <-- sprite number end else if @skill.name != "one of the skills" # <-- first skill name @spriteset.enemy_sprites[@active_battler.index].enemy_pose(5) # <-- sprite number end end #============================================================================= # SKILL SPRITES END #============================================================================= @animation1_id = @skill.animation1_id @animation2_id = @skill.animation2_id @common_event_id = @skill.common_event_id set_target_battlers(@skill.scope) for target in @target_battlers target.skill_effect(@active_battler, @skill) end end #-------------------------------------------------------------------------- # how here we make the item use aktions #-------------------------------------------------------------------------- def make_item_action_result if @active_battler.is_a?(Game_Actor) @spriteset.actor_sprites[@active_battler.index].pose(1) else @spriteset.enemy_sprites[@active_battler.index].enemy_pose(1) end @item = $data_items[@active_battler.current_action.item_id] unless $game_party.item_can_use?(@item.id) @phase4_step = 1 return end if @item.consumable $game_party.lose_item(@item.id, 1) end @help_window.set_text(@item.name, 1) @animation1_id = @item.animation1_id @animation2_id = @item.animation2_id @common_event_id = @item.common_event_id index = @active_battler.current_action.target_index target = $game_party.smooth_target_actor(index) set_target_battlers(@item.scope) for target in @target_battlers target.item_effect(@item) end end #------------------战斗结束结果窗口------------------------------------ def start_phase5 @phase = 5 $game_system.me_play($game_system.battle_end_me) $game_system.bgm_play($game_temp.map_bgm) exp = 0 gold = 0 treasures = [] for enemy in $game_troop.enemies unless enemy.hidden exp += enemy.exp gold += enemy.gold if rand(100) < enemy.treasure_prob if enemy.item_id > 0 treasures.push($data_items[enemy.item_id]) end if enemy.weapon_id > 0 treasures.push($data_weapons[enemy.weapon_id]) end if enemy.armor_id > 0 treasures.push($data_armors[enemy.armor_id]) end end end end treasures = treasures[0..5] for i in 0...$game_party.actors.size actor = $game_party.actors[i] @spriteset.actor_sprites[i].pose(7) unless actor.dead? # {=====} if actor.cant_get_exp? == false last_level = actor.level actor.exp += exp if actor.level > last_level @status_window.level_up(i) end end end $game_party.gain_gold(gold) for item in treasures case item when RPG::Item $game_party.gain_item(item.id, 1) when RPG::Weapon $game_party.gain_weapon(item.id, 1) when RPG::Armor $game_party.gain_armor(item.id, 1) end end @result_window = Window_BattleResult.new(exp, gold, treasures) @phase5_wait_count = 10 #该数影响返回地图的等待时间 end def update_phase4_step3 if @active_battler.current_action.kind == 0 and @active_battler.current_action.basic == 0 # in this one... we have our weapon animations... for player and monster if @active_battler.is_a?(Game_Actor) @spriteset.actor_sprites[@active_battler.index].pose(@weapon_sprite) elsif @active_battler.is_a?(Game_Enemy) @spriteset.enemy_sprites[@active_battler.index].enemy_pose(@weapon_sprite_enemy) end end if @animation1_id == 0 @active_battler.white_flash = true else @active_battler.animation_id = @animation1_id @active_battler.animation_hit = true end @phase4_step = 4 end def update_phase4_step4 # this here is for the hit animation... for target in @target_battlers if target.is_a?(Game_Actor) and !@active_battler.is_a?(Game_Actor) if target.guarding? @spriteset.actor_sprites[target.index].pose(2) else @spriteset.actor_sprites[target.index].pose(3) end elsif target.is_a?(Game_Enemy) and !@active_battler.is_a?(Game_Enemy) if target.guarding? @spriteset.enemy_sprites[target.index].enemy_pose(2) else @spriteset.enemy_sprites[target.index].enemy_pose(3) end end target.animation_id = @animation2_id target.animation_hit = (target.damage != "Miss") end @wait_count = 8 @phase4_step = 5 end def update_phase4_step5 if @active_battler.hp > 0 and @active_battler.slip_damage? @active_battler.slip_damage_effect @active_battler.damage_pop = true end @help_window.visible = false @status_window.refresh # here comes the guard animations.... if @active_battler.is_a?(Game_Actor) @spriteset.actor_sprites[@active_battler.index].pose(1) else @spriteset.enemy_sprites[@active_battler.index].enemy_pose(1) end for target in @target_battlers if target.damage != nil target.damage_pop = true if @active_battler.is_a?(Game_Actor) @spriteset.actor_sprites[@active_battler.index].pose(1) else @spriteset.enemy_sprites[@active_battler.index].enemy_pose(1) end end end @phase4_step = 6 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- def update_phase4_step6 if @active_battler.is_a?(Game_Actor) and !@active_battler.dead? @spriteset.actor_sprites[@active_battler.index].move(@active_battler.screen_x, @active_battler.screen_y, 20) @spriteset.actor_sprites[@active_battler.index].pose(1) elsif !@active_battler.dead? @spriteset.enemy_sprites[@active_battler.index].move(@active_battler.screen_x, @active_battler.screen_y, 20) @spriteset.enemy_sprites[@active_battler.index].enemy_pose(1) end for target in @target_battlers if target.is_a?(Game_Actor) and !target.dead? @spriteset.actor_sprites[target.index].pose(1) elsif !target.dead? @spriteset.enemy_sprites[target.index].enemy_pose(1) end end $game_temp.forcing_battler = nil if @common_event_id > 0 common_event = $data_common_events[@common_event_id] $game_system.battle_interpreter.setup(common_event.list, 0) end @phase4_step = 7 end def update_phase4_step7 if @active_battler.is_a?(Game_Actor) and !@active_battler.dead? @spriteset.actor_sprites[@active_battler.index].pose(1) elsif !@active_battler.dead? @spriteset.enemy_sprites[@active_battler.index].enemy_pose(1) end $game_temp.forcing_battler = nil if @common_event_id > 0 common_event = $data_common_events[@common_event_id] $game_system.battle_interpreter.setup(common_event.list, 0) end @phase4_step = 1 end def update if $game_system.battle_interpreter.running? $game_system.battle_interpreter.update if $game_temp.forcing_battler == nil unless $game_system.battle_interpreter.running? unless judge setup_battle_event end end if @phase != 5 @status_window.refresh end end end $game_system.update $game_screen.update if $game_system.timer_working and $game_system.timer == 0 $game_temp.battle_abort = true end @help_window.update @party_command_window.update @actor_command_window.update @status_window.update @message_window.update @spriteset.update if $game_temp.transition_processing $game_temp.transition_processing = false if $game_temp.transition_name == "" Graphics.transition(20) else Graphics.transition(40, "Graphics/Transitions/" + $game_temp.transition_name) end end if $game_temp.message_window_showing return end if @spriteset.effect? return end if $game_temp.gameover $scene = Scene_Gameover.new return end if $game_temp.to_title $scene = Scene_Title.new return end if $game_temp.battle_abort $game_system.bgm_play($game_temp.map_bgm) battle_end(1) return end if @wait_count > 0 @wait_count -= 1 return end for actor in @spriteset.actor_sprites if actor.moving return end end for enemy in @spriteset.enemy_sprites if enemy.moving# and $game_system.animated_enemy return end end if $game_temp.forcing_battler == nil and $game_system.battle_interpreter.running? return end case @phase when 1 update_phase1 when 2 update_phase2 when 3 update_phase3 when 4 update_phase4 when 5 update_phase5 end end end
飞剑侠.png (195.3 KB, 下载次数: 15)
原本的4帧
60_副本55.png (295.82 KB, 下载次数: 17)
改成这种8帧
夜狠简单 发表于 2016-4-24 12:53
target.animation_id = @animation2_id
target.animation_hit = (target.damage != "Miss")
end ...
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |