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.
    • pianofire
      pianofire Fuze Team @Juggalo_Jesus last edited by

      @Juggalo_Jesus Do you mean like a typewriter font?

      Juggalo_Jesus 1 Reply Last reply Reply Quote 1
      • 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