• Just a reminder that providing specifics on, sharing links to, or naming websites where ROMs can be accessed is against the rules. If your post has any of this information it will be removed.
  • Our friends from the Johto Times are hosting a favorite Pokémon poll - and we'd love for you to participate! Click here for information on how to vote for your favorites!
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

[Scripting Question] Need Help With Trainer Card

  • 23
    Posts
    9
    Years
    Hi there. I've been trying to solve this problem for the last few days now but I just can't seem to figure it out, so any help would be greatly appreciated.

    I've created an extra scene in the Trainer Card script which contains the badges for the current region. What I want to do is to let the player be able to select each of the smaller badge sprites, so that it displays a larger version along with the trainer sprite of the gym leader who gives the badge.

    So far I've gotten the gym leader and the large badge sprite to appear, but this is where my issue comes in. When switching between the badges, the sprites don't change like they're supposed to, and they always stay the same. Here are the relevant bits of code which try to do this:

    This is where everything is initialized. "@leadernumber" is used to store the integer that corresponds with the gyms (e.g. 0 = 1st gym, 7 = 8th gym). This is used by the methods in the code sections below.
    Code:
    def pbStartScene
        # initialises all the sprites used in the scene
        @sprites={}
        @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
        @viewport.z=99999
        @scene=0
        @leadernumber=0
        
        @sprites["bg"]=AnimatedPlane.new(@viewport)
        @sprites["bg"].bitmap=pbBitmap("Graphics/Pictures/TrainerCard/trainercardbgg")
        
        @sprites["card"]=IconSprite.new(0,0,@viewport)
        @sprites["card"].setBitmap("Graphics/Pictures/TrainerCard/trainercardbg")
        
        @sprites["bg2"]=IconSprite.new(0,0,@viewport)
        @sprites["bg2"].setBitmap("Graphics/Pictures/TrainerCard/trainercardbg2")
        
        @sprites["trainer"]=IconSprite.new(290,61,@viewport)
        @sprites["trainer"].setBitmap(pbPlayerSpriteFile($Trainer.trainertype))
        @sprites["trainer"].zoom_x=4.0; @sprites["trainer"].zoom_y=4.0    
        @totalframe=@sprites["trainer"].bitmap.width/@sprites["trainer"].bitmap.height
      
        realwidth=@sprites["trainer"].bitmap.width/@totalframe
        
        @sprites["trainer"].src_rect.set((@totalframe-1)*realwidth, 0,
        realwidth,@sprites["trainer"].bitmap.height)
        
        @sprites["trainer"].z=2
        
        @sprites["leadersprite"]=DynamicTrainerSprite.new(false,-1,@viewport)
        trainerfile=sprintf("Graphics/Characters/%s",LEADERINFO[0][0])
        @sprites["leadersprite"].setBitmap(trainerfile)
        @sprites["leadersprite"].visible=true
        @sprites["leadersprite"].zoom_x=2.0; @sprites["leadersprite"].zoom_y=2.0 
        @sprites["leadersprite"].z=5
        @sprites["leadersprite"].toLastFrame
        @sprites["leadersprite"].lock
        pbPositionPokemonSprite(@sprites["leadersprite"],276,96)
        
        @sprites["badgeinfo"] = Sprite.new(@viewport)
        @sprites["badgeinfo"].bitmap = Cache.picture("TrainerCard/badgeslarge")
        @sprites["badgeinfo"].x=20; @sprites["badgeinfo"].y=60
        @sprites["badgeinfo"].src_rect.set(0,0,192,192)  
        @sprites["badgeinfo"].visible=false
        @sprites["badgeinfo"].z=4

    This is the method which tries to display the gym leader and large badge sprites. It uses an array to get each trainer sprite, and uses the values of "leaders" and "leader", which stem from "@leadernumber", to determine which one to use.
    Code:
    def pbShowLeaderInfo(leaders)
        leader=leaders.to_i
        @sprites["badgeinfo"].tone=Tone.new(-255,-255,-255,-255)
        @sprites["badgeinfo"].visible=true
        @sprites["leadersprite"].visible=true
        if $Trainer.badges[leaders]
          trainerfile=sprintf("Graphics/Characters/%s",LEADERINFO[leader][0])
          @sprites["leadersprite"].setBitmap(trainerfile)
          @sprites["leadersprite"].toLastFrame
          @sprites["leadersprite"].lock
          @sprites["leadersprite"].visible=true
          @sprites["badgeinfo"].tone=Tone.new(0,0,0,0)
          @sprites["badgeinfo"].src_rect.set(leader*192,0,192,192) 
          @sprites["badgeinfo"].visible=true
        end
      end

    This code was added in the Settings script section. This is where pbShowLeaderInfo gets the trainer sprite information.
    Code:
    LEADERINFO = [
    ["trainer059", "Boulder Badge","Leader: Brock"],
    ["trainer060", "Cascade Badge","Leader: Misty"],
    ["trainer061", "Thunder Badge","Leader: Lt. Surge"],
    ["trainer062", "Rainbow Badge","Leader: Erika"],
    ["trainer063", "Soul Badge","Leader: Koga"],
    ["trainer064", "Marsh Badge","Leader: Sabrina"],
    ["trainer065", "Volcano Badge","Leader: Blaine"],
    ["trainer066", "Earth Badge","Leader: Giovanni"],
    ]

    And this contains all the input methods. Every time either Left or Right is pressed on the keyboard, the value of "@leadernumber" is changed by 1 unless specified otherwise. Then pbShowLeaderInfo is run each time to check for any changes.
    Code:
    def pbTrainerCard
        loop do
          Graphics.update
          Input.update
          self.update
          if @scene==1 && @leadernumber>=0
              pbShowLeaderInfo(@leadernumber)
            elsif @scene==1 && @leadernumber<=7
              pbShowLeaderInfo(@leadernumber)
          end
          if @scene==1 && Input.trigger?(Input::RIGHT)
            @leadernumber+=1
            if @sprites["badgebutton"].x==267 && Input.trigger?(Input::RIGHT)
              @sprites["badgebutton"].x+=0
              pbShowLeaderInfo(@leadernumber)
            else
              pbPlayDecisionSE()
              @sprites["badgebutton"].x+=36
              pbShowLeaderInfo(@leadernumber)
            end
          end
          if @scene==1 && Input.trigger?(Input::LEFT)
            @leadernumber-=1
            if @sprites["badgebutton"].x==15 && Input.trigger?(Input::LEFT)
              @sprites["badgebutton"].x-=0
              pbShowLeaderInfo(@leadernumber)
            else
              pbPlayDecisionSE()
              @sprites["badgebutton"].x-=36
              pbShowLeaderInfo(@leadernumber)
            end
          end

    This method is based off of the one used in the BW Essentials Kit in the same script sections. Obviously it works there, so you could read through the same scripts to get an understanding there.

    A snapshot of what it should look like visually is attached.
     

    Attachments

    • [PokeCommunity.com] Need Help With Trainer Card
      trainercardhelp.png
      20.8 KB · Views: 9
    I'll answer your question, but first let me point out some flaws or improvements to make on your script, first. Or, if you'd like to ignore them, scroll to the bottom of my post for the answer.

    Code:
    def pbTrainerCard
        loop do
          Graphics.update
          Input.update
          self.update
          if @scene==1 && @leadernumber>=0
              pbShowLeaderInfo(@leadernumber)
            elsif @scene==1 && @leadernumber<=7
              pbShowLeaderInfo(@leadernumber)
          end
          if @scene==1 && Input.trigger?(Input::RIGHT)
            @leadernumber+=1
            [COLOR="red"]if @sprites["badgebutton"].x==267 && Input.trigger?(Input::RIGHT)
              @sprites["badgebutton"].x+=0
              pbShowLeaderInfo(@leadernumber)
            else[/COLOR]
              pbPlayDecisionSE()
              @sprites["badgebutton"].x+=36
              pbShowLeaderInfo(@leadernumber)
            end
          end
          if @scene==1 && Input.trigger?(Input::LEFT)
            @leadernumber-=1
            [COLOR="red"]if @sprites["badgebutton"].x==15 && Input.trigger?(Input::LEFT)
              @sprites["badgebutton"].x-=0
              pbShowLeaderInfo(@leadernumber)
            else[/COLOR]
              pbPlayDecisionSE()
              @sprites["badgebutton"].x-=36
              pbShowLeaderInfo(@leadernumber)
            end
          end

    Why are you checking for input twice?

    Also, why are you doing @sprites["badgebutton"]+/-=0 ? This makes absolutely no sense and it just adds extra unnecessary code.

    you can simply check "if @sprites["badgebutton"].x != 15" (for example) instead. Which leads me to another question: Why are you checking on terms of image location instead of index value? Because if you happen to change the positions later on, or if you happened to make a mistake in locations, it could mess to fix.

    Instead check for "if @leadernumber > 0" or "if @leadernumber < 7"

    Code:
    def pbShowLeaderInfo(leaders)
        [COLOR="red"]leader=leaders.to_i[/COLOR]
        @sprites["badgeinfo"].tone=Tone.new(-255,-255,-255,-255)
        @sprites["badgeinfo"].visible=true
        @sprites["leadersprite"].visible=true
        [COLOR="Red"]if $Trainer.badges[leaders][/COLOR]
          trainerfile=sprintf("Graphics/Characters/%s",LEADERINFO[leader][0])
          @sprites["leadersprite"].setBitmap(trainerfile)
          @sprites["leadersprite"].toLastFrame
          @sprites["leadersprite"].lock
          @sprites["leadersprite"].visible=true
          @sprites["badgeinfo"].tone=Tone.new(0,0,0,0)
          @sprites["badgeinfo"].src_rect.set(leader*192,0,192,192) 
          @sprites["badgeinfo"].visible=true
        end
      end

    Also, why are you converting an integer to an integer? Also, why is it that a few lines below that you're using the non converted value?


    Finally, to actually answer your question, you have never set @scene to 1, which is what all inputs are checking against.
     
    I'll answer your question, but first let me point out some flaws or improvements to make on your script, first. Or, if you'd like to ignore them, scroll to the bottom of my post for the answer.



    Why are you checking for input twice?

    Also, why are you doing @sprites["badgebutton"]+/-=0 ? This makes absolutely no sense and it just adds extra unnecessary code.

    you can simply check "if @sprites["badgebutton"].x != 15" (for example) instead. Which leads me to another question: Why are you checking on terms of image location instead of index value? Because if you happen to change the positions later on, or if you happened to make a mistake in locations, it could mess to fix.

    Instead check for "if @leadernumber > 0" or "if @leadernumber < 7"



    Also, why are you converting an integer to an integer? Also, why is it that a few lines below that you're using the non converted value?


    Finally, to actually answer your question, you have never set @scene to 1, which is what all inputs are checking against.

    Well to be perfectly honest I'm still getting the hang of Ruby and RGSS. There's a lot of unnecessary junk code because I was using the script section to mess around with it, seeing what works and what doesn't, but I've taken your suggestions into account and implemented those changes.

    I checked on terms of image location because.. well... I have no clue on how index values work :( I've tried having a look at the Bag script section to do some research but couldn't get my head around them. Plus, until recently, I didn't have a lot of time to delve in.

    I have actually set @scene to 1, but in my initial post I only included parts of the script section which I thought were important to look at. Thinking back it would be easier to just show the entire script instead, which is what I'll do:

    Code:
    class PokemonTrainerCardScene
      def update
        pbUpdateSpriteHash(@sprites)
        # allows the background to scroll continously.
        @sprites["bg"].oy -= 0.4
      end
    
      def pbStartScene
        # initialises all the sprites used in the scene
        @sprites={}
        @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
        @viewport.z=99999
        @scene=0
        @leadernumber=0
        
        @sprites["bg"]=AnimatedPlane.new(@viewport)
        @sprites["bg"].bitmap=pbBitmap("Graphics/Pictures/TrainerCard/trainercardbgg")
        
        @sprites["card"]=IconSprite.new(0,0,@viewport)
        @sprites["card"].setBitmap("Graphics/Pictures/TrainerCard/trainercardbg")
        
        @sprites["bg2"]=IconSprite.new(0,0,@viewport)
        @sprites["bg2"].setBitmap("Graphics/Pictures/TrainerCard/trainercardbg2")
        
        @sprites["trainer"]=IconSprite.new(290,61,@viewport)
        @sprites["trainer"].setBitmap(pbPlayerSpriteFile($Trainer.trainertype))
        @sprites["trainer"].zoom_x=4.0; @sprites["trainer"].zoom_y=4.0    
        @totalframe=@sprites["trainer"].bitmap.width/@sprites["trainer"].bitmap.height
      
        realwidth=@sprites["trainer"].bitmap.width/@totalframe
        
        @sprites["trainer"].src_rect.set((@totalframe-1)*realwidth, 0,
        realwidth,@sprites["trainer"].bitmap.height)
        
        @sprites["trainer"].z=2
        
        @sprites["leadersprite"]=DynamicTrainerSprite.new(false,-1,@viewport)
        trainerfile=sprintf("Graphics/Characters/%s",LEADERINFO[0][0])
        @sprites["leadersprite"].setBitmap(trainerfile)
        @sprites["leadersprite"].visible=true
        @sprites["leadersprite"].zoom_x=2.0; @sprites["leadersprite"].zoom_y=2.0 
        @sprites["leadersprite"].z=5
        @sprites["leadersprite"].toLastFrame
        @sprites["leadersprite"].lock
        pbPositionPokemonSprite(@sprites["leadersprite"],276,96)
        
        @sprites["badgeinfo"] = Sprite.new(@viewport)
        @sprites["badgeinfo"].bitmap = Cache.picture("TrainerCard/badgeslarge")
        @sprites["badgeinfo"].x=20; @sprites["badgeinfo"].y=60
        @sprites["badgeinfo"].src_rect.set(0,0,192,192)  
        @sprites["badgeinfo"].visible=false
        @sprites["badgeinfo"].z=4
        
        @sprites["badgebutton"]= Sprite.new(@viewport)
        @sprites["badgebutton"].bitmap = Cache.picture("TrainerCard/badgecursor")
        @sprites["badgebutton"].x=15; @sprites["badgebutton"].y=21
        @sprites["badgebutton"].src_rect.set(0,0,32,32)
        @sprites["badgebutton"].visible=false
        @sprites["badgebutton"].z=5
        # sets the viewport the sprites will be drawn in
        @sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
        # sets the font the scene will use
        pbSetSystemFont(@sprites["overlay"].bitmap)
        
        pbDrawTrainerCardFront
        if $PokemonGlobal.trainerRecording
          $PokemonGlobal.trainerRecording.play
        end
        pbFadeInAndShow(@sprites) { update }
      end
    
      def pbDrawTrainerCardFront
        # draws the first scene
        @scene=0
        @sprites["card"].visible=true
        @sprites["bg"].visible=true
        @sprites["bg2"].visible=false
        @sprites["trainer"].visible=true
        @sprites["leadersprite"].visible=false
        @sprites["badgeinfo"].visible=false
        @sprites["badgebutton"].visible=false
        
        overlay=@sprites["overlay"].bitmap
        overlay.clear
        
        totalsec = Graphics.frame_count / Graphics.frame_rate
        hour = totalsec / 60 / 60
        min = totalsec / 60 % 60
        time=_ISPRINTF("{1:02d}:{2:02d}",hour,min)
        $PokemonGlobal.startTime=pbGetTimeNow if !$PokemonGlobal.startTime
        starttime=_ISPRINTF("{1:s} {2:d}, {3:d}",
           pbGetAbbrevMonthName($PokemonGlobal.startTime.mon),
           $PokemonGlobal.startTime.day,
           $PokemonGlobal.startTime.year)
        pubid=sprintf("%05d",$Trainer.publicID($Trainer.id))
        textPositions=[
           [_INTL("Name:"),20,20,0,Color.new(30,86,191)],
           [_INTL("{1}",$Trainer.name),150,20,1,Color.new(255,255,255)],
           [_INTL("ID No.:"),254,20,0,Color.new(149,228,255)],
           [_INTL("{1}",pubid),410,20,1,Color.new(255,255,255)],
           [_INTL("Money:"),20,110,0,Color.new(149,228,255)],
           [_INTL("${1}",$Trainer.money),204,110,1,Color.new(255,255,255)],
           [_INTL("Poke Miles:"),20,148,0,Color.new(149,228,255)],
           [_INTL("Battle Points:"),20,184,0,Color.new(149,228,255)],
           [_INTL("Play time:"),20,236,0,Color.new(149,228,255)],
           [time,218,236,1,Color.new(255,255,255)],
           [_INTL("Adventure started:"),20,274,0,Color.new(149,228,255)],
           [starttime,362,274,1,Color.new(255,255,255)],
           [_INTL("First Hall of Fame:"),20,310,0,Color.new(149,228,255)]
        ]
        if $Trainer.pokedex
        textPositions.push([_INTL("National Pokédex:"),20,74,0,Color.new(149,228,255)])
        textPositions.push([_ISPRINTF("{1:d}",$Trainer.pokedexOwned),
        234,74,1,Color.new(255,255,255)])
        end
        pbDrawTextPositions(overlay,textPositions)
      end
      
      def pbDrawTrainerCardBadges
        # draws the second scene with the badges
        @scene=1
        
        overlay=@sprites["overlay"].bitmap
        overlay.clear
        
        @sprites["card"].visible=false
        @sprites["bg"].visible=false
        @sprites["bg2"].visible=true
        @sprites["trainer"].visible=false
        @sprites["badgebutton"].visible=true
        
        totalsec = Graphics.frame_count / Graphics.frame_rate
        hour = totalsec / 60 / 60
        min = totalsec / 60 % 60
        time=_ISPRINTF("{1:02d}:{2:02d}",hour,min)
        $PokemonGlobal.startTime=pbGetTimeNow if !$PokemonGlobal.startTime
        starttime=_ISPRINTF("{1:s} {2:d}, {3:d}",
           pbGetAbbrevMonthName($PokemonGlobal.startTime.mon),
           $PokemonGlobal.startTime.day,
           $PokemonGlobal.startTime.year)
        pubid=sprintf("%05d",$Trainer.publicID($Trainer.id))
        baseColor=Color.new(255,255,255)
        shadowColor=Color.new(181,189,206)
        
        x=15
        region=pbGetCurrentRegion(0) # Get the current region
        imagePositions=[]
        for i in 0...8
          imagePositions.push(["Graphics/Pictures/TrainerCard/badgesempty",x,15,i*32,region*32,32,32])
          if $Trainer.badges[i+region*8]
            imagePositions.push(["Graphics/Pictures/TrainerCard/badges",x,15,i*32,region*32,32,32])
          end
          x+=36
        end
        
        pbDrawImagePositions(overlay,imagePositions)
      end
      
      def pbShowLeaderInfo(leaders)
        @sprites["badgeinfo"].tone=Tone.new(-255,-255,-255,-255)
        @sprites["badgeinfo"].visible=true
        @sprites["leadersprite"].visible=true
        if $Trainer.badges[leaders]
          trainerfile=sprintf("Graphics/Characters/%s",LEADERINFO[leaders][0])
          @sprites["leadersprite"].setBitmap(trainerfile)
          @sprites["leadersprite"].toLastFrame
          @sprites["leadersprite"].lock
          @sprites["leadersprite"].visible=true
          @sprites["badgeinfo"].tone=Tone.new(0,0,0,0)
          @sprites["badgeinfo"].src_rect.set(leaders*192,0,192,192) 
          @sprites["badgeinfo"].visible=true
        end
      end
    
      def pbTrainerCard
        loop do
          Graphics.update
          Input.update
          self.update
          if @scene==1 && @leadernumber>=0
              pbShowLeaderInfo(@leadernumber)
            elsif @scene==1 && @leadernumber<=7
              pbShowLeaderInfo(@leadernumber)
          end
          if @scene==1 && Input.trigger?(Input::RIGHT)
            @leadernumber+=1
            if @sprites["badgebutton"].x != 267
              pbPlayDecisionSE()
              @sprites["badgebutton"].x+=36
              pbShowLeaderInfo(@leadernumber)
            else
              pbShowLeaderInfo(@leadernumber)
            end
          end
          if @scene==1 && Input.trigger?(Input::LEFT)
            @leadernumber-=1
            if @sprites["badgebutton"].x != 15
              pbPlayDecisionSE()
              @sprites["badgebutton"].x-=36
              pbShowLeaderInfo(@leadernumber)
            else
              pbShowLeaderInfo(@leadernumber)
            end
          end
          
          if Input.trigger?(Input::C) && @scene==0
            pbPlayDecisionSE()
            pbDrawTrainerCardBadges
            pbShowLeaderInfo(@leadernumber)
          end
          if Input.trigger?(Input::B)
            if @scene==1
              pbPlayCancelSE()
              pbDrawTrainerCardFront
            else
              pbPlayCancelSE()
              break
            end
          end
        end 
      end
    
      def pbEndScene
        pbFadeOutAndHide(@sprites) { update }
        pbDisposeSpriteHash(@sprites)
        @viewport.dispose
      end
    end
    
    
    
    class PokemonTrainerCard
      def initialize(scene)
        @scene=scene
      end
    
      def pbStartScreen
        @scene.pbStartScene
        @scene.pbTrainerCard
        @scene.pbEndScene
      end
    end
     
    Code:
      def pbTrainerCard
        loop do
          Graphics.update
          Input.update
          self.update
    	  
          [COLOR="Red"]#I do not believe that the below 3 lines are necessary, but they are there for reference
           #if @scene==1 && @leadernumber>=0 && @leadernumber <= 7
              #pbShowLeaderInfo(@leadernumber)
          #end
    	  
          if @scene==1 && Input.trigger?(Input::RIGHT) && @leadernumber < 7
            @leadernumber+=1
    	    pbPlayDecisionSE()
    	    @sprites["badgebutton"].x+=36
    	    pbShowLeaderInfo(@leadernumber)
          elsif @scene==1 && Input.trigger?(Input::LEFT) && @leadernumber > 0
            @leadernumber-=1
            pbPlayDecisionSE()
            @sprites["badgebutton"].x-=36
            pbShowLeaderInfo(@leadernumber)
          end[/COLOR]
          
          if Input.trigger?(Input::C) && @scene==0
            pbPlayDecisionSE()
            pbDrawTrainerCardBadges
            pbShowLeaderInfo(@leadernumber)
          end
    	  
          if Input.trigger?(Input::B)
            if @scene==1
              pbPlayCancelSE()
              pbDrawTrainerCardFront
            else
              pbPlayCancelSE()
              break
            end
          end
        end 
      end

    I made some changes marked in red. Although, I cannot guarantee that it'll work as I did not test it, but I think I pinpointed the error though. I did optimize the code a bit as well.
     
    Back
    Top