RPGXP/VX RPGXP의 기본전투 속도를 더욱 빠르게~
2007.06.08 11:32
스크립트 에디터에서 'Main' 위쪽에 'Battle_Speed'라는 제목으로 찔러넣으세요.
기본전투의 속도가 확 올라가서 전투가 시원시원해집니다.
출처 : 그레이쓰님의 작품 '시간의 지배자'
class RPG::Sprite
def effect?
@_whiten_duration > 14 or
@_appear_duration > 14 or
@_escape_duration > 4 or
@_collapse_duration > 4 or
@_damage_duration > 16 or
@_animation_duration > 6
end
end
댓글 9
-
협객
2007.06.10 22:02
그러면 이제 이 스크립트의 원리에 대해 논해 봅시다.|+rp2+|2956|+rp3+|acoc_board_ideatip -
협객
2007.06.10 22:11
참조:
http://www.acoc.co.kr/acoc/board/zboard.php?id=dic_hamsu&head_data=head_game.php&footer_data=footer_game.php&root_data=../../newcoc/&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=86
|+rp+|2956|+rp2+|2957|+rp3+|acoc_board_ideatip -
협객
2007.06.10 22:20
도움말: 게임 라이브러리,
RGSS 편입클래스의 RPG::Sprite를 참조합니다.
effect?라고 되어 있는 메소드에 주목합니다.
whiten, appear, escape, collapse, damage, animation
이렇게 6개의 효과에 대해 언급이 되어 있습니다.
위 스크립트의 이 부분과 비교해 보시면 상당한 공통점이 있음을 알 수 있습니다.
@_whiten_duration > 14 or
@_appear_duration > 14 or
@_escape_duration > 4 or
@_collapse_duration > 4 or
@_damage_duration > 16 or
@_animation_duration > 6
whiten, appear, escape, collapse, damage, animation 이라는 단어가 보이실 것입니다.
그리고 그 뒤에, _duration이라고 쓰여 있습니다.
duration: 사전을 찾아보시면, "지속시간"이라고 해석할 수 있습니다. |+rp+|2956|+rp2+|2958|+rp3+|acoc_board_ideatip -
협객
2007.06.10 22:29
그렇다면, 연산자
> 14, > 14, > 4, > 4, > 16, > 6의 뜻은?
그러면 메소드 effect?를 확인해 봅시다.
def effect?
@_whiten_duration > 0 or
@_appear_duration > 0 or
@_escape_duration > 0 or
@_collapse_duration > 0 or
@_damage_duration > 0 or
@_animation_duration > 0
end
전부다 > 0 으로 되어 있습니다.
나머지는 다음 사람이 적당히 찾아보도록... 바빠서 이만. ㅡ.ㅡ;|+rp2+|2959|+rp3+|acoc_board_ideatip -
협객
2007.06.10 22:59
간단히 말해서 비교 연산자 "크다". 즉, 지속시간이 0보다 클 경우 (duration > 0) 를,
지속시간이 14보다 클 경우 (duration > 14) 등으로 바꿔 준 것입니다.
왜 그랬는가?
이는 effect?를 검색해 보면 Scene_Battle 1에서 effect? 메소드가 쓰였음을 확인할 수 있습니다.
# 효과 표시중의 경우
if @spriteset.effect?
return
end
자, 이제 여기에 p @spriteset.effect?를 추가해 넣어봅시다.
# 효과 표시중의 경우
p @spriteset.effect?
if @spriteset.effect?
return
end
그리고 테스트 플레이를 하면?
위의 빠른 전투 스크립트를 찔러 넣었을 경우, false가 굉장히 많이 나옵니다. |+rp+|2959|+rp2+|2960|+rp3+|acoc_board_ideatip -
협객
2007.06.10 23:02
그러면 위의 빠른 전투 스크립트를 지우고 다시 테플해 봅시다.
어라라랏? 처음부터 true가 뜨는 것을 확인할 수 있습니다.
그렇다면, 이제 Scene_battle 1을 다시 체크.
def update
# 배틀 이벤트 실행중의 경우
if $game_system.battle_interpreter.running?
# interpreter를 갱신
$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
# 타이머가 0 이 되었을 경우
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
# 배틀 개시전의 BGM 에 되돌린다
$game_system.bgm_play($game_temp.map_bgm)
# 배틀 종료
battle_end(1)
return
end
# 웨이트중의 경우
if @wait_count > 0
# 웨이트 카운트를 줄인다
@wait_count -= 1
return
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
|+rp+|2959|+rp2+|2961|+rp3+|acoc_board_ideatip -
협객
2007.06.10 23:17
def update에 주목.
true와 false의 뜻은, "참"과 "거짓".
즉, true일 경우 update를 해주고, 거짓일 경우 update를 해주지 않는다는 것입니다.
update = 업데이트.
그러니까, 프로그램을 돌리는데 있어서, RPGXP는 Scene_Battle, 전투 장면을 지속적으로 업데이트 해주는 기능을 쓰고 있습니다.
그런데
if @spriteset.effect?
return
end
따라서 @spriteset.effect?가 false로 되어 있을 경우,
화면 업데이트를 건너 뛰어 주게 됩니다. 프로그램을 한 번 덜 돌리기 때문에 빨라지는 것입니다.
true로 되어 있을 경우, 효과를 보여주기 위해서 화면을 업데이트하기 때문에 느려집니다.
즉, 자신이 만드는 게임에서 쓰는 전투 효과에 대해 잘 알고 있지 않다면, 보여 주고 싶은 효과를 보여주지 않게 되는 부작용을 떠안게 됩니다.
기존의 경우 지속시간이 0보다 큰 효과는 모두 보여주기 위해서 업데이트를 해주었지만,
저 스크립트를 찔러넣을 경우,
@_whiten_duration > 14 or
@_appear_duration > 14 or
@_escape_duration > 4 or
@_collapse_duration > 4 or
@_damage_duration > 16 or
@_animation_duration > 6
위의 경우를 제외하고는 모두 false가 되어 업데이트를 건너 뛰게 됩니다.
예를 들면 지속시간이 0보다 크면서도, 위의 경우에 해당될만큼 긴 지속시간을 갖고 있는 효과가 아니라면, 업데이트를 건너 뛴다는 뜻입니다.
짧은 효과는 보여 주지 않고 건너 뛰고, 긴 효과만 보여 주도록 하기 때문에 화면 업데이트 횟수를 절약하게 되어 프로그램이 빨라지게 되는 것입니다. |+rp+|2959|+rp2+|2962|+rp3+|acoc_board_ideatip -
오렌지!
2009.01.25 05:27
좋은 설명과 자료 감사합니다 ^^|+rp2+|3271|+rp3+|acoc_board_ideatip -
KOOK
2010.01.12 08:02
굉장하셔요! ㅎ|+rp2+|3307|+rp3+|acoc_board_ideatip