Hi, I have a small black outline around my text in my game, but it doesn't show up in the text that uses your kinetic texts. Do you know how I can make that text match the text from the rest of my game? Sorry if this is a silly question, but thank you so much for this amazing code!
No, I've never directly made an effect like that, but with my setup, it wouldn't be hard to make one if you know what you want and have some coding experience. Could maybe make one if you need though, but currently busy with another project so can't promise anything for a bit if you need it right now.
I do have coding experience. Mostly Java though. Haven’t really worked with Ren’Py, until now. I did make a function that randomizes text. Not sure how I would go about integrating that into your code to randomize the characters to do the revealing text animation.
Mostly just would be having it so the letters keep some kind timer, randomly going through characters until the timer hits zero and then just shows the actual letter. Though if you do need me to do it I'll note it down and let you know when I can get to it later.
Hi new ren'Py user here, I was wondering how i would go to make an effect similar to this but instead changes the font as its being written out? Been trying to make it on my own but to no avail, I don't understand custom text tags enough. Basically font swap for every letter one after the other but only once, kinda like a live translator.
Hihi, new renpy user here, I was wondering if there is a way to adjust the speed of the effects? I'm currently using the glitching text but it goes a bit fast for the atmosphere I want it in... is there any way to make the glitching slower, not just the cps?
You can probably have the glitch go slower but changing the redraw time. Maybe something like 1./30 instead of 0 if you just want it at 30 fps or just .2 or something if you need it slower. It'll be the renpy.redraw(self,[new number here]) bit.
These text effects are fantastic, they've been a game changer for my VN work this year and have helped me capture a lot more fun expressiveness, so thanks so much for your work on this.
I'm actually wondering about the last example GIF you post, showing dripping text -- the way it's bouncing is unlike anything I've replicated so far, do you happen to know how to achieve that type of bounce?
# Example shader for vertical gradients
init python:
renpy.register_shader("example.gradient", variables="""
uniform vec4 u_gradient_color_1;
uniform vec4 u_gradient_color_2;
uniform vec2 u_model_size;
varying float v_gradient_done;
attribute vec4 a_position;
""", vertex_300="""
v_gradient_done = a_position.y / u_model_size.y;
""", fragment_300="""
float gradient_done = v_gradient_done;
gl_FragColor *= mix(u_gradient_color_1, u_gradient_color_2, gradient_done);
""")
# Transform that applies the gradient
transform gradientTransform:
shader "example.gradient"
u_gradient_color_1 (1.0, 1.0, 1.0, 1.0) # Formatted rgba (1.0 is equivalent to 255)
u_gradient_color_2 (1.0, 1.0, 0.0, 1.0) # The two colors in the example are white and yellow
# Color is applied manually meaning you cannot change it in text tags sadly
# This block creates the tag and applies it to text
init python:
def gradient_tag(tag, argument, contents):
return [(renpy.TEXT_DISPLAYABLE, At(Text(text), gradientTransform())) for _,text in contents]
config.custom_text_tags["Vgradient"] = gradient_tag
# script.rpy
label start:
show eileen happy
e "This text is normal. {Vgradient}This text is yellow.{/Vgradient}"
show elieen happy at gradientTransform
e "You can also apply the gradient over sprites!"
the result should look something like this
there are some draw backs to this approach such as text outlines not working and requiring predetermined gradients rather than defining them in the text tag
if you have multiple vertical gradients you need displayed, you can always try this:
# Well create two custom transforms for different colors
transform gradientRedBlue:
shader "example.gradient"
u_gradient_color_1 (1.0, 0.0, 0.0, 1.0) # Red
u_gradient_color_2 (0.0, 0.0, 1.0, 1.0) # Blue
transform gradientPinkWhite:
shader "example.gradient"
u_gradient_color_1 (1.0, 0.5, 0.7, 1.0) # Pink
u_gradient_color_2 (1.0, 1.0, 1.0, 1.0) # White
# This block creates the tag and applies it to text
init python:
def red_blue_gradient(tag, argument, contents):
return [(renpy.TEXT_DISPLAYABLE, At(Text(text), gradientRedBlue())) for _,text in contents]
def pink_white_gradient(tag, argument, contents):
return [(renpy.TEXT_DISPLAYABLE, At(Text(text), gradientPinkWhite())) for _,text in contents]
config.custom_text_tags["RedBlueGradient"] = pink_white_gradient
config.custom_text_tags["PinkWhiteGradient"] = pink_white_gradient
# Please note i have not tested this so it might not work
Sorry for the late reply. But yeah you need to have the base kinetic_text_tags.rpy in there as well since it contains the DispTextStyle class which helps the text tag function handle other text tags. That or you can copy it from there into that file if it's the only thing you need.
Heyyy I have a little problem, I haven't tried with other functions, but with {sc} happens that the letter "q" appear in the game as "r", I have to use Upcase Q instead
I really appreciate your hard work and responsiveness on this project! I just have two quick questions- 1. Is there a way to combine the glitch and swap tags? Everything I've tried so far has only allowed one of the effects to pass through 2. What should I change for swap to have an arbitrary number of arguments?
1. You'll probably need to add the glitch tag to the DispTextStyle class as part of the custom tags. That way it'll try and add it to every letter more or less.
2. Depends on what you want to do with the swap text. You'll probably want to update the SwapText class at least to take a list of texts to do. And then tell it to keep track of which one is being shown and increment it when you want it to go to the next one. But yeah the details from there are up to how you want to do it.
I'm really new to this code language, and I've checked the files but get a bit overwhelmed looking for what you've changed. I saw the devlog changes but since I'm so ADHD I was struggling to get a definite picture of all of the new tag names you made.
Do you think you could do a write up on the itch page with what the tags are specifically? Ie "rotat" "sc", etc?
I know it's in the script itself, but it has a lot of comments and redactions it's mildly confusing for absolute beginners. It was only after going crazy that I realized your code mentioned you had discontinued some effects and tags. (AND I can see why! You streamlined so much, thank youu)
I LOVE this script, it would just be cool if all the tags you added were in a single doc with JUST the tags, and a tutorial on how to install it (I eventually figured it out, but I wasnt the only one confused on how to do it properly). AGAIN that's 900% on me. But even though I got some tags to work, I was still confused as to why glitch, rotate, and some other animations were in different files, and how I would properly install those again without messing up my game. (FYI Im working on a Mac)
Sure I'll see what I can do about that. The main reason I split them up was originally to make it more modular. So if you didn't need every tag, you could pick and choose which you want, without it becoming a 1000+ line script file to go through. But given how many of my custom tags use the DispTextStyle class to handle other tags, probably makes sense to just lump them into one. So ppl just need to download one file even if they don't use all of them. I've just been pretty busy lately with my actual job and life stuff, so I'll see about when I get around to updating it. Probably when I have enough free time to work on another tool I've been meaning to release for a while.
OF COURSE and thanks so much for your reply. Your script is awesome and approachable even for beginners and I hope my suggestion wasnt rude!!! I just spent way too long trying to figure it out (which is ON ME).
You're awesome and this script is literally everythinggggg. Thanks so much
These are FANTASTIC. I've been recently re-editing all of my text so far to integrate these in and the results are really fun! Thanks so much for putting this together. (and of course I credit this pack in the game) DownRight Fierce by Destiny-Smasher (itch.io)
thanks so much for making these text tags!! going to be updating our game with them! https://90percentstudios.itch.io/cool-kid-cody and we'll link back to this page in the credits if that works best! ^v^
Hello, I have uploaded your code. it's very good but I have a problem which is I can't use :) I have also included "glitch_tag.rpy and kinetic_text_tags.rpy" files in my game folders but I don't know why it doesn't know. here is a screenshot of error and my folders. Any help will be appricated :)
Hey! This is really great! I have been using mostly the scare tag and some atl stuff so you really made my game more alive! Thank you again!
I would like to ask something though. I am trying to add the scare tag but all my text has outline on them to separate each character. For some reason, when I try to, it doesnt work? Like it just defaults to white. I tried doing something I saw in an earlier comment but it didnt work. Any thoughts or solutions are appreciated please!
Sorry for the late response but I think I have an idea what's wrong. Thing is, Renpy won't even allow this to work even without the kinetic text tag. I tested it myself and the outline still wouldn't appear. I believe the problem is that for the style {=} tag, renpy will only apply certain properties of the specified style. And sadly, outlines is not one of them. https://www.renpy.org/doc/html/text.html#style-text-tags
That said, there is an outlinescolor text tag. https://www.renpy.org/doc/html/text.html#text-tag-outlinecolor But I believe this would require the text to already have an outline, which you'd probably have to specify in your say screen. Maybe make a transparent outline that you can then replace with outlinecolor? I haven't tested this but I believe the solution is beyond the scope of my text tags sadly. But hope you're able to get your thing working!
Oh I already tried doing that originally too. It was still not showing any outlines at all. I really wonder how to fix this or is this a Renpy thing. Thank you so much for your input still! I will still use this for another project I am working on! Thank you!
I know this post is a year old, but I did some testing and figured out how to do outlines with the dynamic text, and I figured I'd drop it here in case anyone else needs help with it.
This makes all text have a transparent background, you can then use {outlinecolor=#000000} text {/outlinecolor} with the kinetic tag in order to give that text a black outline in this case.
hi! i'm trying these effects out, and i've noticed my dialog text stops automatically doing line breaks when it hits the end of the dialog text width when i'm using effects? in particular, glitch and scared, and i would love to figure out how to get this to work better! thank you <3
I already noted that as being a bug in the demo. I think it has something to do with a whole line being made up of displayable inserts instead of actual text and renpy not being able to figure out the proper width of things. My best solution right now is to just say to add the line breaks in manually for where you know they should be. You can use \n or the {para} tag used in the demo. I know it's annoying but been too busy with other things to really look into a serious fix to avoid it. Sorry about that.
Hai there ^w^ So, i'm having a bit of a problem with this, to be more specific- whenever I'm using one of the text effect, the text it's aplied to is goin way off teh text box, might i ask for a bit of help here?
The text's default position is going to be relative to where it would normally be placed on the screen. I don't know which specific tag is giving you problems, but I will guess it's the ATL tag. Depending on the values you give it, you may just be offsetting it too much and might want to bring them down closer to 0. Hard to know what exactly is the problem without more details, but hope you're able to get it fixed.
Hey, wanted to say this is fantastic stuff! I really appreciate how commented the code is and how easy it is to implement and use. I'd love to use this more in my vns!
However I noticed something while testing the code out: a lot of the text tags that was created seems to be incompatable with the Self-Voicing function in Ren'Py. When I have the Self-Voicing function on, it always gives
TypeError: sequence item 1: expected string or Unicode, GradientText found
or something similar, depending on the line with the text tag. It gives me a similar error with the wavey text too. Would it be possible to have the tags work with Self-Voicing or am I doing something wrong?
So I actually found a workaround to this! I found out about noalt and alt tags and using noalt with the animated tags inside them wont make the game crash haha
Heya! I'm really loving all these effects! I tried out the scare effect (which makes the text shiver) and wanted to ask if I could somehow slow down the animation. Currently, it's a bit too fast for what I want to use it for.
Not sure if I'll update it to include that. But if you want, you can go into the kinetic-text-tags.rpy and go down to the ScareText class. Near the bottom of the render function, you'll see
renpy.redraw(self, 0)
Just change that 0 to something else like 0.2 or 0.5 or something and should slow it down.
Hey! Thank you soo much for this effects! <3 They look so cool! But, I have a little problem with the bounce tag. I don't know why the tag doesn't recognize the letter ''q'' and replaces it with an ''r'', on the script the word is spell right but in the program/game doesn't. I'd appreciate it if you can help me!
and this is in my game. I guess (I'm not sure) this happen after I generated traductions, because I'm doing a spanish version of my game. I deleted all the scripts that the traductions made me for your tags' scripts. Even so, why that only cause trouble on the letter ''q'' and not in its capital letter ''Q''
Or maybe something happen at the tag script directly that confuse the ''q'' with an ''r''
I couldn't tell you why. Might have something to do with your translation I'd imagine? Here's all the code that relates to the bounce tag.
There's nothing in there checking for those characters. Or any other characters for that matter. (Except the argument). Maybe try it with the other tags and lemme know if it's still doing that. Couldn't tell you why it'd do it.
Hi, sorry for the big late reply jaja. Do you have discord contact? Or info for progaming advice? I saw that you work on furry visual novels, We are making one, we are a little team with artist and voice actors, and the only BIG problem is the progaming aspect! So, I'm like the one who has a very tiny progaming knowledge and It's so hard even with tutorials. I manage to put all the story with your kinetics tags (thank you so much btw) but I want to do so much stuff that I don't know how to do it.
Sure. I don't know if I feel comfortable putting my discord out in public like this. But you can DM me on Twitter and can get a conversation going from there.
I love this script and plan on using it for my project for the Spooktober VN Jam this month!Thank you! ^^
I wanted to ask, is it possible to allow the tags to work with image text? At the moment, image text is only affected by ATL (dripping text, etc), but not other tags (like exploding text). Do you have any tips on how I can edit the script so that image text can also be included?
Thank you again for your Ren'Py script, it looks amazing!
You can find most of the stuff for adding in the text in the ATL tag's implementation. It's near the bottom of the atl_tag function in the if 'kind == renpy.TEXT_TAG' portion. Should be easy enough to find. Then take that bit and copy it into the text tag functions you'd like it to work with, ;ike 'bounce_tag' and 'scare_tag'. Just be sure you make it use the appropriate wrapper. Such as the BounceText for the bounce_tag and such. Probably should've done it myself a while ago but got lazy.
Though that said, I should advise that the ChaosText wrapper should not be fed an image for it's child. That effect relies on manipulating text style stuff. So feeding it in an Image or the like will likely break it. So maybe just be sure to skip that one.
I tried looking under the 'kind == renpy.TEXT_TAG' lines in the various rpy files, but I'm not really sure where to go from there (I'm not too knowledgeable in programming). Could you please explain further?
(Yes, I agree with the ChaosText). I'm really trying to get the scared, glitchy, and exploding text to work for image text.
I will try to remember to maybe add this functionality in later. But right now, work is swamping me with things I gotta get done. Not sure I'll be able to get to this for a while. Sorry I can't be of more help at present.
Went ahead and made an update with the changes. Decided not to add support for it to every tag. Couldn't think of a good way to implement it on Swap, Chaos, or Gradient tags. But should be fine on the rest of 'em. Hope you find 'em useful and lemme know if you have any issues!
Certainly! Feel free to use it in anything you want. I'd just maybe ask you credit where you got it from so other people know where to find it and use it too! :3
This is so awesome and really gives so many new opportunities to anyone who has is either just starting out with Ren'py or has, like me, no idea how to do these things! I don't know what I will use it for, but now that I'm seeing all these great options I'll just put some of these in for the sake of how they can make things more interesting and give me more creative freedom when it comes to text in Ren'py. Thank you so much for sharing this!
Happy to help. I also just posted a new version with a text tag that allows you to use ATL to make new effects a lot easier. Hope you'll find it useful!
Oh sorry, I have the glitch tag and gradient tags in different files from the original set. Didn't want that original file becoming so fat with tags that it became too daunting for ppl just getting into coding to read through.
Just copy over the glitch_tag.rpy and gradient_tags.rpy if you want those as well and you should be good. Sorry for any confusion. And if you have any further issues, feel free to ask! I'm always happy to help.
I do have one question, however. I'm still kind of inexperienced with Renpy, but I'm starting to grasp the basics. Your documentation is thorough, but I'm still kind of confused on one thing. The {color} tag doesn't seem to work when using your tags, and I kind of understand why when reading about how this actually works. However, making a style with a defined color still doesn't seem to change the color of the text for me. I tried to copy the example from the script.rpy included with the download, but text colors still don't seem to work.
EDIT: I figured I should include what I did so this seems like a less abstract question
At the top:
style blood:
color "#730707"
What I'm trying to do several lines later
"{=blood}{sc=3}the text{/=blood}{/sc}"
This only adds the scare text effect. Trying to use {color} yields similar results.
You have to have the style tag within the scare tag. So you instead need to have it be.
"{sc=3}{=blood}the text{/=blood}{/sc}"
And I believe it should work. Though of course let me know if it doesn't.
The reason it has to be like that is that the text tag isn't sent the tags started outside of it. So styling you have applied on the text has to be specified inside the tag in order for it to be aware of that. Because technically speaking, the letters that will displayed inside the tag are wrapped inside Displayables and separate from the surrounding text. Which allows us to move them independently of it. But means we don't get that style information the rest of the text will get.
The DispTextStyle class I made is there to help handle that. So that if you define other tags inside the text tag, it can automatically remember them and store that formatting inside the Text displayable inside our Displayable wrapper. But if that style tag is outside of the kinetic text tag, then we don't know that tag exists. I know it's less than convenient though and I apologize for that. I couldn't find a better workaround. But if one comes along I'll be sure to update it to be more convenient.
And again, if that doesn't solve the issue let me know~
I still can't believe I registered on this page just to ask you and thank you for what you have done. I don't know if you'll see this or not, but here go.
Thank you so much for doing something so cool, I can tell you put a lot of effort into it and that shows how cool you are!
Well, here's the question, how does it work? I'm new in Ren'py, so could you explain it to me in a simple way?
Not sure how simply you want me to explain it. But if all you're looking to do is to use the basic ones I provided, you use them like any other renpy text tag. Just drop the kinetic_text_tags.rpy into your project's 'game' folder with your other .rpy files. And to use a tag like the bounce tag in your script, just type "{bt}" where you want it to start and "{/bt}" where you want it to end. So like "Here's some {bt}wavy text{/bt}". And some of them allow for modifiers as well. Such as doing "{bt=30}" will increase the amplitude of the waves.
I maybe should've documentated the parameters I set better, but for the bounce, rotate and scare tags, it's mostly just affects how extreme the effect is and is just an integer. The fade in takes how many characters into the line it is and a float representing how long the fade in should last for each character, the parameters separated by a '-'. Swap takes two strings of equal length separated by an '@' as well as how quickly to swap between them. And the gradient ones... you'll probably want to study up on hex color codes before using that one. xP
Going over how they work might be more advanced. But I provided a lot of comments in the kinetic_text_tags.rpy file to help explain what's going on. And if you have any specific questions about how it works or how to change something to your liking, feel free to ask!
Hi, again. I just did what you told me about dragging kinetic_text_tags.rpy into my folder called game, well, I tried to test if it worked, but Renpy identifies it as something that doesn't exist, I think I didn't identify it because I did something wrong, but I don't know what exactly I did wrong.
What should I do? Here is the error: I'm sorry, but an uncaught exception occurred. While processing text tag {bt=30} in u'{bt=30} {bt}Pfff-{/bt}'..: File "game/script.rpy", line 135, in script. a"{bt=30} {bt}Pfff-{/bt}" Exception: Unknown text tag u'bt=30'.
Oh, I think it's because you forgot to end the first tag before starting a new one. You have a "{bt=30}text {bt=30}" When you should do a "{bt=30}text{/bt}" The `{/ bt}` Will end the previous instance of the tag and doesn't require the =30 or whatever to signal it. But with all my text tags, you must include the {/} at some point.
Least that's what I think it happening. If I saw your script I'd probably have a better idea on what's going wrong.
this is pretty awesome! I was wondering if you could explain how to make an option for disabling animated text in general? I'm not proficient enough with code to understand how to edit the Chaos Text On/Off option to include more types of text.
I will admit that is one area where I buried the lead a little bit. So I actually went back and rewrote it a bit, which is why it's now 1.1! Hopefully should make it more clear how it's being done. So feel free to download that and look at it for yourself.
But in case you might need some more help, I'll explain it a little more here. One way you can solve it is to define a field in preferences, gui, or your persistent data called "disable_text" or whatever you'd want to call it. Then in your preferences screen, in screens.rpy, have something that can turn it True or False like I'm doing for the chaos text. And then in your text effects, make sure they have a check for if that field is True or False or whatever your setup is. And have them react accordingly. As long as your wrapper knows when to be disabled, then it should be fine.
Another approach you could try is updating the say screen to do something similar to what the history screen does and have something like
$ what = renpy.filter_text_tags(h.what, allow=[gui.history_allow_tags])
in there. Just update and modify your own version of gui.history_allow_tags to include whatever tags should be disabled. That way the tags will automatically be removed from the string. Hopefully that gives you some ideas on what approach might work best for you. Feel free to ask if you have any further questions!
If you'd like a more updated version of my explanation (or moreover anyone who finds this comment in the future). I did another similar explanation recently on the lemmasoft forums that has a bit more code and is probably more versatile. Can check it out here if you want. https://lemmasoft.renai.us/forums/viewtopic.php?p=541961#p541961
The method is different because I think filter_text_tags might throw an error now due to the what not display what it is supplied or something. But I know this other method should work if my previous solution isn't working out.
← Return to asset pack
Comments
Log in with itch.io to leave a comment.
I was curious, do you have any way to get this working alongside speech bubbles? I tried to, but couldn't get the effects working.
How does implementing this exactly work?
For example I want to use the glitch tag.
Do I just copy paste the entire code from the file?
And then I will be able to implement it with {glitch}{/glitch}?
init python:
class GlitchText(renpy.Displayable):
def __init__(self, child, amount, **kwargs):
super(GlitchText, self).__init__(**kwargs)
if isinstance(child, (str, unicode)):
self.child = Text(child)
else:
self.child = child
self.amount = amount
def render(self, width, height, st, at):
child_render = renpy.render(self.child, width, height, st, at)
self.width, self.height = child_render.get_size()
render = renpy.Render(self.width, self.height)
y = 0
while y < self.height:
glitch_occurs = renpy.random.random() * 100 < self.amount
if glitch_occurs:
curr_height = renpy.random.randint(-10,10)
else:
curr_height = renpy.random.randint(0,10)
curr_offset = renpy.random.randint(-10,10)
curr_surface = child_render.subsurface((0,y,self.width,curr_height))
if glitch_occurs:
render.subpixel_blit(curr_surface, (curr_offset, y))
else:
render.subpixel_blit(curr_surface, (0, y))
if curr_height > 0:
y += curr_height
else:
y -= curr_height
renpy.redraw(self,0)
return render
# Argument is the percertage of the time it'll apply a random offset to a randomly sized slice.
# offset_percent: (Float between 0.0-100.0) Percentage chance a random block of the render will be offset.
# 0 will cause it to never occur. 100 will cause an offset on every line.
# Example: {glitch=59.94}Text{/glitch}
def glitch_tag(tag, argument, contents):
new_list = [ ]
if argument == "":
argument = 10.0
else:
argument = float(argument)
my_style = DispTextStyle()
for kind,text in contents:
if kind == renpy.TEXT_TEXT:
char_disp = GlitchText(my_style.apply_style(text), argument)
new_list.append((renpy.TEXT_DISPLAYABLE, char_disp))
elif kind == renpy.TEXT_TAG:
if text.find("image") != -1:
tag, _, value = text.partition("=")
my_img = renpy.displayable(value)
img_disp = GlitchText(my_img, argument)
new_list.append((renpy.TEXT_DISPLAYABLE, img_disp))
elif not my_style.add_tags(text):
new_list.append((kind, text))
else:
new_list.append((kind,text))
return new_list
config.custom_text_tags["glitch"] = glitch_tag
Nevermind
Got it lol
Hi, I have a small black outline around my text in my game, but it doesn't show up in the text that uses your kinetic texts. Do you know how I can make that text match the text from the rest of my game? Sorry if this is a silly question, but thank you so much for this amazing code!
Hi. Does this tool include a revealing text animation like this one? (like it shows in the first few seconds of the video)
No, I've never directly made an effect like that, but with my setup, it wouldn't be hard to make one if you know what you want and have some coding experience. Could maybe make one if you need though, but currently busy with another project so can't promise anything for a bit if you need it right now.
I do have coding experience. Mostly Java though. Haven’t really worked with Ren’Py, until now. I did make a function that randomizes text. Not sure how I would go about integrating that into your code to randomize the characters to do the revealing text animation.
Mostly just would be having it so the letters keep some kind timer, randomly going through characters until the timer hits zero and then just shows the actual letter. Though if you do need me to do it I'll note it down and let you know when I can get to it later.
Yes. If you have an idea of how to do it, I’d appreciate it if you update this library with that new effect
Hi new ren'Py user here, I was wondering how i would go to make an effect similar to this but instead changes the font as its being written out? Been trying to make it on my own but to no avail, I don't understand custom text tags enough. Basically font swap for every letter one after the other but only once, kinda like a live translator.
Like it cycles through multiple fonts before settling on one or each letter is a different random font?
Hihi, new renpy user here, I was wondering if there is a way to adjust the speed of the effects? I'm currently using the glitching text but it goes a bit fast for the atmosphere I want it in... is there any way to make the glitching slower, not just the cps?
You can probably have the glitch go slower but changing the redraw time. Maybe something like 1./30 instead of 0 if you just want it at 30 fps or just .2 or something if you need it slower. It'll be the renpy.redraw(self,[new number here]) bit.
These text effects are fantastic, they've been a game changer for my VN work this year and have helped me capture a lot more fun expressiveness, so thanks so much for your work on this.
I'm actually wondering about the last example GIF you post, showing dripping text -- the way it's bouncing is unlike anything I've replicated so far, do you happen to know how to achieve that type of bounce?
Hi, is possible make the gradiant be vertical instead of horizontal?
you could always try shaders, heres an example:
the result should look something like this![](https://img.itch.zone/aW1nLzE0NzY2NzkyLnBuZw==/original/cK9nN5.png)
there are some draw backs to this approach such as text outlines not working and requiring predetermined gradients rather than defining them in the text tag
if you have multiple vertical gradients you need displayed, you can always try this:
hope this helps!
Hey! First of all, great work! :)
I really appreciate the hard work and the responsiveness you put on this project!
I have a small question regarding the glitch text. Might be silly, but everytime I try to use it, I get the same error:
my_style = DispTextStyle()
NameError: name 'DispTextStyle' is not defined.
How can I resolve this?
Thank you in advance! :) Have a great day!
Sorry for the late reply. But yeah you need to have the base kinetic_text_tags.rpy in there as well since it contains the DispTextStyle class which helps the text tag function handle other text tags. That or you can copy it from there into that file if it's the only thing you need.
Heyyy I have a little problem, I haven't tried with other functions, but with {sc} happens that the letter "q" appear in the game as "r", I have to use Upcase Q instead![](https://img.itch.zone/aW1nLzExODU0Mzg1LmpwZw==/original/VvRmq1.jpg)
I really appreciate your hard work and responsiveness on this project! I just have two quick questions-
1. Is there a way to combine the glitch and swap tags? Everything I've tried so far has only allowed one of the effects to pass through
2. What should I change for swap to have an arbitrary number of arguments?
Thank you!
1. You'll probably need to add the glitch tag to the DispTextStyle class as part of the custom tags. That way it'll try and add it to every letter more or less.
2. Depends on what you want to do with the swap text. You'll probably want to update the SwapText class at least to take a list of texts to do. And then tell it to keep track of which one is being shown and increment it when you want it to go to the next one. But yeah the details from there are up to how you want to do it.
I'm really new to this code language, and I've checked the files but get a bit overwhelmed looking for what you've changed. I saw the devlog changes but since I'm so ADHD I was struggling to get a definite picture of all of the new tag names you made.
Do you think you could do a write up on the itch page with what the tags are specifically? Ie "rotat" "sc", etc?
I know it's in the script itself, but it has a lot of comments and redactions it's mildly confusing for absolute beginners. It was only after going crazy that I realized your code mentioned you had discontinued some effects and tags. (AND I can see why! You streamlined so much, thank youu)
I LOVE this script, it would just be cool if all the tags you added were in a single doc with JUST the tags, and a tutorial on how to install it (I eventually figured it out, but I wasnt the only one confused on how to do it properly). AGAIN that's 900% on me. But even though I got some tags to work, I was still confused as to why glitch, rotate, and some other animations were in different files, and how I would properly install those again without messing up my game. (FYI Im working on a Mac)
I was following along with this video, and you'll probs notice you cant use some of these tags with your current version!
Sure I'll see what I can do about that. The main reason I split them up was originally to make it more modular. So if you didn't need every tag, you could pick and choose which you want, without it becoming a 1000+ line script file to go through. But given how many of my custom tags use the DispTextStyle class to handle other tags, probably makes sense to just lump them into one. So ppl just need to download one file even if they don't use all of them. I've just been pretty busy lately with my actual job and life stuff, so I'll see about when I get around to updating it. Probably when I have enough free time to work on another tool I've been meaning to release for a while.
OF COURSE and thanks so much for your reply. Your script is awesome and approachable even for beginners and I hope my suggestion wasnt rude!!! I just spent way too long trying to figure it out (which is ON ME).
You're awesome and this script is literally everythinggggg. Thanks so much
These are FANTASTIC.
I've been recently re-editing all of my text so far to integrate these in and the results are really fun! Thanks so much for putting this together.
(and of course I credit this pack in the game)
DownRight Fierce by Destiny-Smasher (itch.io)
Duuuuude! This is so OP!!!! You're the GOAT!!!!!
thanks so much for making these text tags!! going to be updating our game with them! https://90percentstudios.itch.io/cool-kid-cody and we'll link back to this page in the credits if that works best! ^v^
Hey Wattson, can you hit me up in pms on twitter, or anywhere? I want to ask a few questions in private.
Eheh, I used the scary effect (just a bit less shaky) in my last jam entry: https://synstoria.itch.io/autumn-spirit
It works really well when the angry ghost is speaking eheh
Thanks again for sharing!
Hello, I have uploaded your code. it's very good but I have a problem which is I can't use :) I have also included "glitch_tag.rpy and kinetic_text_tags.rpy" files in my game folders but I don't know why it doesn't know. here is a screenshot of error and my folders. Any help will be appricated :)
Hey! This is really great! I have been using mostly the scare tag and some atl stuff so you really made my game more alive! Thank you again!
I would like to ask something though. I am trying to add the scare tag but all my text has outline on them to separate each character. For some reason, when I try to, it doesnt work? Like it just defaults to white. I tried doing something I saw in an earlier comment but it didnt work. Any thoughts or solutions are appreciated please!
style OutlineColor:
outlines [ (absolute(4), "#BA7B22", absolute(2), absolute(1)) ]
R "{sc}{=OutlineColor}This text should be shaking and outlined{/=OutlineColor}{/sc}"
Sorry for the late response but I think I have an idea what's wrong. Thing is, Renpy won't even allow this to work even without the kinetic text tag. I tested it myself and the outline still wouldn't appear. I believe the problem is that for the style {=} tag, renpy will only apply certain properties of the specified style. And sadly, outlines is not one of them. https://www.renpy.org/doc/html/text.html#style-text-tags
That said, there is an outlinescolor text tag. https://www.renpy.org/doc/html/text.html#text-tag-outlinecolor But I believe this would require the text to already have an outline, which you'd probably have to specify in your say screen. Maybe make a transparent outline that you can then replace with outlinecolor? I haven't tested this but I believe the solution is beyond the scope of my text tags sadly. But hope you're able to get your thing working!
Oh I already tried doing that originally too. It was still not showing any outlines at all. I really wonder how to fix this or is this a Renpy thing. Thank you so much for your input still! I will still use this for another project I am working on! Thank you!
I know this post is a year old, but I did some testing and figured out how to do outlines with the dynamic text, and I figured I'd drop it here in case anyone else needs help with it.
I changed the default style to this:
style default:
outlines [ (absolute(4), "#00000000", absolute(0), absolute(0)) ]
This makes all text have a transparent background, you can then use {outlinecolor=#000000} text {/outlinecolor} with the kinetic tag in order to give that text a black outline in this case.
hi! i'm trying these effects out, and i've noticed my dialog text stops automatically doing line breaks when it hits the end of the dialog text width when i'm using effects? in particular, glitch and scared, and i would love to figure out how to get this to work better! thank you <3
I already noted that as being a bug in the demo. I think it has something to do with a whole line being made up of displayable inserts instead of actual text and renpy not being able to figure out the proper width of things. My best solution right now is to just say to add the line breaks in manually for where you know they should be. You can use \n or the {para} tag used in the demo. I know it's annoying but been too busy with other things to really look into a serious fix to avoid it. Sorry about that.
thank you!! i really appreciate this work, i don't know how to write atl but this helps make displaying text effects really easy! thank you again u_u
Hai there ^w^
So, i'm having a bit of a problem with this, to be more specific- whenever I'm using one of the text effect, the text it's aplied to is goin way off teh text box, might i ask for a bit of help here?
The text's default position is going to be relative to where it would normally be placed on the screen. I don't know which specific tag is giving you problems, but I will guess it's the ATL tag. Depending on the values you give it, you may just be offsetting it too much and might want to bring them down closer to 0. Hard to know what exactly is the problem without more details, but hope you're able to get it fixed.
Thank you so much for sharing these! I used the trembling text in my visual novel <3
https://ladyicepaw.itch.io/invisible-seams
Hey, wanted to say this is fantastic stuff! I really appreciate how commented the code is and how easy it is to implement and use. I'd love to use this more in my vns!
However I noticed something while testing the code out: a lot of the text tags that was created seems to be incompatable with the Self-Voicing function in Ren'Py. When I have the Self-Voicing function on, it always gives
TypeError: sequence item 1: expected string or Unicode, GradientText found
or something similar, depending on the line with the text tag. It gives me a similar error with the wavey text too. Would it be possible to have the tags work with Self-Voicing or am I doing something wrong?
So I actually found a workaround to this! I found out about noalt and alt tags and using noalt with the animated tags inside them wont make the game crash haha
How to use a gradient from top to bottom?
Never wrote one for that. Would probably have to be a shader or something to pull that off. But could work if ya do it like that.
Hello I've been playing the game to check out the features and after the rainbow gradient demonstration I recieved this error ```
I'm sorry, but an uncaught exception occurred.
While running game code:
File "game/script.rpy", line 41, in script
e "{fi=0-1.5}Here is some fade in text{/fi}"
File "game/kinetic_text_tags.rpy", line 530, in fade_in_tag
slide_distance = int(slide_distance)
ValueError: invalid literal for int() with base 10: ''
-- Full Traceback ------------------------------------------------------------
Full traceback:
File "game/script.rpy", line 41, in script
e "{fi=0-1.5}Here is some fade in text{/fi}"
File "renpy/ast.py", line 716, in execute
renpy.exports.say(who, what, *args, **kwargs)
File "renpy/exports.py", line 1417, in say
who(what, *args, **kwargs)
File "renpy/character.py", line 1223, in __call__
self.do_display(who, what, cb_args=self.cb_args, dtt=dtt, **display_args)
File "renpy/character.py", line 875, in do_display
**display_args)
File "renpy/character.py", line 602, in display_say
what_text.update()
File "renpy/text/text.py", line 1760, in update
tokens = self.apply_custom_tags(tokens)
File "renpy/text/text.py", line 2311, in apply_custom_tags
new_contents = func(tag, value, contents)
File "game/kinetic_text_tags.rpy", line 530, in fade_in_tag
slide_distance = int(slide_distance)
ValueError: invalid literal for int() with base 10: ''
Windows-10-10.0.19041
Ren'Py 7.4.8.1895
Kinetic Text Tags 3.1
Wed Apr 20 19:16:40 2022
```
Oh! This is something I've been looking for for a while, THANK YOU!!!
Heya! I'm really loving all these effects! I tried out the scare effect (which makes the text shiver) and wanted to ask if I could somehow slow down the animation. Currently, it's a bit too fast for what I want to use it for.
Not sure if I'll update it to include that. But if you want, you can go into the kinetic-text-tags.rpy and go down to the ScareText class. Near the bottom of the render function, you'll see
Just change that 0 to something else like 0.2 or 0.5 or something and should slow it down.
Thank you very much! ^^
You are literally my hero!!!!!!!!!!!! These are great!
would it be possible to add outlines to the text?
How Can I add this to an existing project
Do I have to craeate a new profect?
You should be able to just drag and drop the kinetic_text_tags.rpy into your project folder :)
thanks
Hey! Thank you soo much for this effects! <3 They look so cool!
But, I have a little problem with the bounce tag. I don't know why the tag doesn't recognize the letter ''q'' and replaces it with an ''r'', on the script the word is spell right but in the program/game doesn't. I'd appreciate it if you can help me!
Not sure why it'd do that. Can you share the particular line with me so I can see what might be going on?
Of course! this is in my script![](https://img.itch.zone/aW1nLzcxNzgzNTYucG5n/original/NcAmQY.png)
and this is in my game.
I guess (I'm not sure) this happen after I generated traductions, because I'm doing a spanish version of my game. I deleted all the scripts that the traductions made me for your tags' scripts. Even so, why that only cause trouble on the letter ''q'' and not in its capital letter ''Q''
Or maybe something happen at the tag script directly that confuse the ''q'' with an ''r''
Thanks for the help!
I couldn't tell you why. Might have something to do with your translation I'd imagine? Here's all the code that relates to the bounce tag.
There's nothing in there checking for those characters. Or any other characters for that matter. (Except the argument). Maybe try it with the other tags and lemme know if it's still doing that. Couldn't tell you why it'd do it.
Hi, sorry for the big late reply jaja. Do you have discord contact? Or info for progaming advice? I saw that you work on furry visual novels, We are making one, we are a little team with artist and voice actors, and the only BIG problem is the progaming aspect! So, I'm like the one who has a very tiny progaming knowledge and It's so hard even with tutorials. I manage to put all the story with your kinetics tags (thank you so much btw) but I want to do so much stuff that I don't know how to do it.
Sure. I don't know if I feel comfortable putting my discord out in public like this. But you can DM me on Twitter and can get a conversation going from there.
I love this script and plan on using it for my project for the Spooktober VN Jam this month!Thank you! ^^
I wanted to ask, is it possible to allow the tags to work with image text? At the moment, image text is only affected by ATL (dripping text, etc), but not other tags (like exploding text). Do you have any tips on how I can edit the script so that image text can also be included?
Thank you again for your Ren'Py script, it looks amazing!
You can find most of the stuff for adding in the text in the ATL tag's implementation. It's near the bottom of the atl_tag function in the if 'kind == renpy.TEXT_TAG' portion. Should be easy enough to find. Then take that bit and copy it into the text tag functions you'd like it to work with, ;ike 'bounce_tag' and 'scare_tag'. Just be sure you make it use the appropriate wrapper. Such as the BounceText for the bounce_tag and such. Probably should've done it myself a while ago but got lazy.
Though that said, I should advise that the ChaosText wrapper should not be fed an image for it's child. That effect relies on manipulating text style stuff. So feeding it in an Image or the like will likely break it. So maybe just be sure to skip that one.
I tried looking under the 'kind == renpy.TEXT_TAG' lines in the various rpy files, but I'm not really sure where to go from there (I'm not too knowledgeable in programming). Could you please explain further?
(Yes, I agree with the ChaosText). I'm really trying to get the scared, glitchy, and exploding text to work for image text.
I will try to remember to maybe add this functionality in later. But right now, work is swamping me with things I gotta get done. Not sure I'll be able to get to this for a while. Sorry I can't be of more help at present.
No problem! Thank you very much.
Went ahead and made an update with the changes. Decided not to add support for it to every tag. Couldn't think of a good way to implement it on Swap, Chaos, or Gradient tags. But should be fine on the rest of 'em. Hope you find 'em useful and lemme know if you have any issues!
Hi can this be used in commercial projects ? I would like to make and sell my own VN game and was wondering if using this text would be okay to use
Certainly! Feel free to use it in anything you want. I'd just maybe ask you credit where you got it from so other people know where to find it and use it too! :3
will do :)! Thank you so much!
This is so awesome and really gives so many new opportunities to anyone who has is either just starting out with Ren'py or has, like me, no idea how to do these things! I don't know what I will use it for, but now that I'm seeing all these great options I'll just put some of these in for the sake of how they can make things more interesting and give me more creative freedom when it comes to text in Ren'py. Thank you so much for sharing this!
Happy to help. I also just posted a new version with a text tag that allows you to use ATL to make new effects a lot easier. Hope you'll find it useful!
I just want to say thank you sm for this, this code is awesome and really useful!!
Also, I don't want to bother but I have a problem, I moved the kinetic_text_tags.rpy file to my game folder, but when playing it I get this error
I don't know what I'm doing wrong
¯\_(ツ)_/¯
Oh sorry, I have the glitch tag and gradient tags in different files from the original set. Didn't want that original file becoming so fat with tags that it became too daunting for ppl just getting into coding to read through.
Just copy over the glitch_tag.rpy and gradient_tags.rpy if you want those as well and you should be good. Sorry for any confusion. And if you have any further issues, feel free to ask! I'm always happy to help.
It worked!! thanks!! <3
Thank you so much for making this! It's amazing.
I do have one question, however. I'm still kind of inexperienced with Renpy, but I'm starting to grasp the basics. Your documentation is thorough, but I'm still kind of confused on one thing. The {color} tag doesn't seem to work when using your tags, and I kind of understand why when reading about how this actually works. However, making a style with a defined color still doesn't seem to change the color of the text for me. I tried to copy the example from the script.rpy included with the download, but text colors still don't seem to work.
EDIT: I figured I should include what I did so this seems like a less abstract question
At the top:
style blood:
color "#730707"
What I'm trying to do several lines later
"{=blood}{sc=3}the text{/=blood}{/sc}"
This only adds the scare text effect. Trying to use {color} yields similar results.
You have to have the style tag within the scare tag. So you instead need to have it be.
"{sc=3}{=blood}the text{/=blood}{/sc}"
And I believe it should work. Though of course let me know if it doesn't.
The reason it has to be like that is that the text tag isn't sent the tags started outside of it. So styling you have applied on the text has to be specified inside the tag in order for it to be aware of that. Because technically speaking, the letters that will displayed inside the tag are wrapped inside Displayables and separate from the surrounding text. Which allows us to move them independently of it. But means we don't get that style information the rest of the text will get.
The DispTextStyle class I made is there to help handle that. So that if you define other tags inside the text tag, it can automatically remember them and store that formatting inside the Text displayable inside our Displayable wrapper. But if that style tag is outside of the kinetic text tag, then we don't know that tag exists. I know it's less than convenient though and I apologize for that. I couldn't find a better workaround. But if one comes along I'll be sure to update it to be more convenient.
And again, if that doesn't solve the issue let me know~
It worked out! Thanks so much for the help and the quick response. You are awesome. : )
I still can't believe I registered on this page just to ask you and thank you for what you have done. I don't know if you'll see this or not, but here go.
Thank you so much for doing something so cool, I can tell you put a lot of effort into it and that shows how cool you are!
Well, here's the question, how does it work?
I'm new in Ren'py, so could you explain it to me in a simple way?
Thanks! I really appreciate the feedback.
Not sure how simply you want me to explain it. But if all you're looking to do is to use the basic ones I provided, you use them like any other renpy text tag. Just drop the kinetic_text_tags.rpy into your project's 'game' folder with your other .rpy files. And to use a tag like the bounce tag in your script, just type "{bt}" where you want it to start and "{/bt}" where you want it to end. So like "Here's some {bt}wavy text{/bt}". And some of them allow for modifiers as well. Such as doing "{bt=30}" will increase the amplitude of the waves.
I maybe should've documentated the parameters I set better, but for the bounce, rotate and scare tags, it's mostly just affects how extreme the effect is and is just an integer. The fade in takes how many characters into the line it is and a float representing how long the fade in should last for each character, the parameters separated by a '-'. Swap takes two strings of equal length separated by an '@' as well as how quickly to swap between them. And the gradient ones... you'll probably want to study up on hex color codes before using that one. xP
Going over how they work might be more advanced. But I provided a lot of comments in the kinetic_text_tags.rpy file to help explain what's going on. And if you have any specific questions about how it works or how to change something to your liking, feel free to ask!
Thank you for responding!
Hi, again.
I just did what you told me about dragging kinetic_text_tags.rpy into my folder called game, well, I tried to test if it worked, but Renpy identifies it as something that doesn't exist, I think I didn't identify it because I did something wrong, but I don't know what exactly I did wrong.
What should I do? Here is the error:
I'm sorry, but an uncaught exception occurred.
While processing text tag {bt=30} in u'{bt=30} {bt}Pfff-{/bt}'..:
File "game/script.rpy", line 135, in script.
a"{bt=30} {bt}Pfff-{/bt}"
Exception: Unknown text tag u'bt=30'.
Oh, I think it's because you forgot to end the first tag before starting a new one. You have a "{bt=30}text {bt=30}" When you should do a "{bt=30}text{/bt}" The `{/ bt}` Will end the previous instance of the tag and doesn't require the =30 or whatever to signal it. But with all my text tags, you must include the {/} at some point.
Least that's what I think it happening. If I saw your script I'd probably have a better idea on what's going wrong.
this is pretty awesome! I was wondering if you could explain how to make an option for disabling animated text in general? I'm not proficient enough with code to understand how to edit the Chaos Text On/Off option to include more types of text.
I will admit that is one area where I buried the lead a little bit. So I actually went back and rewrote it a bit, which is why it's now 1.1! Hopefully should make it more clear how it's being done. So feel free to download that and look at it for yourself.
But in case you might need some more help, I'll explain it a little more here. One way you can solve it is to define a field in preferences, gui, or your persistent data called "disable_text" or whatever you'd want to call it. Then in your preferences screen, in screens.rpy, have something that can turn it True or False like I'm doing for the chaos text. And then in your text effects, make sure they have a check for if that field is True or False or whatever your setup is. And have them react accordingly. As long as your wrapper knows when to be disabled, then it should be fine.
Another approach you could try is updating the say screen to do something similar to what the history screen does and have something like
in there. Just update and modify your own version of gui.history_allow_tags to include whatever tags should be disabled. That way the tags will automatically be removed from the string. Hopefully that gives you some ideas on what approach might work best for you. Feel free to ask if you have any further questions!
If you'd like a more updated version of my explanation (or moreover anyone who finds this comment in the future). I did another similar explanation recently on the lemmasoft forums that has a bit more code and is probably more versatile. Can check it out here if you want. https://lemmasoft.renai.us/forums/viewtopic.php?p=541961#p541961
The method is different because I think filter_text_tags might throw an error now due to the what not display what it is supplied or something. But I know this other method should work if my previous solution isn't working out.