I am using Fukuyama's Caterpillar (Train Actor) Script. I've actually had a problem with it in the past but fortunately got it resolved. However, I still have one more problem with it. When I jump, occasionally the followers get misaligned with the leader.
I'll give you a clear example. I have a jump pad that's set up so that I press the Action Key and it jumps me +10 X, now if as soon as I land I head Down-Left (yes diagonally), as soon as the followers catch up, they are misaligned. I hope you know what I mean by misaligned. For instance, they are usually right behind the leader, but then they end up scattered more randomly around the leader. They still follow the leader and function efficiently but it looks very odd.
I have been working on this game for over 1.5 years and plan on finishing it in less than a month so I hope to get this bug fixed soon. I do have a way of working around it but it'd be sloppier and I would just hope that there is a way to edit the script instead. I'll post the precise script:
I'll give you a clear example. I have a jump pad that's set up so that I press the Action Key and it jumps me +10 X, now if as soon as I land I head Down-Left (yes diagonally), as soon as the followers catch up, they are misaligned. I hope you know what I mean by misaligned. For instance, they are usually right behind the leader, but then they end up scattered more randomly around the leader. They still follow the leader and function efficiently but it looks very odd.
I have been working on this game for over 1.5 years and plan on finishing it in less than a month so I hope to get this bug fixed soon. I do have a way of working around it but it'd be sloppier and I would just hope that there is a way to edit the script instead. I'll post the precise script:
Code:
#
# Train_Actor
#
# fukuyama@alles.or.jp
# http://www4.big.or.jp/~fukuyama/
#
# â—é€æ˜ŽçŠ¶æ…‹ç”¨ã‚¹ã‚¤ãƒƒãƒè¨å®š
# true ã ã¨ã‚¹ã‚¤ãƒƒãƒåˆ¶å¾¡ã‚’è¡Œã†
# TRAIN_ACTOR_TRANSPARENT_SWITCH = false
TRAIN_ACTOR_TRANSPARENT_SWITCH = true
# â—é€æ˜ŽçŠ¶æ…‹ç”¨ã‚¹ã‚¤ãƒƒãƒç•ªå·
# ã“ã®ç•ªå·ã®ã‚¹ã‚¤ãƒƒãƒãŒONã ã¨é€æ˜Žã«ãªã‚‹
TRAIN_ACTOR_TRANSPARENT_SWITCHES_INDEX = 20
# 定数
#Input::DOWN = 2
#Input::LEFT = 4
#Input::RIGHT = 6
#Input::UP = 8
DOWN_LEFT = 1
DOWN_RIGHT = 3
UP_LEFT = 7
UP_RIGHT = 9
JUMP = 5
class Game_Party_Actor < Game_Character
def initialize
super()
@through = true
end
def setup(actor)
# ã‚ャラクターã®ãƒ•ã‚¡ã‚¤ãƒ«åã¨è‰²ç›¸ã‚’è¨å®š
if actor != nil
@character_name = actor.character_name
@character_hue = actor.character_hue
else
@character_name = ""
@character_hue = 0
end
# ä¸é€æ˜Žåº¦ã¨åˆæˆæ–¹æ³•ã‚’åˆæœŸåŒ–
@opacity = 255
@blend_type = 0
end
def screen_z(height = 0)
if $game_player.x == @x and $game_player.y == @y
return $game_player.screen_z(height) - 1
end
super(height)
end
#--------------------------------------------------------------------------
# ◠下ã«ç§»å‹•
# turn_enabled : ãã®å ´ã§ã®å‘ã変更を許å¯ã™ã‚‹ãƒ•ãƒ©ã‚°
#--------------------------------------------------------------------------
def move_down(turn_enabled = true)
# 下をå‘ã
if turn_enabled
turn_down
end
# 通行å¯èƒ½ãªå ´åˆ
if passable?(@x, @y, Input::DOWN)
# 下をå‘ã
turn_down
# 座標を更新
@y += 1
end
end
#--------------------------------------------------------------------------
# â— å·¦ã«ç§»å‹•
# turn_enabled : ãã®å ´ã§ã®å‘ã変更を許å¯ã™ã‚‹ãƒ•ãƒ©ã‚°
#--------------------------------------------------------------------------
def move_left(turn_enabled = true)
# 左をå‘ã
if turn_enabled
turn_left
end
# 通行å¯èƒ½ãªå ´åˆ
if passable?(@x, @y, Input::LEFT)
# 左をå‘ã
turn_left
# 座標を更新
@x -= 1
end
end
#--------------------------------------------------------------------------
# â— å³ã«ç§»å‹•
# turn_enabled : ãã®å ´ã§ã®å‘ã変更を許å¯ã™ã‚‹ãƒ•ãƒ©ã‚°
#--------------------------------------------------------------------------
def move_right(turn_enabled = true)
# å³ã‚’å‘ã
if turn_enabled
turn_right
end
# 通行å¯èƒ½ãªå ´åˆ
if passable?(@x, @y, Input::RIGHT)
# å³ã‚’å‘ã
turn_right
# 座標を更新
@x += 1
end
end
#--------------------------------------------------------------------------
# ◠上ã«ç§»å‹•
# turn_enabled : ãã®å ´ã§ã®å‘ã変更を許å¯ã™ã‚‹ãƒ•ãƒ©ã‚°
#--------------------------------------------------------------------------
def move_up(turn_enabled = true)
# 上をå‘ã
if turn_enabled
turn_up
end
# 通行å¯èƒ½ãªå ´åˆ
if passable?(@x, @y, Input::UP)
# 上をå‘ã
turn_up
# 座標を更新
@y -= 1
end
end
#--------------------------------------------------------------------------
# ◠左下ã«ç§»å‹•
#--------------------------------------------------------------------------
def move_lower_left
# å‘ã固定ã§ãªã„å ´åˆ
unless @direction_fix
# å³å‘ãã ã£ãŸå ´åˆã¯å·¦ã‚’ã€ä¸Šå‘ãã ã£ãŸå ´åˆã¯ä¸‹ã‚’å‘ã
@direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::UP ? Input::DOWN : @direction)
end
# 下→左ã€å·¦â†’下 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::LEFT)) or
(passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::DOWN))
# 座標を更新
@x -= 1
@y += 1
end
end
#--------------------------------------------------------------------------
# â— å³ä¸‹ã«ç§»å‹•
#--------------------------------------------------------------------------
def move_lower_right
# å‘ã固定ã§ãªã„å ´åˆ
unless @direction_fix
# å·¦å‘ãã ã£ãŸå ´åˆã¯å³ã‚’ã€ä¸Šå‘ãã ã£ãŸå ´åˆã¯ä¸‹ã‚’å‘ã
@direction = (@direction == Input::LEFT ? Input::RIGHT : @direction == Input::UP ? Input::DOWN : @direction)
end
# 下→å³ã€å³â†’下 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::RIGHT)) or
(passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::DOWN))
# 座標を更新
@x += 1
@y += 1
end
end
#--------------------------------------------------------------------------
# ◠左上ã«ç§»å‹•
#--------------------------------------------------------------------------
def move_upper_left
# å‘ã固定ã§ãªã„å ´åˆ
unless @direction_fix
# å³å‘ãã ã£ãŸå ´åˆã¯å·¦ã‚’ã€ä¸‹å‘ãã ã£ãŸå ´åˆã¯ä¸Šã‚’å‘ã
@direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::DOWN ? Input::UP : @direction)
end
# 上→左ã€å·¦â†’上 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::LEFT)) or
(passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::UP))
# 座標を更新
@x -= 1
@y -= 1
end
end
#--------------------------------------------------------------------------
# â— å³ä¸Šã«ç§»å‹•
#--------------------------------------------------------------------------
def move_upper_right
# å‘ã固定ã§ãªã„å ´åˆ
unless @direction_fix
# å·¦å‘ãã ã£ãŸå ´åˆã¯å³ã‚’ã€ä¸‹å‘ãã ã£ãŸå ´åˆã¯ä¸Šã‚’å‘ã
@direction = (@direction == Input::LEFT ? Input::RIGHT : @direction == Input::DOWN ? Input::UP : @direction)
end
# 上→å³ã€å³â†’上 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::RIGHT)) or
(passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::UP))
# 座標を更新
@x += 1
@y -= 1
end
end
def set_move_speed(move_speed)
@move_speed = move_speed
end
end
class Spriteset_Map
def setup_actor_character_sprites?
return @setup_actor_character_sprites_flag != nil
end
def setup_actor_character_sprites(characters)
if !setup_actor_character_sprites?
index_game_player = 0
@character_sprites.each_index do |i|
if @character_sprites[i].character.instance_of?(Game_Player)
index_game_player = i
break
end
end
for character in characters.reverse
@character_sprites.unshift(
Sprite_Character.new(@viewport1, character)
)
end
@setup_actor_character_sprites_flag = true
end
end
end
class Scene_Map
def setup_actor_character_sprites(characters)
@spriteset.setup_actor_character_sprites(characters)
end
end
class Game_Party
def set_transparent_actors(transparent)
@transparent = transparent
end
def setup_actor_character_sprites
if @characters == nil
@characters = []
for i in 1 .. 4
@characters.push(Game_Party_Actor.new)
end
end
if @actors_chach == nil
@actors_chach = []
end
if @actors_chach != @actors
@actors_chach = @actors.clone
for i in 1 .. 4
@characters[i - 1].setup(actors[i])
end
end
if $scene.instance_of?(Scene_Map)
$scene.setup_actor_character_sprites(@characters)
end
end
def update_party_actors
setup_actor_character_sprites
transparent = $game_player.transparent
if transparent == false
if TRAIN_ACTOR_TRANSPARENT_SWITCH
transparent = $game_switches[TRAIN_ACTOR_TRANSPARENT_SWITCHES_INDEX]
else
transparent = $game_player.transparent
end
end
for character in @characters
character.transparent = transparent
character.set_move_speed($game_player.get_move_speed)
character.update
end
end
def moveto_party_actors( x, y )
setup_actor_character_sprites
for character in @characters
character.moveto( x, y )
end
if @move_list == nil
@move_list = []
end
for i in 0 .. 10
@move_list[i] = nil
end
end
def move_party_actors
if @move_list == nil
@move_list = []
for i in 0 .. 10
@move_list[i] = nil
end
end
@move_list.each_index do |i|
if @characters[i] != nil
case @move_list[i].type
when Input::DOWN
@characters[i].move_down(@move_list[i].args[0])
when Input::LEFT
@characters[i].move_left(@move_list[i].args[0])
when Input::RIGHT
@characters[i].move_right(@move_list[i].args[0])
when Input::UP
@characters[i].move_up(@move_list[i].args[0])
when DOWN_LEFT
@characters[i].move_lower_left
when DOWN_RIGHT
@characters[i].move_lower_right
when UP_LEFT
@characters[i].move_upper_left
when UP_RIGHT
@characters[i].move_upper_right
when JUMP
@characters[i].jump(@move_list[i].args[0],@move_list[i].args[1])
end
end
end
end
class Move_List_Element
def initialize(type,args)
@type = type
@args = args
end
def type() return @type end
def args() return @args end
end
def add_move_list(type,*args)
@move_list.unshift(Move_List_Element.new(type,args)).pop
end
def move_down_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::DOWN,turn_enabled)
end
def move_left_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::LEFT,turn_enabled)
end
def move_right_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::RIGHT,turn_enabled)
end
def move_up_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::UP,turn_enabled)
end
def move_lower_left_party_actors
move_party_actors
add_move_list(DOWN_LEFT)
end
def move_lower_right_party_actors
move_party_actors
add_move_list(DOWN_RIGHT)
end
def move_upper_left_party_actors
move_party_actors
add_move_list(UP_LEFT)
end
def move_upper_right_party_actors
move_party_actors
add_move_list(UP_RIGHT)
end
def jump_party_actors(x_plus, y_plus)
move_party_actors
add_move_list(JUMP,x_plus, y_plus)
end
end
module Game_Player_Module
def update
$game_party.update_party_actors
super
end
def moveto( x, y )
super
$game_party.moveto_party_actors( x, y )
end
def move_down(turn_enabled = true)
if passable?(@x, @y, Input::DOWN)
$game_party.move_down_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_left(turn_enabled = true)
if passable?(@x, @y, Input::LEFT)
$game_party.move_left_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_right(turn_enabled = true)
if passable?(@x, @y, Input::RIGHT)
$game_party.move_right_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_up(turn_enabled = true)
if passable?(@x, @y, Input::UP)
$game_party.move_up_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_lower_left
# 下→左ã€å·¦â†’下 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::LEFT)) or
(passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::DOWN))
$game_party.move_lower_left_party_actors
end
super
end
def move_lower_right
# 下→å³ã€å³â†’下 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::RIGHT)) or
(passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::DOWN))
$game_party.move_lower_right_party_actors
end
super
end
def move_upper_left
# 上→左ã€å·¦â†’上 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::LEFT)) or
(passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::UP))
$game_party.move_upper_left_party_actors
end
super
end
def move_upper_right
# 上→å³ã€å³â†’上 ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒ¼ã‚¹ãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::RIGHT)) or
(passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::UP))
$game_party.move_upper_right_party_actors
end
super
end
def jump(x_plus, y_plus)
# æ–°ã—ã„座標を計算
new_x = @x + x_plus
new_y = @y + y_plus
# åŠ ç®—å€¤ãŒ (0,0) ã®å ´åˆã‹ã€ã‚¸ãƒ£ãƒ³ãƒ—å…ˆãŒé€šè¡Œå¯èƒ½ãªå ´åˆ
if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
$game_party.jump_party_actors(x_plus, y_plus)
end
super(x_plus, y_plus)
end
# -----------------------------------------------
# move_speed を外ã‹ã‚‰è¦‹ã‚Œã‚‹ã‚ˆã†ã«
# -----------------------------------------------
def get_move_speed
return @move_speed
end
end
class Game_Player
include Game_Player_Module
end