XP 스크립트

http://www.rmxp.org/forums/showthread.php?t=7121
(로그인 필요)
이벤트에 지정된 스프라이트의 크기가 클 경우, 거기에 맞춰서 이벤트의 '크기'를 지정하는 것입니다.(여기서 말하는 이벤트의 '크기'는 해당 이벤트를 플레이어나 다른 이벤트가 통과할 수 있는가 여부와 관련있습니다) 일단 작동은 첨부된 데모를 참조하기 바랍니다.


class Game_Character

attr_accessor :size_x # event size x
attr_accessor :size_y # event size y
attr_accessor :tiles_left # sizing - tiles to the left
attr_accessor :tiles_right # sizing - tiles to the right

def initialize
@id = 0
@x = 0
@y = 0
@real_x = 0
@real_y = 0
@tile_id = 0
@character_name = ""
@character_hue = 0
@opacity = 255
@blend_type = 0
@direction = 2
@pattern = 0
@move_route_forcing = false
@through = false
@animation_id = 0
@transparent = false
@original_direction = 2
@original_pattern = 0
@move_type = 0
@move_speed = 4
@move_frequency = 6
@move_route = nil
@move_route_index = 0
@original_move_route = nil
@original_move_route_index = 0
@walk_anime = true
@step_anime = false
@direction_fix = false
@always_on_top = false
@anime_count = 0
@stop_count = 0
@jump_count = 0
@jump_peak = 0
@wait_count = 0
@locked = false
@prelock_direction = 0
@size_x = 1
@size_y = 1
@tiles_left = 0
@tiles_right = 0
end

#--------------------------------------------------------------------------
# *** BEGIN Sized Events v1.0
#--------------------------------------------------------------------------
# By Toby Zerner
# USAGE:
# In a parallel process event, call this script-x:
# $game_map.events[ID].size(SIZE_X, SIZE_Y)
# Replacing the words in capitals with the actual details.
#--------------------------------------------------------------------------
def size(x, y)
# Set instance variables
@size_x = x
@size_y = y
# Work out the number of tiles either side of the event
tiles_x = (@size_x - 1) / 2
@tiles_left = tiles_x.floor
@tiles_right = tiles_x.ceil
end

#--------------------------------------------------------------------------
# * Determine if Passable
# x : x-coordinate
# y : y-coordinate
# d : direction (0,2,4,6,8)
# * 0 = Determines if all directions are impassable (for jumping)
#--------------------------------------------------------------------------
# EDITED FOR SIZED EVENTS
#--------------------------------------------------------------------------
def passable?(x, y, d)
# Get new coordinates
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# If coordinates are outside of map
unless $game_map.valid?(new_x, new_y)
# impassable
return false
end
# If through is ON
if @through
# passable
return true
end

# Check map passability settings
# Loop through each x tile
for i in 0...@size_x
# Check x coordinates
# If unable to leave first move tile in designated direction
unless $game_map.passable?(x - @tiles_left + i, y, d, self) then return false end
unless $game_map.passable?(new_x - @tiles_left + i, new_y, 10 - d) then return false end
# Loop through each y tile
for j in 0...@size_y
# Check y coordinates
# If unable to leave first move tile in designated direction
unless $game_map.passable?(x, y - j, d, self) then return false end
# If unable to enter move tile in designated direction
unless $game_map.passable?(new_x, new_y - j, 10 - d) then return false end
# Check x and y coordinates
# If unable to leave first move tile in designated direction
unless $game_map.passable?(x - @tiles_left + i, y - j, d, self) then return false end
# If unable to enter move tile in designated direction
unless $game_map.passable?(new_x - @tiles_left + i, new_y - j, 10 - d) then return false end
end
end

# Loop through map events
for event in $game_map.events.values
# If self is in range of [event]'s sizing, we can't pass
if event_collide?(self, event, new_x, new_y)
return false
end
end

# If player coordinates are consistent with move destination
if event_collide?(self, $game_player, new_x, new_y) and self != $game_player
return false
end

# passable
return true
end

#--------------------------------------------------------------------------
# * Check if two events collide (event sizing)
# event1 : the first event
# event2 : the second event
# new_x : the new x coordinate of event 1
# new_y : the new y coordinate of event 1
#--------------------------------------------------------------------------
def event_collide?(event1, event2, new_x, new_y)
if event1.id == event2.id then return false end
collision = false
# Check if there is a collision on the y axis
# Loop through each individual tile on both events and compare them
for i in (new_y - (event1.size_y - 1))..new_y
for j in (event2.y - (event2.size_y - 1))..event2.y
# If event 1's tile is the same as event 2's tile, we have a collision
if i == j
unless event1.through or event2.through
# Make sure there is a graphic - if not, no collision
if event1.character_name != "" and event2.character_name != ""
# There was a collision
collision = true
end
end
end
end
end
# If there was a collision on the y axis...
if collision == true
# Check the x axis
# Loop through each individual tile on both events and compare them
for i in (new_x - event1.tiles_left)..(new_x + event1.tiles_right)
for j in (event2.x - event2.tiles_left)..(event2.x + event2.tiles_right)
# If event 1's tile is the same as event 2's tile, we have a collision
if i == j
unless event1.through or event2.through
# Make sure there is a graphic - if not, no collision
if event1.character_name != "" and event2.character_name != ""
# There was a collision
return true
end
end
end
end
end
end
# No collision
return false
end

end

class Game_Player

#--------------------------------------------------------------------------
# * Same Position Starting Determinant
#--------------------------------------------------------------------------
def check_event_trigger_here(triggers)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# All event loops
for event in $game_map.events.values
# If event coordinates and triggers are consistent
# EDITED FOR SIZED EVENTS
# If player's coordinates collide with the event and its sizing
if @x >= event.x - event.tiles_left and @x <= event.x + event.tiles_right and
@y >= event.y - (event.size_y - 1) and @y <= event.y and
triggers.include?(event.trigger)
# If starting determinant is same position event (other than jumping)
if not event.jumping? and event.over_trigger?
event.start
result = true
end
end
end
return result
end
#--------------------------------------------------------------------------
# * Front Envent Starting Determinant
#--------------------------------------------------------------------------
def check_event_trigger_there(triggers)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# Calculate front event coordinates
new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
# All event loops
for event in $game_map.events.values
# If event coordinates and triggers are consistent
# EDITED FOR SIZED EVENTS
# If player's new coordinates collide with the event and its sizing
if new_x >= event.x - event.tiles_left and new_x <= event.x + event.tiles_right and
new_y >= event.y - (event.size_y - 1) and new_y <= event.y and
triggers.include?(event.trigger)
# If starting determinant is front event (other than jumping)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
# If fitting event is not found
if result == false
# If front tile is a counter
if $game_map.counter?(new_x, new_y)
# Calculate 1 tile inside coordinates
new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
# All event loops
for event in $game_map.events.values
# If event coordinates and triggers are consistent
# EDITED FOR SIZED EVENTS
# If player's new coordinates collide with the event and its sizing
if new_x >= event.x - event.tiles_left and new_x <= event.x + event.tiles_right and
new_y >= event.y - (event.size_y - 1) and new_y <= event.y and
triggers.include?(event.trigger)
# If starting determinant is front event (other than jumping)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
end
end
return result
end
#--------------------------------------------------------------------------
# * Touch Event Starting Determinant
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# All event loops
for event in $game_map.events.values
# EDITED FOR SIZED EVENTS
# If passed coordinates collide with the event and its sizing
if x >= event.x - event.tiles_left and x <= event.x + event.tiles_right and
y >= event.y - (event.size_y - 1) and y <= event.y and [1,2].include?(event.trigger)
event.start
result = true
end
end
return result
end

end


사용법: 맵에 병렬처리되는 이벤트를 하나 만들고 다음처럼 지정합니다 -
$game_map.events[ID].size(SIZE_X, SIZE_Y)
size_x/y는 이벤트의 가로/세로 크기(단위가 어떻게 되는지는 데모를 보세요).

Who's 백호

?

이상혁입니다.

http://elab.kr

Atachment
첨부 '1'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
681 기타 Shift Puzzles v2 by SephirothSpawn (SDK호환) 3 file 백호 2009.02.22 1170
680 장비 SIBruno's Advanced Equip Screen v2 file 백호 2009.02.22 1246
679 전투 SimpleAction (출처 -RPGXP 포럼 비밀소년님의 자작품) 1 file 백호 2009.02.21 1194
678 전투 Single/All Target Switching by RPG Advocate 백호 2009.02.22 816
» 기타 Sized Events 0.1 by Toby@rmxp.org file 백호 2009.02.22 845
676 스킬 Skill Requirements by SephirothSpawn (SDK호환) file 백호 2009.02.22 763
675 스킬 Skill Shop by SephirothSpawn file 백호 2009.02.22 813
674 스킬 Skill Shop by Trickster@rmxp.org file 백호 2009.02.22 1073
673 스킬 Skills_Consume_Hp[By: Gando] - HP를 소비하는 스킬 스크립트 4 쉴더 2009.02.21 1385
672 기타 Sphere Grid System file 백호 2009.02.21 765
671 전투 SRPGコンバータⅡ by AD.Bank 1 습작 2013.05.13 1769
670 전투 srpg용 스크립트라는데 4 세죠 2010.03.26 3524
669 메뉴 Star Ocean 3 형식으로 스테이터스 화면 변경 1 file 백호 2009.02.21 1570
668 전투 Star Ocean Battle System 3 file 백호 2009.02.22 1228
667 기타 Steal Script (SDK Required) file 백호 2009.02.21 1182
666 전투 Steal Script 5.5 by trickster@rmxp.net (SDK호환) file 백호 2009.02.22 1206
665 전투 Stealing/Mugging/Scanning 6.0 Final by Trickster (SDK호환) file 백호 2009.02.22 885
664 메뉴 Stormtronics CMS 5.39b - Hybrid Edition by Blizzard 4 file Alkaid 2010.09.06 1742
663 저장 StupidStormy36's Custom Save System 3 Alkaid 2010.10.05 1199
662 저장 StupidStormy36's Custom Save System 2010-10-06(05?) Edition 1 Alkaid 2010.10.07 1247
Board Pagination Prev 1 ... 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 52 Next
/ 52