#============================================================================== # SIDE/TOP CHARACTERS # Author Molegato # Version 2.2 # (V1 was called 'Lateral Characters') #------------------------------------------------------------------------------ # Only characters with @ in their name will be sideview # Only characters with # in their name will be topview # A character with both in the name will be sideview, but will rotate # when moving diagonally. Great for flying/diving sideview #============================================================================== module SIDETOP_CHARS USE_8_DIR = true end #============================================================================== # ■ Game_CharacterBase #============================================================================== class Game_CharacterBase attr_accessor :custom attr_accessor :sideview attr_accessor :topview attr_reader :direction alias sideviewinitialize initialize def initialize @sideview=false @topview=false @top_direction=0 sideviewinitialize end alias sideviewupdate_anime_count update_anime_count def update_anime_count if @sideview or @topview @anime_count += 2 else sideviewupdate_anime_count end end alias sideviewupdate_anime_pattern update_anime_pattern def update_anime_pattern if @sideview or @topview if !@step_anime && @stop_count > 0 @pattern = @original_pattern else @pattern += 1 if @pattern>=8 @pattern=1 end end else sideviewupdate_anime_pattern end end end #============================================================================== # ■ Game_CharacterBase #============================================================================== class Game_CharacterBase def movedirection return @angledirection end alias sideviewset_direction set_direction def set_direction(d) sideviewset_direction(d) @angledirection = @direction end alias sideviewmove_straight move_straight def move_straight(d, turn_ok = true) sideviewmove_straight(d, turn_ok) @angledirection = @direction end alias sideviewmove_diagonal move_diagonal def move_diagonal(horz, vert) sideviewmove_diagonal(horz, vert) if horz==4 and vert==2 @angledirection=1 end if horz==6 and vert==2 @angledirection=3 end if horz==4 and vert==8 @angledirection=7 end if horz==6 and vert==8 @angledirection=9 end end end #============================================================================== # ■ Game_Player #============================================================================== class Game_Player < Game_Character alias sideviewmove_by_input move_by_input def move_by_input if SIDETOP_CHARS::USE_8_DIR return if !movable? || $game_map.interpreter.running? if Input.dir8 > 0 if Input.dir8==2 or Input.dir8==4 or Input.dir8==6 or Input.dir8==8 move_straight(Input.dir4) else if Input.dir8==1 move_diagonal(4, 2) end if Input.dir8==3 move_diagonal(6, 2) end if Input.dir8==7 move_diagonal(4, 8) end if Input.dir8==9 move_diagonal(6, 8) end end end else sideviewmove_by_input end end end #============================================================================== # ■ Sprite_Character #============================================================================== class Sprite_Character < Sprite_Base alias sideviewinitialize initialize def initialize(viewport, character = nil) @moving_time = 5 sideviewinitialize(viewport, character) end alias sideviewset_character_bitmap set_character_bitmap def set_character_bitmap sideviewset_character_bitmap if @character_name.include?('@') @cw = bitmap.width / 8 @ch = bitmap.height / 2 @sideview=true else @sideview=false end if @character_name.include?('#') @cw = bitmap.width / 8 @ch = bitmap.height / 2 @topview=true else @topview=false end self.ox = @cw / 2 if @topview==true and @sideview==false self.oy = @ch / 2 else self.oy = @ch end @character.sideview=@sideview @character.topview=@topview end alias sideviewupdate_src_rect update_src_rect def update_src_rect @character.custom=@sideview if @sideview==false and @topview==false sideviewupdate_src_rect self.mirror=false else if @character.moving? @moving_time=5 else @moving_time-=1 end index = @character.character_index pattern = @character.pattern < 8 ? @character.pattern : 1 sx = pattern*@cw sy = 0 if @moving_time>0 sy+=@ch end #mirror if @sideview if @character.direction==4 or @character.movedirection==7 or @character.movedirection==1 self.mirror=false end if @character.direction==6 or @character.movedirection==9 or @character.movedirection==3 self.mirror=true end end #angle if @topview update_angle end self.src_rect.set(sx, sy, @cw, @ch) end end def update_angle if not @angle @angle = 0 end if @character.movedirection==2 @angle=270 end if @character.movedirection==4 @angle=180 end if @character.movedirection==6 @angle=0 end if @character.movedirection==8 @angle=90 end if @character.movedirection==9 @angle=45 end if @character.movedirection==7 @angle=135 end if @character.movedirection==1 @angle=225 end if @character.movedirection==3 @angle=315 end if @sideview @angle=0 if @character.movedirection==9 or @character.movedirection==1 @angle=45 end if @character.movedirection==7 or @character.movedirection==3 @angle=315 end end if not @current_angle @current_angle=@angle end if [@angle,@current_angle].max-[@angle,@current_angle].min>180 if @angle>@current_angle @angle-=360 else @angle+=360 end end @current_angle=(@current_angle*9+@angle)/10 self.angle=@current_angle end end