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 6153
981 HUD [게이지바]3.0버젼「현재시간, 플레이시간, 걸음수, 윈도우 이동 추가」(HelloCoa2Ver3.0) 63 file 코아 코스튬 2010.10.30 4921
980 메시지 메세지플러스3.1v스크립트(얼굴표시,메세지색상,속도등정하는스크립트) 8 백호 2009.02.21 4878
979 윈도우_게이지 (HP, SP, 경험치<소수점포함>… 12 WMN 2008.04.06 4856
978 메뉴 1인 캐릭터 메뉴 스크립트 27 file - 하늘 - 2009.08.06 4788
977 이동 및 탈것 아하! 그렇구나의 3D 신기술 체험 30 아하!잘봤어요. 2010.02.28 4772
976 전투 사이드뷰 배틀 (2003 형식으 전투)| 12 file 아방스 2007.11.09 4744
975 메시지 메세지 표시 업그레이드 11 file 백호 2009.02.21 4723
» 전투 사이드뷰 방식 스크립트. 8 file 백호 2009.02.21 4636
973 HUD 새로운방법의 맵이름 표시 31 file 백호 2009.02.21 4617
972 그래픽 부드럽게 화면이 움직이는 스크립트 입니다. 16 GangSin 2012.09.12 4585
971 전투 ABP 액알 (Action Battle Player) 14 file 백호 2009.02.22 4556
970 HUD HP과 SP 바 19 Man... 2008.11.04 4534
969 이름입력 한글 이름 입력 15 ok하승헌 2010.02.18 4486
968 게이지바 만들기 [헬악이님 제공] 12 file 아방스 2007.11.09 4414
967 메뉴 메뉴에 그림넣기 4 file 백호 2009.02.22 4411
966 퀘스트 퀘스트 다이어리 15 백호 2009.02.21 4406
965 전투 XAS 여러가지버전. 9 §포뇨§ 2010.02.23 4395
964 온라인 온라인 스크립트입니다^^(예제파일) 7 캉쿤 2011.09.24 4390
963 타이틀/게임오버 타이틀 화면 커스터마이즈 (타이틀 메뉴 바꾸는 스크립트) 9 file №1 2012.08.04 4389
962 미니맵 미니맵 만들기~! 14 file 블리치캐릭셋원함 2010.11.24 4348
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