Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Script: Draw Animated Characters In Windows
- # Author: Evgenij
- # Date: 07.01.2015
- # Version: 1.0a
- #
- # Description: With this script you can add a new method to windows
- # which will draw animated characters
- #
- # You need to include the EVG::AnimatedDrawCharacter Module
- # into a Window class.
- # Then you can use this methods:
- # draw_animated_character(character_name, character_index, x, y, direction = 2)
- # clear_animated_characters # clears all the characters from windows content
- # # and stops drawing them
- module EVG
- # Adds a new method to a window when included:
- # draw_animated_character(character_name, character_index, x, y, direction = 2)
- module AnimatedDrawCharacter
- # wait between each character frame (in frames)
- WAIT_BETWEEN_FRAMES = 10
- def initialize(*args)
- super(*args)
- create_animation_state_machine
- end
- def create_animation_state_machine
- @anim_state_machine = AnimationStateMachine.new
- @animated_characters = []
- end
- def draw_animated_character(character_name, character_index, x, y, direction = 2)
- return unless character_name
- bitmap = Cache.character(character_name)
- sign = character_name[/^[\!\$]./]
- if sign && sign.include?('$')
- cw = bitmap.width / 3
- ch = bitmap.height / 4
- else
- cw = bitmap.width / 12
- ch = bitmap.height / 8
- end
- @animated_characters << [character_name, character_index, x, y, cw, ch, direction]
- @animated_characters.uniq!
- update_animated_characters
- end
- def clear_animated_characters
- @animated_characters.each do |arr|
- contents.clear_rect(arr[2] - arr[4] / 2, arr[3] - arr[5], arr[4], arr[5])
- end
- @animated_characters = []
- end
- def update
- super
- @anim_state_machine.update
- update_animated_characters if @anim_state_machine.changed?
- end
- def update_animated_characters
- @animated_characters.each{|arr| update_animated_character(arr)}
- end
- # Param looks like this: [character_name, character_index, x, y, ch, cw, direction]
- def update_animated_character(arr)
- contents.clear_rect(arr[2] - arr[4] / 2, arr[3] - arr[5], arr[4], arr[5])
- bitmap = Cache.character(arr[0])
- src_rect = @anim_state_machine.get_rect(arr[1], arr[4], arr[5], arr[6])
- contents.blt(arr[2] - arr[4] / 2, arr[3] - arr[5], bitmap, src_rect)
- end
- end
- class AnimationStateMachine
- def initialize
- super
- @anime_count = 0
- @pattern = 1
- @frame_count = AnimatedDrawCharacter::WAIT_BETWEEN_FRAMES
- end
- def get_rect(char_index, cw, ch, d)
- pattern = @pattern < 3 ? @pattern : 1
- sx = (char_index % 4 * 3 + pattern) * cw
- sy = (char_index / 4 * 4 + (d - 2) / 2) * ch
- Rect.new(sx, sy, cw, ch)
- end
- def update
- update_pattern
- end
- def update_pattern
- @anime_count += 1
- if @anime_count > @frame_count
- @pattern = (@pattern + 1) % 4
- @anime_count = 0
- end
- end
- def changed?
- @anime_count == 0
- end
- end
- end
RAW Paste Data