Navigation

    Fuze Arena Logo
    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Popular
    • Users
    • Groups
    • Help
    • Discord

    Typewriter Effect Text

    Coding
    6
    15
    923
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Juggalo_Jesus
      Juggalo_Jesus @pianofire last edited by

      @pianofire no, like an animated effect displaying it letter by letter instead of just printing the entire line out all at once. You see this effect used in a lot of games and I am using the Legend of Zelda: Ocarina of Time to show you what I mean.

      pianofire 1 Reply Last reply Reply Quote 0
      • pianofire
        pianofire Fuze Team @Juggalo_Jesus last edited by

        @Juggalo_Jesus OK understood. There is nothing built-in but it shouldn't be too hard to write a function to do this.

        Juggalo_Jesus 1 Reply Last reply Reply Quote 1
        • Juggalo_Jesus
          Juggalo_Jesus @pianofire last edited by

          @pianofire I am going to try my hand at it soon I was just wondering if anyone had figured it out before I spend my time on trying to figure it out.

          1 Reply Last reply Reply Quote 1
          • pobtastic
            pobtastic F last edited by pobtastic

            It's really just a case of setting a "cached" variable and ticking it upwards every x frame. I've not done this specifically but I guess it's similar enough to other things I've written. Something like;

            frame_count = 0
            string = "Really looking forward to playing Steve's Missile Command game"
            tick = 0
            
            loop
              clear()
              printat(0, 0, string[:tick])
              if frame_count % 20 == 0 then
                // Or however you want to do it?
                // This would (hopefully) just cycle it round to zero again
                // but you'd obviously continue on rather than pause here.
                tick = (tick + 1) % len(str)
              endif
              update()
              frame_count += 1
            repeat
            

            Obviously that's completely untested!

            1 Reply Last reply Reply Quote 2
            • lawyerlounge
              lawyerlounge last edited by

              what is the colon before "tick" for?

              printAt(0, 0, string[:tick])
              

              Also, what and how is % used?

              Thankyou!

              pianofire 1 Reply Last reply Reply Quote 1
              • pobtastic
                pobtastic F last edited by pobtastic

                Okay, I just tested it and meh ~ use this instead;

                frame_count = 0
                string = "Really looking forward to playing Steve's Missile Command game"
                tick = 0
                proceed = false
                
                while !proceed loop
                  clear()
                  printat(0, 0, string[:tick])
                  if frame_count % 20 == 0 then
                    tick += 1
                    if tick == len(string) then
                      proceed = true
                    endif
                  endif
                  update()
                  frame_count += 1
                repeat
                

                It was close enough :)

                edit: See https://fuzearena.com/forum/topic/70/hints-and-tips/9

                Juggalo_Jesus 1 Reply Last reply Reply Quote 1
                • pianofire
                  pianofire Fuze Team @lawyerlounge last edited by pianofire

                  @lawyerlounge Have a look at this post to see how you can slice up strings using : https://fuzearena.com/forum/topic/70/hints-and-tips/9

                  % is the modulus operator which basically returns the remainder when you divide by the number see https://fuzearena.com/help/view/modulus

                  1 Reply Last reply Reply Quote 2
                  • pobtastic
                    pobtastic F last edited by pobtastic

                    Oop! Thanks, I missed the question about the %! The good thing about doing it by frame skipping, is that you can then also add controls in there too, and just or a button press which would speed up the "typing".

                    1 Reply Last reply Reply Quote 2
                    • lawyerlounge
                      lawyerlounge last edited by

                      Ok neat I think I understand now. The modulo operation is used to only run this loop when frame_count is a number divisible by 20 with no remainder. so it will print a new letter every 20 frames? so you could even have a button press to have frame_count += 10 to speed up the text.

                      Also when you have
                      Loop
                      clear()
                      update()
                      repeat
                      how many times does that run per second, is it 60fps?

                      1 Reply Last reply Reply Quote 2
                      • Juggalo_Jesus
                        Juggalo_Jesus @pobtastic last edited by

                        @pobtastic Thank you for this!

                        1 Reply Last reply Reply Quote 0
                        • Martin
                          Martin Fuze Team last edited by

                          The above (% on the number of frames) is how I've always done this kind of thing, but I think this might be the first instance where I might be tempted to try and use a timer instead?

                          1 Reply Last reply Reply Quote 1
                          • Martin
                            Martin Fuze Team last edited by Martin

                            How about this?

                            string message = "Really looking forward to playing Steve's Missile Command game"
                            tick = 0
                            speed = 0.25
                            
                            // Call function 'doTick' every 'speed' seconds, indefinitely
                            tickTimer = setTimer(speed, -1, doTick())
                            
                            loop
                                clear()
                                printat(0, 0, message[:tick])
                                update()
                            repeat
                            
                            function doTick()
                                tick += 1
                                if (tick >= len(message)) then tick = 0 endif
                            return void
                            

                            Nearly always lots of ways to approach the same thing. Usually all just as valid.

                            1 Reply Last reply Reply Quote 5
                            • SteveZX81
                              SteveZX81 F last edited by

                              Thanks for that, I just ..borrowed it..

                              1 Reply Last reply Reply Quote 1
                              • First post
                                Last post