Class: UI::SpriteStack

Inherits:
Object show all
Defined in:
scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb

Overview

Class that helps to define a single object constitued of various sprites. With this class you can move the sprites as a single sprite, change the data that generate the sprites and some other cool stuff

Direct Known Subclasses

BattleUI::AbilityBar, BattleUI::ExpDistribution, BattleUI::ExpDistribution::PokemonInfo, BattleUI::ExpDistribution::Statistics, BattleUI::GenericChoice, BattleUI::InfoBar, BattleUI::PlayerChoice::ItemInfo, BattleUI::PlayerChoice::SpecialButton, BattleUI::PlayerChoice::SubChoice, BattleUI::SkillChoice::MoveButton, BattleUI::SkillChoice::MoveDescription, BattleUI::SkillChoice::MoveInfo, BattleUI::SkillChoice::SpecialButton, BattleUI::SkillChoice::SubChoice, BattleUI::TargetSelection, BattleUI::TargetSelection::Button, BattleUI::TrainerPartyBalls, GTS::Button, GTS::LoadingScreen, Bag::ButtonList::ItemButton, Bag::InfoCompact, Bag::InfoWide, Bag::PocketList, Bag::ScrollBar, Bag::SearchBar, Bag::WinPocket, Casino::NumberDisplay, DexButton, DexSeenGot, DexWinInfo, DexWinMap, DexWinSprite, GenericBase, GenericBase::ControlButton, Hall_of_Fame::Congratulation_Text_Box, Hall_of_Fame::Dead_Pokemon_Text, Hall_of_Fame::End_Stars_Animation, Hall_of_Fame::Graveyard_Animation_Stack, Hall_of_Fame::League_Champion_Text_Box, Hall_of_Fame::Party_Battler_Stack, Hall_of_Fame::Pokemon_Battler_Stack, Hall_of_Fame::Pokemon_Stars_Animation, Hall_of_Fame::Pokemon_Text_Box, Hall_of_Fame::Trainer_Infos_Text_Box, Hall_of_Fame::Type_Background, InputNumber, KeyBindingViewer, MapPanel, MiningGame::Diggable_Stack, MiningGame::Hit_Counter_Stack, MiningGame::Tiles_Stack, MiningGame::Tool_Buttons, MoveTeaching::BaseBackground, MoveTeaching::NewSkill, MoveTeaching::PokemonInfos, MoveTeaching::Skill, MoveTeaching::SkillDescription, Options::Button, Options::Description, PSDKMenuButton, Quest::CategoryDisplay, Quest::Composition, Quest::ObjectiveList, Quest::QuestButton, Quest::QuestList, Quest::RewardButton, Quest::RewardScreen, Quest::ScrollBar, QuestInformer, SaveSign, UI::Shop::ItemDesc, UI::Shop::ItemList::ListButton, UI::Shop::MoneyWindow, UI::Shop::PkmDesc, UI::Shop::PkmList::ListButtonPkm, UI::Shop::PkmScrollBar, UI::Shop::ScrollBar, ShortcutElement, UI::Storage::BoxStack, UI::Storage::Composition, UI::Storage::DetailedSearch, UI::Storage::PartyStack, UI::Storage::RapidSearch, UI::Storage::Summary, Summary_Memo, Summary_Skill, Summary_Skills, Summary_Stat, Summary_Top, TeamButton, TextScroller, TitleControls, VoltorbFlip::Animation, VoltorbFlip::BoardCounter, VoltorbFlip::BoardTile, VoltorbFlip::Texts

Constant Summary collapse

NO_INITIAL_IMAGE =

Constant specifiying the sprite will have no image during initialization

nil

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(viewport, x = 0, y = 0, default_cache: :interface) ⇒ SpriteStack

Create a new Sprite stack

Parameters:

  • viewport (Viewport)

    the viewport where the sprites will be shown

  • x (Numeric) (defaults to: 0)

    the x position of the sprite stack

  • y (Numeric) (defaults to: 0)

    the y position of the sprite stack

  • default_cache (Symbol) (defaults to: :interface)

    the RPG::Cache function to call when setting the bitmap



27
28
29
30
31
32
33
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 27

def initialize(viewport, x = 0, y = 0, default_cache: :interface)
  @viewport = viewport
  @stack = []
  @x = x
  @y = y
  @default_cache = default_cache
end

Instance Attribute Details

#animatedBoolean

>>> Section from Yuki::Sprite <<< If the sprite has a self animation

Returns:

  • (Boolean)


290
291
292
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 290

def animated
  @animated
end

#data

Data used by the sprites of the sprite stack to generate themself



15
16
17
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 15

def data
  @data
end

#movingBoolean

If the sprite is moving

Returns:

  • (Boolean)


293
294
295
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 293

def moving
  @moving
end

#stack (readonly)

Get the stack



17
18
19
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 17

def stack
  @stack
end

#viewportViewport (readonly)

Get the viewport

Returns:



20
21
22
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 20

def viewport
  @viewport
end

#xNumeric

X coordinate of the sprite stack

Returns:

  • (Numeric)


10
11
12
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 10

def x
  @x
end

#yNumeric

Y coordinate of the sprite stack

Returns:

  • (Numeric)


13
14
15
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 13

def y
  @y
end

Instance Method Details

#[](index) ⇒ Sprite, Text

Return an element of the stack

Parameters:

  • index (Integer)

    index of the element in the stack

Returns:



177
178
179
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 177

def [](index)
  @stack[index]
end

#add_background(filename, type: Sprite, rect: nil) ⇒ Sprite Also known as: add_foreground

Push a background image

Parameters:

  • filename (String)

    name of the image in the cache

  • rect (Array, nil) (defaults to: nil)

    the src_rect.set arguments if required

  • type (Class) (defaults to: Sprite)

    the class to use to generate the sprite

Returns:



78
79
80
81
82
83
84
85
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 78

def add_background(filename, type: Sprite, rect: nil)
  sprite = type.new(@viewport)
  sprite.set_position(@x, @y)
  sprite.set_bitmap(filename, @default_cache)
  sprite.src_rect.set(*rect) if rect.is_a?(Array)
  sprite.src_rect = rect if rect.is_a?(Rect)
  return push_sprite(sprite)
end

#add_line(line_index, str, align = 0, outlinesize = Text::Util::DEFAULT_OUTLINE_SIZE, type: Text, color: nil, dx: 0) ⇒ Text

Add a text inside the stack using metrics given by with_surface

Parameters:

  • line_index (Integer)

    index of the line in the surface

  • str (String)

    the text shown by this object

  • align (0, 1, 2) (defaults to: 0)

    the align of the text in its surface (best effort => no resize), 0 = left, 1 = center, 2 = right

  • outlinesize (Integer, nil) (defaults to: Text::Util::DEFAULT_OUTLINE_SIZE)

    the size of the text outline

  • type (Class) (defaults to: Text)

    the type of text

  • color (Integer) (defaults to: nil)

    the id of the color

  • dx (Integer) (defaults to: 0)

    offset x to use “table like” display (this value is multiplied by width)

Returns:

  • (Text)

    the text object



165
166
167
168
169
170
171
172
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 165

def add_line(line_index, str, align = 0, outlinesize = Text::Util::DEFAULT_OUTLINE_SIZE, type: Text, color: nil, dx: 0)
  x = @surface_x + dx * (@surface_width + @surface_offset_width)
  y = @surface_y + line_index * (height = Fonts.line_height(@surface_size_id || @font_id.to_i))
  text = type.new(@font_id.to_i, @viewport, x + @x, y - Text::Util::FOY + @y, @surface_width, height, str, align, outlinesize, color, @surface_size_id)
  text.draw_shadow = outlinesize.nil?
  @stack << text
  return text
end

#add_text(x, y, width, height, str, align = 0, outlinesize = Text::Util::DEFAULT_OUTLINE_SIZE, type: Text, color: nil, sizeid: nil) ⇒ Text

Add a text inside the stack, the offset x/y will be adjusted

Parameters:

  • x (Integer)

    the x coordinate of the text surface

  • y (Integer)

    the y coordinate of the text surface

  • width (Integer)

    the width of the text surface

  • height (Integer, nil)

    the height of the text surface (if nil, uses the line_height from sizeid)

  • str (String)

    the text shown by this object

  • align (0, 1, 2) (defaults to: 0)

    the align of the text in its surface (best effort => no resize), 0 = left, 1 = center, 2 = right

  • outlinesize (Integer, nil) (defaults to: Text::Util::DEFAULT_OUTLINE_SIZE)

    the size of the text outline

  • type (Class) (defaults to: Text)

    the type of text

  • color (Integer) (defaults to: nil)

    the id of the color

Returns:

  • (Text)

    the text object



65
66
67
68
69
70
71
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 65

def add_text(x, y, width, height, str, align = 0, outlinesize = Text::Util::DEFAULT_OUTLINE_SIZE, type: Text, color: nil, sizeid: nil)
  height ||= Fonts.line_height(sizeid || @font_id.to_i)
  text = type.new(@font_id.to_i, @viewport, x + @x, y - Text::Util::FOY + @y, width, height, str, align, outlinesize, color, sizeid)
  text.draw_shadow = outlinesize.nil?
  @stack << text
  return text
end

#anime(arr, delta = 1)

Start an animation

Parameters:

  • arr (Array<Array(Symbol, *args)>)

    Array of message

  • delta (Integer) (defaults to: 1)

    Number of frame to wait between each animation message



328
329
330
331
332
333
334
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 328

def anime(arr, delta = 1)
  @animated = true
  @animation = arr
  @anime_pos = 0
  @anime_delta = delta
  @anime_count = 0
end

#anime_delta_set(v)

Change the time to wait between each animation message

Parameters:



370
371
372
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 370

def anime_delta_set(v)
  @anime_delta = v
end

#dispose

Dispose each sprite of the sprite stack and clear the stack



282
283
284
285
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 282

def dispose
  @stack.each(&:dispose)
  @stack.clear
end

#each(&block)

yield a block on each sprite

Parameters:

  • block (Proc)


276
277
278
279
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 276

def each(&block)
  return @stack.each unless block
  @stack.each(&block)
end

#execute_anime(n)

Note:

this method is used in animation message Array

Force the execution of the n next animation message

Parameters:

  • n (Integer)

    Number of animation message to execute



353
354
355
356
357
358
359
360
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 353

def execute_anime(n)
  @anime_pos += 1
  @anime_pos = 0 if @anime_pos >= @animation.size
  n.times do
    update_animation(true)
  end
  @anime_pos -= 1
end

#move(delta_x, delta_y) ⇒ self

Move the sprite stack

Parameters:

  • delta_x (Numeric)

    number of pixel the sprite stack should be moved in x

  • delta_y (Numeric)

    number of pixel the sprite stack should be moved in y

Returns:

  • (self)


218
219
220
221
222
223
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 218

def move(delta_x, delta_y)
  @x += delta_x
  @y += delta_y
  @stack.each { |sprite| sprite.set_position(sprite.x + delta_x, sprite.y + delta_y) }
  return self
end

#move_to(x, y, nb_frame)

Move the sprite to a specific coordinate in a certain amount of frame

Parameters:

  • x (Integer)

    new x Coordinate

  • y (Integer)

    new y Coordinate

  • nb_frame (Integer)

    number of frame to go to the new coordinate



305
306
307
308
309
310
311
312
313
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 305

def move_to(x, y, nb_frame)
  @moving = true
  @move_frame = nb_frame
  @move_total = nb_frame
  @new_x = x
  @new_y = y
  @del_x = self.x - x
  @del_y = self.y - y
end

#opacityInteger

Gets the opacity of the SpriteStack

Returns:



376
377
378
379
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 376

def opacity
  return 0 unless (sprite = @stack.first)
  return sprite.opacity
end

#opacity=(value)

Sets the opacity of the SpriteStack

Parameters:

  • value (Integer)

    the new opacity value



383
384
385
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 383

def opacity=(value)
  @stack.each { |sprite| sprite.opacity = value if sprite.respond_to?(:opacity=) }
end

#push(x, y, bmp, *args, rect: nil, type: Sprite, ox: 0, oy: 0) ⇒ Sprite Also known as: add_sprite

Push a sprite to the stack

Parameters:

  • x (Numeric)

    the relative x position of the sprite in the stack (sprite.x = stack.x + x)

  • y (Numeric)

    the relative y position of the sprite in the stack (sprite.y = stack.y + y)

  • args (Array)

    the arguments after the viewport argument of the sprite to create the sprite

  • rect (Array, nil) (defaults to: nil)

    the src_rect.set arguments if required

  • type (Class) (defaults to: Sprite)

    the class to use to generate the sprite

  • ox (Numeric) (defaults to: 0)

    the ox of the sprite

  • oy (Numeric) (defaults to: 0)

    the oy of the sprite

Returns:

  • (Sprite)

    the pushed sprite



44
45
46
47
48
49
50
51
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 44

def push(x, y, bmp, *args, rect: nil, type: Sprite, ox: 0, oy: 0)
  sprite = type.new(@viewport, *args)
  sprite.set_position(@x + x, @y + y).set_origin(ox, oy)
  sprite.set_bitmap(bmp, @default_cache) if bmp
  sprite.src_rect.set(*rect) if rect.is_a?(Array)
  sprite.src_rect = rect if rect.is_a?(Rect)
  return push_sprite(sprite)
end

#push_sprite(sprite) ⇒ sprite Also known as: add_custom_sprite

Push a sprite object to the stack

Parameters:

Returns:

  • (sprite)


91
92
93
94
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 91

def push_sprite(sprite)
  @stack << sprite
  return sprite
end

#set_origin(_ox, _oy)

Note:

this function is only for compatibility, it does nothing

Set the origin (does nothing)

Parameters:



229
230
231
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 229

def set_origin(_ox, _oy)
  # Does nothing
end

#set_position(x, y) ⇒ self

Change the x and y coordinate of the sprite stack

Parameters:

  • x (Numeric)

    the new x value

  • y (Numeric)

    the new y value

Returns:

  • (self)


208
209
210
211
212
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 208

def set_position(x, y)
  delta_x = x - @x
  delta_y = y - @y
  return move(delta_x, delta_y)
end

#simple_mouse_in?(mx = Mouse.x, my = Mouse.y) ⇒ Boolean

Detect if the mouse is in the first sprite of the stack

Parameters:

  • mx (Numeric) (defaults to: Mouse.x)

    mouse x coordinate

  • my (Numeric) (defaults to: Mouse.y)

    mouse y coordinate

Returns:

  • (Boolean)


251
252
253
254
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 251

def simple_mouse_in?(mx = Mouse.x, my = Mouse.y)
  return false if @stack.empty?
  return @stack.first.simple_mouse_in?(mx, my)
end

#sizeInteger Also known as: length

Return the size of the stack

Returns:



183
184
185
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 183

def size
  @stack.size
end

#stop_animation

Note:

this method is used in the animation message Array (because animation loops)

Stop the animation



364
365
366
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 364

def stop_animation
  @animated = false
end

#translate_mouse_coords(mx = Mouse.x, my = Mouse.y) ⇒ Array(Numeric, Numeric)

Translate the mouse coordinate to mouse position inside the first sprite of the stack

Parameters:

  • mx (Numeric) (defaults to: Mouse.x)

    mouse x coordinate

  • my (Numeric) (defaults to: Mouse.y)

    mouse y coordinate

Returns:

  • (Array(Numeric, Numeric))


260
261
262
263
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 260

def translate_mouse_coords(mx = Mouse.x, my = Mouse.y)
  return 0,0 if @stack.empty?
  return @stack.first.translate_mouse_coords(mx, my)
end

#update

Update sprite (+move & animation)



295
296
297
298
299
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 295

def update
  update_animation(false) if @animated
  update_position if @moving
  @stack.each { |sprite| sprite.update if sprite.respond_to?(:update) }
end

#update_animation(no_delta)

Update the animation

Parameters:

  • no_delta (Boolean)

    if the number of frame to wait between each animation message is skiped



338
339
340
341
342
343
344
345
346
347
348
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 338

def update_animation(no_delta)
  unless no_delta
    @anime_count += 1
    return if @anime_delta > @anime_count
    @anime_count = 0
  end
  anim = @animation[@anime_pos]
  send(*anim) if anim[0] != :send && anim[0].class == Symbol
  @anime_pos += 1
  @anime_pos = 0 if @anime_pos >= @animation.size
end

#update_position

Update the movement



316
317
318
319
320
321
322
323
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 316

def update_position
  @move_frame -= 1
  @moving = false if @move_frame == 0
  set_position(
    @new_x + (@del_x * @move_frame) / @move_total,
    @new_y + (@del_y * @move_frame) / @move_total
  )
end

#visibleBoolean

Note:

Return the visible property of the first sprite

If the sprite stack is visible

Returns:

  • (Boolean)


236
237
238
239
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 236

def visible
  return false if @stack.empty?
  return @stack.first.visible
end

#visible=(value)

Change the visible property of each sprites

Parameters:

  • value (Boolean)


243
244
245
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 243

def visible=(value)
  @stack.each { |sprite| sprite.visible = value }
end

#with_cache(cache)

Execute push operations with an alternative cache

Examples:

with_cache(:pokedex) { add_background('win_sprite') }

Parameters:

  • cache (Symbol)

    function of RPG::Cache used to load images



102
103
104
105
106
107
108
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 102

def with_cache(cache)
  last_cache = @default_cache
  @default_cache = cache
  yield
ensure
  @default_cache = last_cache
end

#with_font(font_id)

Execute add_text operation with an alternative font

Examples:

with_font(2) { add_text(0, 0, 320, 32, 'Big Text', 1) }

Parameters:

  • font_id (Integer)

    id of the font



115
116
117
118
119
120
121
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 115

def with_font(font_id)
  last_font = @font_id
  @font_id = font_id
  yield
ensure
  @font_id = last_font
end

#with_surface(x, y, unit_width, size_id = 0, offset_width = 2)

Execute add_line with specific metrics info

Examples:

with_surface(x, y, unit_width, size_id) do
  add_line(0, "Centered", 1)
  add_line(1, "Left Red", color: 2)
  add_line(2, "Right Blue", 2, color: 1)
  add_line(0, "Centered on next surface", 1, dx: 1)
end

Parameters:

  • x (Integer)

    X position of the surface

  • y (Integer)

    Y position of the surface

  • unit_width (Integer)

    Width of the line (for alignment and offset x)

  • size_id (Integer) (defaults to: 0)

    Size to use to get the right metrics

  • offset_width (Integer) (defaults to: 2)

    offset between each columns when dx: is used



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 136

def with_surface(x, y, unit_width, size_id = 0, offset_width = 2)
  last_surface_x = @surface_x
  last_surface_y = @surface_y
  last_unit_width = @surface_width
  last_size_id = @surface_size_id
  last_offset_width = @surface_offset_width
  @surface_x = x
  @surface_y = y
  @surface_width = unit_width
  @surface_size_id = size_id
  @surface_offset_width = offset_width
  yield
ensure
  @surface_x = last_surface_x
  @surface_y = last_surface_y
  @surface_width = last_unit_width
  @surface_size_id = last_size_id
  @surface_offset_width = last_offset_width
end

#zNumeric

Gets the z of the SpriteStack

Returns:

  • (Numeric)


389
390
391
392
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 389

def z
  return 0 unless (sprite = @stack.first)
  return sprite.z
end

#z=(value)

Sets the z of the SpriteStack



395
396
397
# File 'scripts/01450 Systems/00000 General/00100 UI Generics/00100 SpriteStack.rb', line 395

def z=(value)
  @stack.each { |sprite| sprite.z = value }
end