XP 스크립트



사이드뷰 방식의 스크립트입니다.
이 스크립트는 창도나 RPGXP 포럼에서 한번 정도는 보셨을 겁니다.
저도 이 스크립트를 어디서 가져왔는지 생각이 나지 않습니다. ㅡㅡ;;
제가 올린 스크린샷으로 어떻게 생긴 것인지 확인하실 수 있습니다.

이 스크립트는 원본 번역판입니다.
제가 사용할 시 오류가 발생했는데 이 부분에 대한 수정은 아래 설명을
읽어보시길 바랍니다.
그냥 번역판 그대로 사용하셔도 아무런 이상이 없는 분들은 그냥 사용해도
무방합니다..

--------------------------------------------------------------------------
원본 번역판입니다.
*주의사항*
만일 258번 줄에서 오류가 나신 분들은
if @battler_white_flash로 바꿔주시길 바랍니다.
원본 번역판으로 아무런 이상없이 진행이 가능하다면 번역판을 그대로 이용하시고
258번줄 이외의 오류에 대해서 물어보신다면 대답해드릴 수 없음을 알려드립니다.ㅡㅡ;;;

다음 아래부터 복사하시길 바랍니다.
-------------------------------------------------------------------------
=begin
사이드뷰 스크립트
■개요
RPG 트크르 XP의 디폴트 전투를, 보행 그래픽을 이용해
사이드 뷰로 변경합니다.
■사양
·이하의 클래스를 변경, 추가하고 있습니다.벌써 다른 기능을 위해서
고쳐 쓰고 있는 경우, 간섭해 에러가 될 가능성이 있습니다.
·Game_Actor
·Sprite_Actor (추가)
·Spriteset_Battle
·Scene_Battle (스크립트 에디터내 Scene_Battle 4에 상당)
·「제자리 걸음」을 이용한 루프 애니메이션
·대기 상태, 데미지시 , 핀치, 전투 불능의 그래픽 변경
·표시에 사용하는 그래픽의 종류를, 이론상 무한하게 늘릴 수 있습니다.
■사용 방법
스크립트 에디터, main 위에 모두 코피페 해 주세요.
또, 전투에 참가하는 모든 액터에 대해서,
"(캐릭터 파일명) _b1"라고 하는 보행 그래픽을
Graphics/Characters에 임포트 해 주세요.각각,
1단째(보행 그래픽:하향)에 대기 상태
둘째 단( 동:좌향) 시
삼단메( 동:오른쪽 방향)에 핀치(HP가1/4이하, 혹은 배드 스테이트시)
4단째( 동:하향)에 전투 불능 상태
하지만 대응하고 있습니다.
새롭고"배드 스테이트"라고 하는 속성을 만들어, 배드 스테이트에는
그 속성을 주세요.
■그 외
개변, 사용, 전재는 자유롭게 아무쪼록.(RGSS판의 룰에 따릅니다.)
개인적으로는, 개변한 것은 공개해 모두에게 환원하며 가 주었으면 한다
(GPL같이)(이)라고는 생각합니다만.
RGSS판:http://jbbs.shitaraba.com/game/14836/
※■한층 더 덧붙여 씀
 「###」의 코멘트 부분에서 표기되고 있는 부분은,
 전 버젼의 작자와는 다른 인간이 프로그램을 추가하고 있습니다만,
 운용에 관한 폴리시에 관해서는 상기 사항과 같습니다.
 "(캐릭터 파일명) _b2"라고 하는 보행 그래픽을
Graphics/Characters에 임포트 하면,
1단째(보행 그래픽:하향)에 통상 공격시
둘째 단( 동:좌향)에 방어중
삼단메( 동:오른쪽 방향)에 스킬 사용시
4단째( 동:하향)에 아이템 사용시
그렇다고 하는 모션을 할 수 있는 것처럼 됩니다.
=end

# Game_Actor 클래스를 재정의한다.
class Game_Actor < Game_Battler
# 아크세사의 설정
attr_accessor :pattern # 패턴
attr_accessor :direction # 방향
attr_accessor :anime_count # 애니메이션 카운트
attr_accessor :move_speed # 속도
attr_accessor :damaged # 공격 대상인지 어떤지
#initialize 의 재정의
def initialize(actor_id)
super()
@damaged = false
setup(actor_id)
end
# 셋업을 재정의
def setup(actor_id)
actor = $data_actors[actor_id]
@actor_id = actor_id
@name = actor.name
@character_name = actor.character_name
@character_hue = actor.character_hue
@class_id = actor.class_id
@weapon_id = actor.weapon_id
@armor1_id = actor.armor1_id
@armor2_id = actor.armor2_id
@armor3_id = actor.armor3_id
@armor4_id = actor.armor4_id
@level = actor.initial_level
@exp_list = Array.new(101)
make_exp_list
@exp = @exp_list[@level]
@skills = []
@hp = maxhp
@sp = maxsp
@states = []
@states_turn = {}
@maxhp_plus = 0
@maxsp_plus = 0
@str_plus = 0
@dex_plus = 0
@agi_plus = 0
@int_plus = 0
# 스킬 습득
for i in 1..@level
for j in $data_classes[@class_id].learnings
if j.level == i
learn_skill(j.skill_id)
end
end
end
# 오토 스테이트를 갱신
update_auto_state(nil, $data_armors[@armor1_id])
update_auto_state(nil, $data_armors[@armor2_id])
update_auto_state(nil, $data_armors[@armor3_id])
update_auto_state(nil, $data_armors[@armor4_id])

# 사이드 뷰용으로 정의
@battler_name = actor.character_name + "_b1"
@battler_hue = actor.character_hue
@pattern = 0
@direction = 2
@move_speed = 3
@anime_count = 0
end

# 이벤트의 「액터의 그래픽 변경」에 대응
def set_graphic(character_name, character_hue, battler_name, battler_hue)
@character_name = character_name
@character_hue = character_hue
@battler_name = character_name + "_b1"
@battler_hue = character_hue
end

# 전투시의 표시 위치를 설정
# 기호에 따라 변경해 주세요.

# x방향
def screen_x
if self.index != nil
return self.index * 30 + 450
else
return 0
end
end

# y방향
def screen_y
if self.index != nil
return self.index * 30 + 220
else
return 0
end
end

# z방향
def screen_z
if self.index != nil
return self.index
else
return 0
end
end

# 애니메이션 시키기 위해서 그래픽을 갱신시킨다
def update
@anime_count += 1
if @anime_count > 18 - @move_speed * 2
@pattern = (@pattern + 1) % 4
@anime_count = 0
end
end

# 배드 스테이트를 감시하기 위한 메소드 정의
def bad_state?
k = $data_system.elements.index("배드 스테이트")
@states.each{|i|
if $data_states[i].guard_element_set.include?(k)
return true
end
}
return false
end

# 그래픽의 변경 메소드
# 하나의 캐릭터 파일에서는 4 패턴 밖에 설정할 수 없기 때문에,
# 장래적으로 패턴을 추가하고 싶은 경우에 comment out를 해제해 주세요.
def battle_graphic_to_1
@battler_name = @character_name + "_b1"
end

def battle_graphic_to_2
@battler_name = @character_name + "_b2"
end

end

# 새롭고 Sprite_Actor 클래스를 정의
# 기본적으로는 Sprite_Battler와 같습니다.
# 변경한 점은 코멘트로 표기.
class Sprite_Actor < RPG::Sprite

# 아크세사의 설정
attr_accessor :battler # 버틀러

# 오브젝트 초기화
def initialize(viewport, battler = nil)
super(viewport)
@battler = battler
@battler_visible = false
@damage_view = false # 데미지 표시중 플래그
end

# 해방
def dispose
if self.bitmap != nil
self.bitmap.dispose
end
super
end

# 업데이트
def update
super
# 버틀러가 nil 의 경우
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
end
# ●비트 맵을 버틀러로부터 캐릭터로 변경.
# Sprite_Character로부터 이끌어 오고 있습니다.
self.bitmap = RPG::Cache.character(@battler.battler_name,
@battler.battler_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
sx = @battler.pattern * @cw
sy = (@battler.direction - 2) / 2 * @ch
self.src_rect.set(sx, sy, @cw, @ch)
# 애니메이션 ID 가 현재의 것과 다른 경우
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.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
end
# 가시의 경우
if @battler_visible
# 흰색 플래시
if @battler.white_flash
whiten
@battler.white_flash =true
end
# ●캐릭터의 방향을 설정
# 상태에 따라 변경시킵니다.
# 그래픽을 2개 이상 이용하는 경우, 표준으로"(캐릭터명) _b1"를
# 지정해 있기 때문에, if로 분기 한 직후에 Game_Actor 클래스에서 정의했다
# 그래픽 변경 메소드를 실행해 주세요.
@battler.battle_graphic_to_1 # 그래픽을"(캐릭터명) _b1"로 한다
# 전투 불능 때
if @battler.damage == nil and @battler.dead?
$game_system.se_play($data_system.actor_collapse_se)
@battler.direction = 8
@battler_visible = false
# 데미지중 플래그가 On 때
elsif @damage_view
@battler.direction = 4
# 애니메이션을 표시시킨다
elsif @battler.animation_id != 0
animation = $data_animations[@battler.animation_id]
animation(animation, @battler.animation_hit)
# 애니메이션이 「대상」측, 한편 데미지가 0이상 때
if @battler.damaged and @battler.damage.to_i >= 0
@battler.direction = 4
# 데미지중 플래그를 On로 한다
@damage_view = true
end
@battler.animation_id = 0


### 방어중 때
elsif @battler.guarding?
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 4
###

### 통상 공격시
elsif @battler.current_action.motion == 1
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 2
###

### 스킬 발동시
elsif @battler.current_action.motion == 2
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 6
###

### 아이템 사용시
elsif @battler.current_action.motion == 3
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 8
###

# 핀치 혹은 배드 스테이트 때
elsif @battler.hp <= @battler.maxhp / 4 and @battler.damage == nil or
@battler.bad_state?
@battler.direction = 6
# 그렇지 않으면
else
@battler.direction = 2
end
if @battler.damage_pop
if @battler.damage.to_i >= 0
@battler.direction = 4
end
damage(@battler.damage, @battler.critical)
@battler.damage = nil
@battler.critical = false
@battler.damage_pop = false
end
end
# 데미지중 플래그를 조작한다
if @damage_view == true
# 효과가 비표시로 데미지가 nil라면
if self.effect? == false and @battler.damage == nil
# 데미지 표시 플래그, 공격 대상인가 아닌가의 플래그를 클리어
@damage_view = false
@battler.damaged = false
end
end
# 스프라이트의 좌표를 설정
self.x = @battler.screen_x
self.y = @battler.screen_y
self.z = @battler.screen_z
end
end

# Spriteset_Battle의 수정
class Spriteset_Battle
def initialize
# 뷰포트를 작성
@viewport1 = Viewport.new(0, 0, 640, 320)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport4 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 101
@viewport3.z = 200
@viewport4.z = 5000
# 배틀 백 스프라이트를 작성
@battleback_sprite = Sprite.new(@viewport1)
# 에너미 스프라이트를 작성
@enemy_sprites = []
for enemy in $game_troop.enemies.reverse
@enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
end
# 액터 스프라이트를 작성
# ●Sprite_Battler로부터 Sprite_Actor로 변경한다
@actor_sprites = []
@actor_sprites.push(Sprite_Actor.new(@viewport1))
@actor_sprites.push(Sprite_Actor.new(@viewport1))
@actor_sprites.push(Sprite_Actor.new(@viewport1))
@actor_sprites.push(Sprite_Actor.new(@viewport1))
# 기후를 작성
@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

def update
# 액터 스프라이트의 내용을 갱신 (액터의 교체에 대응)
@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, 320)
end

# ●추가
# 패턴을 갱신시키기 위해서 Game_Actor의 인스턴스를 갱신시킨다
$game_party.actors.each{|actor|
actor.update
}
# 여기까지

# 버틀러 스프라이트를 갱신
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

# Scene_Battle 클래스를 수정한다
class Scene_Battle
#--------------------------------------------------------------------------
# ● 기본 액션 결과 작성
#--------------------------------------------------------------------------
def make_basic_action_result
# 공격의 경우
if @active_battler.current_action.basic == 0
# 애니메이션 ID 를 설정
@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
end
# 행동측 버틀러가 액터의 경우
if @active_battler.is_a?(Game_Actor)
@active_battler.current_action.motion = 1 ###1행 추가
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
end
# 대상측 버틀러의 배열을 설정
@target_battlers = [target]
# 통상 공격의 효과를 적용
for target in @target_battlers
target.attack_effect(@active_battler)
end
return
end
# 방어의 경우
if @active_battler.current_action.basic == 1
# 헬프 윈도우에 "방어" 를 표시
@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
# 스텝 1 에 이행
@phase4_step = 1
return
end
end
#--------------------------------------------------------------------------
# ● 스킬 액션 결과 작성
#--------------------------------------------------------------------------
def make_skill_action_result
# 스킬을 취득
@skill = $data_skills[@active_battler.current_action.skill_id]
# 강제 액션이 아니면
unless @active_battler.current_action.forcing
# SP 조각등에서 사용할 수 없게 되었을 경우
unless @active_battler.skill_can_use?(@skill.id)
# 액션 강제 대상의 버틀러를 클리어
$game_temp.forcing_battler = nil
# 스텝 1 에 이행
@phase4_step = 1
return
end
end
# SP 소비
@active_battler.sp -= @skill.sp_cost
# 스테이터스 윈도우를 리프레쉬
@status_window.refresh
# 헬프 윈도우에 스킬명을 표시
@help_window.set_text(@skill.name, 1)
# 애니메이션 ID 를 설정
@animation1_id = @skill.animation1_id
@animation2_id = @skill.animation2_id
# 코먼 이벤트 ID 를 설정
@common_event_id = @skill.common_event_id
# 대상측 버틀러를 설정
set_target_battlers(@skill.scope)
@active_battler.current_action.motion = 2 ###1행 추가
# 스킬의 효과를 적용
for target in @target_battlers
target.skill_effect(@active_battler, @skill)
end
end
#------------------------------------------------------------------------
# ● 아이템 액션 결과 작성
#--------------------------------------------------------------------------
def make_item_action_result
# 아이템을 취득
@item = $data_items[@active_battler.current_action.item_id]
# 아이템 조각등에서 사용할 수 없게 되었을 경우
unless $game_party.item_can_use?(@item.id)
# 스텝 1 에 이행
@phase4_step = 1
return
end
# 소모품의 경우
if @item.consumable
# 사용한 아이템을 1 줄인다
$game_party.lose_item(@item.id, 1)
end
# 헬프 윈도우에 아이템명을 표시
@help_window.set_text(@item.name, 1)
# 애니메이션 ID 를 설정
@animation1_id = @item.animation1_id
@animation2_id = @item.animation2_id
# 코먼 이벤트 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)
@active_battler.current_action.motion = 3 ###1행 추가
# 아이템의 효과를 적용
for target in @target_battlers
target.item_effect(@item)
end

end


# 대상측 애니메이션 때, 대상인 것을 Game_Actor에게 전한다
def update_phase4_step4
# 대상측 애니메이션
for target in @target_battlers
target.animation_id = @animation2_id
target.animation_hit = (target.damage != "Miss")
# 만약 액터라면
if target.is_a?(Game_Actor)
target.damaged = true
end
end
# 애니메이션의 길이에 관계없이, 최저 8 프레임 기다린다
@wait_count = 8
@active_battler.current_action.motion = 0 ###1행 추가
# 스텝 5 에 이행
@phase4_step = 5
end

end

class Game_BattleAction
attr_accessor :motion ###모션용 플래그 추가
def clear
@speed = 0
@kind = 0
@basic = 3
@skill_id = 0
@item_id = 0
@target_index = -1
@forcing = false
@motion = 0 ###초기화에 추가
end
end

----------------------------------------------------------------------------------------------
*사용방법*
본 스크립트의 이용방법은 복사하신 후 스크립트에디터의 main 위에 삽입하여 새로운 스크립트를
만든 후 본문에 붙여넣기를 하면 됩니다. 스크립트의 제목은 아무거나 해주시면 됩니다.

*스크립트 사용과 관련해서 뱀다리를 붙이자면*
본 스크립트는 보행그래픽이 필요합니다.
반드시 보행그래픽은 Graphics/Characters에 "(캐릭터 파일명) _b1"라는 이름으로
저장되어 있어야 합니다.
그렇지 않으면 이 파일이 없다고 나옵니다.

추가 파일로 010-Lancer02_b1.png을 올립니다.
본 파일을 Graphics/Characters에 저장시킨 뒤 스크립트를 적용하면 대충 어떤 스크립트
인지 알 수 있으실 겁니다.


------------------------------------------------------------------------------------

Comment '8'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6317
821 전투 전투에서도 맵 BGM 연결하는 스크립트 2 file 백호 2009.02.21 1131
820 퀘스트 퀘스트 다이어리 15 백호 2009.02.21 4413
819 타이틀/게임오버 타이틀 가기전에 오프닝 이벤트 시작하기?! 13 file 백호 2009.02.21 3632
818 전투 물리친 적의수 표시 file 백호 2009.02.21 1131
817 전투 에너미들도 게이지바 달고싶다~!! 14 file 백호 2009.02.21 4103
816 스킬 패시브 스킬 (출처 RPGXP 포럼 - 후우님) 18 백호 2009.02.21 2917
815 전투 SimpleAction (출처 -RPGXP 포럼 비밀소년님의 자작품) 1 file 백호 2009.02.21 1194
814 메뉴 메뉴에서 실제시간 보기 2 백호 2009.02.21 1125
813 기타 디버그 윈도우 강화! 3 file 백호 2009.02.21 1552
812 메뉴 새로운 메뉴 시스템 을 한글화 및 약간 개조 3 file 백호 2009.02.21 2206
811 기타 좌표 스크립트 2 백호 2009.02.21 911
810 전투 간단한 액알 스크립트!(1번째) 2 백호 2009.02.21 3170
809 전투 간단 액알 스크립티!(2번째) 2 백호 2009.02.21 2697
808 전투 간단 액알 사용법(3번째) 12 file 백호 2009.02.21 3342
807 키입력 전체 키 사용 스크립트 1 백호 2009.02.21 1427
» 전투 사이드뷰 방식 스크립트. 8 file 백호 2009.02.21 4643
805 전투 배틀포인트 + 배틀샵 1 file 백호 2009.02.21 1274
804 기타 무기 개조 스크립트 file 백호 2009.02.21 1249
803 장비 장비 시 전능력 표시 스크립트 4 file 백호 2009.02.21 1111
802 장비 장비 제련 스크립트 2 file 백호 2009.02.21 1208
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 52 Next
/ 52