RPG2K엔 없는 RPGXP의 빡세게 치명적인 단점이 있다.
x와 y에 대한 것이다-_-
일단
def move_down(turn_enabled = true)
# 아래를 향한다
if turn_enabled
turn_down
end
# 통행 가능한 경우
if passable?(@x, @y, 2)
# 아래를 향한다
turn_down
# 좌표를 갱신
@y += 1
# 보수 증가
increase_steps
# 통행 불가능한 경우
else
# 접촉 이벤트의 기동 판정
check_event_trigger_touch(@x, @y+1)
end
end
이 스크립트를 보자
저기 굵은 글씨를 주목할 필요가 있다
move_down은 한번 실행하면 반복적으로 실행해서 y를 계속 다운시킨다.
엔터브레인 스크립터 누구냐?
뭐 이렇게 짜는 지 참 ㄱ-
저게 무슨 문제가 있냐? 하면 액알 같은거 만들때입니다.
원거리 공격 같은걸 만들때 실제적으론 마주치지 않았는데 이동중인 애는 x값이나 y값이 조낸 비정상적입니다.
두 칸이 가로로 있다고 가정할때 주인공이 왼쪽 칸에서 오른쪽칸으로 반 이동하는 중이라면
주인공의 x값은 0이나 1이어야 정상이죠?
하지만 x값이 약 16정도가 됩니다.
얼마나 심각한지 아시겠음?[..]
그래서 마주쳤는데도 그냥 지나가 엉뚱한데서 히트판정이 나는 개안습의 상황이 연출되는 것입니다.
근본적인 문제라고 생각-_-
이 문제로 인해 문제가 생기면 진짜
혈압이 짝짝 오릅니다
진짜 누가 이렇게 만들었냐[..]
x와 y를 좋게 만들러면 이 시스템을 갈아엎어야 하는데
존내 복잡할 뿐더러 제게 그런 실력이 없습니다.
방법은 저 스크립트에 휘둘리지 않는 x와 y를 만드는 것.
그 x와 y를 orig_x, orig_y로 합시다.
왜냐고? orig=original=오리지날=원형
...넘어가죠[..]
Game_Character 1 부분에서
attr_reader :orig_x # 맵 X 좌표 (Moving중에도 변하지 않음)
attr_reader :orig_y # 맵 Y 좌표 (Moving중에도 변하지 않음)
를 붙입시다.
저게 뭐냐?
인스턴스 변수는 클레스 안에서만 쓸 수 있는 폐쇠적인(?) 변수입니다.
하지만 저렇게 해놓으면
만일 class 돌날라봤자 안에 인스턴스 술을열어볼래가 있으면
돌날라봤자 안에서만 @술을열어볼래 를 쓸 수 있습니다만
만일
attr_reader :술을열어볼래
또는
attr_accessor :술을열어볼래
를 위에 단 후에
댈러맨디 = 돌날라봤자.new
댈러맨디.술을열어볼래
를 통해 인스턴스변수를 쓸 수 있습니다-_-;;
Q:attr_reader와 attr_accessor의 차이는 대체 뭡니까?
A:내가 묻고 싶은 말입니다 ㅠㅠ 대체 차이가 뭡니까 ㅠㅠ
어쨋든 위의 저걸 붙이구요
def original_xy_take
unless moving?
@orig_x = @x
@orig_y = @y
end
end
붙이는 법은 Game_Character 1의 구석진 곳에 쳐넣으면 됩니다.
대충 잘 붙이시리라 믿고
@x와 @orig_x는 같고
@y와 @orig_y는 같게 하는겁니다.
그러면 그게 그거 아냐? 할 수 있습니다.
unless moving?가 그에 대한 답.
moving?이 뭘 뜻하는지는 다 아시죠? XP의 x와 y가 이상해지는 문제는 이동중일때만 해당됩니다.
unless는 if의 반대. 그니까 이동중이 아닐때만 x와 y를 이어받는다
그러므로 RPG2K의 x,y처럼 제구실을 할 수 있게 된다는 거죠.
Game_Character 2에 def update가 있죠?
그 안 어딘가에다 original_xy_take를 쳐박으세요.
그래야 저 original_xy_take 함수를 실행하죠.(RPG2K의 이벤트 불러오기와 같은 기능)
저 orig_x와 orig_y는 마주치기 판정, 액알 등에서 문제가 발생하지 않고 잘 굴러가게 해줄 겁니다.
그럼 ㅅㄱㅎㅅㅇ