RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
how to use sprite.zoom_x in battle?

0 Members and 3 Guests are viewing this topic.

***
Rep:
Level 82
We learn by living...
Say I want to make  my sprite.zoom_x = 80, and sprite.zoom_y = 80,

but I'm trying to trigger this effect during the time that battle is loading, or anywhere else, such as a "shrink" spell or something. What do I have to replace "sprite" with what would normally be "self" in Game_Actor and Game_Enemy classes? There appears to be no bitmap/sprite access in Game_Actor and Game_Enemy.



edit: updated for specificity.
« Last Edit: June 18, 2011, 04:24:18 AM by shintashi »

**
Rep:
Level 82
It is because RMXP is poorly stuctured in this way. It is my biggest bitch about the scripts that it is so hard to access the sprites in relation to the proper character instance that they represent.

All character sprites are found in ther @character_sprites array in Spriteset_Map, or with Spriteset_Battle, whatever your case (I think its @battler_sprites in Spriteset_Battle). Spriteset_Map is initialized through Scene_Map. It reads all the character instances from Game_Map, and uses the string name of their graphic to load the bitmap.

Probably easiest down and dirty way to get at them is to add a "attr_accessor :spriteset" to  Scene_Map, and a "attr_accessor :character_sprites" to Spriteset_Map.  From there you can get at them and change them with $scene.spriteset.character_sprites[INDEX].ZOOM or whatever method you want.  This is not the ideal way to do this, but it works. You can create an abbreviated call for it if you want, as well.

***
Rep:
Level 82
We learn by living...
It is because RMXP is poorly stuctured in this way. It is my biggest bitch about the scripts that it is so hard to access the sprites in relation to the proper character instance that they represent.

All character sprites are found in ther @character_sprites array in Spriteset_Map, or with Spriteset_Battle, whatever your case (I think its @battler_sprites in Spriteset_Battle). Spriteset_Map is initialized through Scene_Map. It reads all the character instances from Game_Map, and uses the string name of their graphic to load the bitmap.

Probably easiest down and dirty way to get at them is to add a "attr_accessor :spriteset" to  Scene_Map, and a "attr_accessor :character_sprites" to Spriteset_Map.  From there you can get at them and change them with $scene.spriteset.character_sprites[INDEX].ZOOM or whatever method you want.  This is not the ideal way to do this, but it works. You can create an abbreviated call for it if you want, as well.

This is definitely being used for Spriteset_Battle
Which I think is pulling from Sprite_Battler

I am considering your idea of using an attr_accessor :spriteset to something, but I'm going to guess it belongs in Spriteset_Battler, and possibly in Scene_Battle1-4, but that seems like actually more work than should be necessary to make it all happen?

***
Rep:
Level 82
We learn by living...
Ok, so as soon as I attempted to import this stuff into game enemy

Code: [Select]
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)

it immediately pointed out it didn't recognize 'bitmap'. If I could figure out where the enemy's stat sheet is married to the enemy's sprite, then I could do something, but I'm at a loss. I don't see any correlation. I guess I will have to go back to my dummy events that spit out all the data on a print request and hope something makes sense soon.

*****
Rep:
Level 84
This text is way too personal.
Bronze - GIAW 11 (Hard)Silver - GIAW Halloween
You have to access stuff like zoom_x and zoom_y through Sprite_Battler (or enemy or whatever it is in RPG Maker XP), and change it by changing the values in Game_Enemy.

***
Rep:
Level 82
We learn by living...
You have to access stuff like zoom_x and zoom_y through Sprite_Battler (or enemy or whatever it is in RPG Maker XP), and change it by changing the values in Game_Enemy.

could you get an example of the syntax used? I keep getting errors.

I've tried things like making attr accessors in Sprite_Battler and then using @zoom_x = 50 in Game_Enemy, but I must have done something wrong, because it didn't work.
« Last Edit: June 18, 2011, 05:06:18 PM by shintashi »

*****
Rep:
Level 84
This text is way too personal.
Bronze - GIAW 11 (Hard)Silver - GIAW Halloween
Do the opposite. Make attr_accessors in Game_Enemy for zoom_x and then in the update method of Sprite_Battler check if @battler is a Game_Enemy, then write self.zoom_x = @battler.zoom_x.

***
Rep:
Level 82
We learn by living...
So first I put in the self.zoom in the update of sprite_battler (see bottom of code):

Code: [Select]
  def update
    super
    # If battler is nil
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    # If file name or hue are different than current ones
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      # Get and set bitmap
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      if @battler.is_a?(Game_Enemy)
      self.zoom_x = @battler.zoom_x
      end



then I've got the attr_accessor and  @zoom_x = zoom_x  in Game Enemy:

Code: [Select]
class Game_Enemy < Game_Battler
  attr_accessor :coz_moving_x             # x coordinate
  attr_accessor :coz_moving_y             # y coordinate
  attr_accessor :zoom_x                   # x zoom
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     troop_id     : troop ID
  #     member_index : troop member index
  #--------------------------------------------------------------------------
  def initialize(troop_id, member_index)
    super()
    @troop_id = troop_id
    @member_index = member_index
    troop = $data_troops[@troop_id]
    @enemy_id = troop.members[@member_index].enemy_id
    enemy = $data_enemies[@enemy_id]
    @battler_name = enemy.battler_name
    @battler_hue = enemy.battler_hue
    @hp = maxhp
    @sp = maxsp
    @hidden = troop.members[@member_index].hidden
    @immortal = troop.members[@member_index].immortal
    @coz_moving_x = 0
    @coz_moving_y = 0
    @zoom_x = zoom_x
  end

and finally I'm trying to call it as simple as possible here in def screen_x of Game_Enemy:

Code: [Select]
def screen_x
    @zoom_x = 20

Nothing happens. Clearly I'm doing something wrong.

*****
Rep:
Level 84
This text is way too personal.
Bronze - GIAW 11 (Hard)Silver - GIAW Halloween
Updating screen_x doesn't update zoom_x as far I as know. You'll have to access it through the $game_troop array. Try changing the initial value of zoom_x, and see if that works first.

***
Rep:
Level 82
We learn by living...
Updating screen_x doesn't update zoom_x as far I as know. You'll have to access it through the $game_troop array. Try changing the initial value of zoom_x, and see if that works first.

ok, i figured out two things:

1. My data is being read from SDK II: Sprite Battler

so I added it here:
Code: [Select]
  def redraw_battler
    if @battler.battler_name != @battler_name or
        @battler.battler_hue != @battler_hue
      # Get and set bitmap
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
    if @battler.is_a?(Game_Enemy) #added by shintashi
      self.zoom_x = @battler.zoom_x
      #self.mirror = true
    end

That's when I ran into a problem:

Whatever    @zoom_x is set to in Game_Enemy during initialization, is what it stays. Right now I've got it set for @zoom_x = 1, if I set to @zoom_x = 2, my icon gets fat and @zoom_x = 0.8 makes my icon skinny. That's what I want to be able to do, but I need to be able to do it outside of initialization. Is this "doesn't update" thing what you meant by $game_troop array?


*****
Rep:
Level 84
This text is way too personal.
Bronze - GIAW 11 (Hard)Silver - GIAW Halloween
Code: [Select]
  def update
    super
    # If battler is nil
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    # If file name or hue are different than current ones
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      # Get and set bitmap
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
    end
    if @battler.is_a?(Game_Enemy)
        self.zoom_x = @battler.zoom_x
    end
end

You misplaced the if @battler.is_a?(Game_Enemy); self.zoom_x = @battler.zoom_x; end part. This means it will only refresh if the characters hue or name is changed because of the if statement.
« Last Edit: June 19, 2011, 01:08:43 AM by cozziekuns »

***
Rep:
Level 82
We learn by living...
so I figured out one way of doing it, without using an attr accessor:

Code: [Select]
      case @battler.index
      when 0
        self.zoom_x = 0.85
        self.zoom_y = 0.85
      when 1
        self.zoom_x = 0.9
        self.zoom_y = 0.9
      when 2
        self.zoom_x = 0.95
        self.zoom_y = 0.95
      when 3
        self.zoom_x = 1
        self.zoom_y = 1
      when 4
        self.zoom_x = 0.85
        self.zoom_y = 0.85
      when 5
        self.zoom_x = 0.9
        self.zoom_y = 0.9
      when 6
        self.zoom_x = 0.95
        self.zoom_y = 0.95
      when 7
        self.zoom_x = 1
        self.zoom_y = 1
        end

This causes the sprites to shrink as they get further away from the bottom of the screen (i.e. perspective). I plan on using the mirror effect for creating an "if surprised" effect, then I can give characters different levels of surprise resistance. 'm thinking surprised characters would probably be at an agility penalty for purposes of initiative -our family was watching Matrix last night (rerun) and it occurred to me a very fast person would be at a penalty, but not completely unable to react.

This of course doesn't mean I've figured out how to change it under the influence of a spell or future action, however.
« Last Edit: June 19, 2011, 01:17:06 AM by shintashi »