Speech Bubble extensions

Started by Narehop, Sat 10/03/2018 10:19:26

Previous topic - Next topic

Narehop

Quote from: Snarky on Sat 05/05/2018 17:03:21
OK, I've implemented sprite-based borders in the SpeechBubble module. As mentioned this led to a major rewrite, which I'm still not finished with, so this is just a beta of the new version that you can test out: SpeechBubble v0.8.9

The way you configure it is now a little bit different. I've moved all the formatting settings into a SpeechBubbleFormat class, and you can set SpeechBubble.TalkFormat and SpeechBubble.ThinkFormat to control those formats separately, or just SpeechBubble.Format to set the formatting for all SpeechBubbles generally (eventually you'll also be able to provide your own SpeechBubbleFormats to control the formatting of bubbles individually.

In your case, you'll need something like this to set up the formatting correctly:

Code: ags
  // Set up the border
  SpeechBubble.Format.BorderRenderMode = eRenderSprite; // Use sprites to render the border
  SpeechBubble.Format.BorderSpriteTopLeft = 32;  // Sprite index...
  SpeechBubble.Format.BorderSpriteTopRight = 33;
  SpeechBubble.Format.BorderSpriteBottomRight = 34;
  SpeechBubble.Format.BorderSpriteBottomLeft = 35;
  SpeechBubble.Format.BorderSpriteTop = 39;
  SpeechBubble.Format.BorderSpriteBottom = 36;
  SpeechBubble.Format.BorderSpriteLeft = 37;
  SpeechBubble.Format.BorderSpriteRight = 38;  

  // Set up the tail
  SpeechBubble.Format.TailRenderMode = eRenderSprite;  // Use a sprite to render the tail
  SpeechBubble.Format.TailSprite = 31;
  SpeechBubble.Format.TailTipOffset = 35;  // This is what x-coordinate in the tail sprite the tip is (the pixel that should be over the character's head)
  SpeechBubble.Format.AllowTailSlide = false;  // The tail will always be centered in the bubble
  
  // We set negative padding so the text actually extends into the edge sprites (since they are quite big)
  SpeechBubble.Format.PaddingTop = -10;
  SpeechBubble.Format.PaddingBottom = -10;
  SpeechBubble.Format.PaddingLeft = -20;
  SpeechBubble.Format.PaddingRight = -20;

  // General formatting
  SpeechBubble.Format.BackgroundColor = Game.GetColorFromRGB(0, 0, 0);  // Black background
  SpeechBubble.Format.TextOutlineWidth = 2;


Thank you Snarky! but I think that I have a problem



the only thing that I make it's use my sprites on borders. I don't touch anything of your code. (btw, can we make the background with some alpha transparency?)

Snarky

#21
The tail is displayed instead of the border, not on top of it (or under it, as in your mockup). So if your tail sprite is meant to also show the border, you have to actually include the border in the sprite (they don't have to be the same height, though; if not, they'll be top-aligned). Here's the sprite I used in testing:

[imgzoom]https://i.imgur.com/NNrFqKM.png[/imgzoom]

Quote from: Narehop on Sat 05/05/2018 17:28:40(btw, can we make the background with some alpha transparency?)

Yes, you can set the background transparency with SpeechBubble.Format.BackgroundTransparency and the border transparency with SpeechBubble.Format.BorderTransparency. If you just want part of the border to be transparent (for example the black part, not the gold part), that needs to be part of the sprites you use.

Also, because it bugs me a little: the top border edge of your text window is not precisely aligned with the corners, and the outside gold rim is a little bit wider/heavier than the corners, creating a noticeable seam. You might want to fix that.

Narehop

Quote from: Snarky on Sat 05/05/2018 17:55:11
The tail is displayed instead of the border, not on top of it (or under it, as in your mockup). So if your tail sprite is meant to also show the border, you have to actually include the border in the sprite (they don't have to be the same height, though; if not, they'll be top-aligned). Here's the sprite I used in testing:

[imgzoom]https://i.imgur.com/NNrFqKM.png[/imgzoom]

Quote from: Narehop on Sat 05/05/2018 17:28:40(btw, can we make the background with some alpha transparency?)

Yes, you can set the background transparency with SpeechBubble.Format.BackgroundTransparency and the border transparency with SpeechBubble.Format.BorderTransparency. If you just want part of the border to be transparent (for example the black part, not the gold part), that needs to be part of the sprites you use.

Also, because it bugs me a little: the top border edge of your text window is not precisely aligned with the corners, and the outside gold rim is a little bit wider/heavier than the corners, creating a noticeable seam. You might want to fix that.

SO NICE! IT WORKS VERY FINE! :D

How can i to use the module on dialogs? Because in AGS the dialogs only use "cEgo: bla bla bla bla" can i use speechbubble?

I have a last question about your module. When i'm using a cutscene the game freeze around 5-6 seconds and I've to do double-click to solve. Before to use your module this not happens.

Snarky

Quote from: Narehop on Sat 05/05/2018 18:12:39
How can i to use the module on dialogs? Because in AGS the dialogs only use "cEgo: bla bla bla bla" can i use speechbubble?

You can write normal AGS commands in a dialog, but you have to put a space (or several spaces) at the beginning of the line. So instead of:

Code: ags
cEgo: bla bla bla bla


You put:

Code: ags
 cEgo.SayBubble("bla bla bla bla");


(Note the space!)

QuoteI have a last question about your module. When i'm using a cutscene the game freeze around 5-6 seconds and I've to do double-click to solve. Before to use your module this not happens.

Ah, hmm... yes, I can see how that could happen. I think it's due to the custom blocking code. It might be tricky to solve properly, but as a workaround, try setting an invisible font with SpeechBubble.InvisibleFont. This should bypass the custom blocking. You can download an invisible font here: http://www.angelfire.com/pr/pgpf/if.html

Narehop

Quote from: Snarky on Sat 05/05/2018 18:27:04
Quote from: Narehop on Sat 05/05/2018 18:12:39
How can i to use the module on dialogs? Because in AGS the dialogs only use "cEgo: bla bla bla bla" can i use speechbubble?

You can write normal AGS commands in a dialog, but you have to put a space (or several spaces) at the beginning of the line. So instead of:

Code: ags
cEgo: bla bla bla bla


You put:

Code: ags
 cEgo.SayBubble("bla bla bla bla");


(Note the space!)

QuoteI have a last question about your module. When i'm using a cutscene the game freeze around 5-6 seconds and I've to do double-click to solve. Before to use your module this not happens.

Ah, hmm... yes, I can see how that could happen. I think it's due to the custom blocking code. It might be tricky to solve properly, but as a workaround, try setting an invisible font with SpeechBubble.InvisibleFont. This should bypass the custom blocking. You can download an invisible font here: http://www.angelfire.com/pr/pgpf/if.html

man, you're the best! If you have a job, tell your boss to increase your salary.

I'll put your name on the credits of Train to Nowhere. Really you saved my project with this ^^
http://www.adventuregamestudio.co.uk/forums/index.php?topic=56019.0

Snarky

So it's all working now? Cool!

Narehop

Quote from: Snarky on Sun 06/05/2018 06:20:42
So it's all working now? Cool!

yes, but i have a little problem, but I don't know why happens this:




if you can see, I've a line on left side and bottom side. But in top and left doesn't exist :S


Snarky

#27
Yes, I see it. The background fill must overlap the edge by one pixel (it's one pixel too wide and too tall), which is only visible when they're semi-transparent, because you're drawing twice, adding to the opacity. These off-by-one errors are really annoying, and a lot of the work on this module has been fixing them.

Edit: OK, so that was a really easy fix: SpeechBubble v0.8.10

I really dig the visual style you've got going here, by the way. The font fits really well.

Narehop

Quote from: Snarky on Sun 06/05/2018 11:21:06
Yes, I see it. The background fill must overlap the edge by one pixel (it's one pixel too wide and too tall), which is only visible when they're semi-transparent, because you're drawing twice, adding to the opacity. These off-by-one errors are really annoying, and a lot of the work on this module has been fixing them.

Edit: OK, so that was a really easy fix: SpeechBubble v0.8.10

I really dig the visual style you've got going here, by the way. The font fits really well.

Thank you one more time Snarky! Now it works FINE AT 100%! Thank you for your comment. I hope in a month I can have a full demo to download for all people ^^

Narehop

Snarky i detected a little issue in your module. When my characters are talking if i press a long time a key for pass to the next bubble, it goes really so fast. How i can to resolve this? :(

Crimson Wizard

Quote from: Narehop on Fri 01/06/2018 22:22:10
Snarky i detected a little issue in your module. When my characters are talking if i press a long time a key for pass to the next bubble, it goes really so fast. How i can to resolve this? :(

There is Game.IgnoreUserInputAfterTextTimeoutMs property for builtin speech, I guess it may be made used in the module too.

Narehop

Quote from: Crimson Wizard on Fri 01/06/2018 22:30:07
Quote from: Narehop on Fri 01/06/2018 22:22:10
Snarky i detected a little issue in your module. When my characters are talking if i press a long time a key for pass to the next bubble, it goes really so fast. How i can to resolve this? :(

There is Game.IgnoreUserInputAfterTextTimeoutMs property for builtin speech, I guess it may be made used in the module too.

thank you, i'll going to try it :)

Crimson Wizard

Quote from: Narehop on Fri 01/06/2018 22:35:04
Quote from: Crimson Wizard on Fri 01/06/2018 22:30:07
Quote from: Narehop on Fri 01/06/2018 22:22:10
Snarky i detected a little issue in your module. When my characters are talking if i press a long time a key for pass to the next bubble, it goes really so fast. How i can to resolve this? :(

There is Game.IgnoreUserInputAfterTextTimeoutMs property for builtin speech, I guess it may be made used in the module too.

thank you, i'll going to try it :)

From the looks of the module code, this property is not used in there. What I meant, it could be supported.

Narehop

Quote from: Crimson Wizard on Fri 01/06/2018 22:47:34
From the looks of the module code, this property is not used in there. What I meant, it could be supported.

Doesn't works... i tried to do but nothing happen.

Snarky

#34
If you are using voiced speech or have set an invisible font, SpeechBubble calls Character.Say() internally to handle the speech animation and timing of the display. As I recall, you set an invisible font earlier to workaround a cutscene bug. So Game.IgnoreUserInputAfterTextTimeoutMs should work without any changes to the module code.

Edit: However, this setting doesn't actually do what you're interested in: it only ignores input after the last line timed out, not if you dismissed it. If you hold down a button, AGS will still speed through the dialog at high speed.

This behavior is by design, but I have also had the impression that the speed has increased lately (or maybe I'm just getting old...). It would be good to be able to control how fast it happens (I would guess it's at the key-repeat speed for holding down a keyboard key, but does that also apply to mouse-button presses?), and also ensure that a slightly longer click/button press doesn't accidentally skip two lines.

I've also split this continuing discussion into its own thread since the "(SOLVED)" part of the title kept annoying me. Arguably it should be merged with the module thread, though.

Narehop

Quote from: Snarky on Sat 02/06/2018 06:38:42
If you are using voiced speech or have set an invisible font, SpeechBubble calls Character.Say() internally to handle the speech animation and timing of the display. As I recall, you set an invisible font earlier to workaround a cutscene bug. So Game.IgnoreUserInputAfterTextTimeoutMs should work without any changes to the module code.

Edit: However, this setting doesn't actually do what you're interested in: it only ignores input after the last line timed out, not if you dismissed it. If you hold down a button, AGS will still speed through the dialog at high speed.

This behavior is by design, but I have also had the impression that the speed has increased lately (or maybe I'm just getting old...). It would be good to be able to control how fast it happens (I would guess it's at the key-repeat speed for holding down a keyboard key, but does that also apply to mouse-button presses?), and also ensure that a slightly longer click/button press doesn't accidentally skip two lines.

I've also split this continuing discussion into its own thread since the "(SOLVED)" part of the title kept annoying me. Arguably it should be merged with the module thread, though.

Thank you for your reply Snarky. I was using SpeechBubble.InvisibleFont = eFontinvisibleFont but actually I had to disable because I saw that my characters doesn't do speech animation. They allways stay quiet and text continues.



btw I tried to fix the speech speed using this:
Quote from: Ghost on Mon 02/03/2015 01:02:39
You can set how speech (and dialog lines) are skipped in your game's General Settings -> Dialog -> Speed Skipped by...

You can also change the text speed by altering Game.TextReadingSpeed, and finally there is Game.MinimumTextDisplayTimeMs to make sure that even very short words stay on screen for a fixed amount of time. The manual has info all these, but these settings make stuff very easy to read and follow.
Game.TextReadingSpeed = 7;
Game.MinimumTextDisplayTimeMs = 2000;


Snarky

Quote from: Narehop on Sat 02/06/2018 17:28:58
Thank you for your reply Snarky. I was using SpeechBubble.InvisibleFont = eFontinvisibleFont but actually I had to disable because I saw that my characters doesn't do speech animation. They allways stay quiet and text continues.


Well that's no good. I'll take a look at it. Could you post what SpeechBubble settings you're using and the lines where you call it that aren't animating properly?

Quotebtw I tried to fix the speech speed using this:
Quote from: Ghost on Mon 02/03/2015 01:02:39
You can set how speech (and dialog lines) are skipped in your game's General Settings -> Dialog -> Speed Skipped by...

You can also change the text speed by altering Game.TextReadingSpeed, and finally there is Game.MinimumTextDisplayTimeMs to make sure that even very short words stay on screen for a fixed amount of time. The manual has info all these, but these settings make stuff very easy to read and follow.
Game.TextReadingSpeed = 7;
Game.MinimumTextDisplayTimeMs = 2000;

Those settings are only going to change the speed of text progression when you're NOT holding down a key. AFAIK the only ability you have to control how text is skipped is which keys skip, and whether mouse-clicks skip.

Narehop

Quote from: Snarky on Sun 03/06/2018 07:21:38
Quote from: Narehop on Sat 02/06/2018 17:28:58
Thank you for your reply Snarky. I was using SpeechBubble.InvisibleFont = eFontinvisibleFont but actually I had to disable because I saw that my characters doesn't do speech animation. They allways stay quiet and text continues.


Well that's no good. I'll take a look at it. Could you post what SpeechBubble settings you're using and the lines where you call it that aren't animating properly?

Code: ags

 // Set up the border
  SpeechBubble.Format.BorderRenderMode = eRenderSprite; // Use sprites to render the border
  SpeechBubble.Format.BorderSpriteTopLeft = 1187;  // Sprite index...
  SpeechBubble.Format.BorderSpriteTopRight = 1188;
  SpeechBubble.Format.BorderSpriteBottomRight = 1189;
  SpeechBubble.Format.BorderSpriteBottomLeft = 1190;
  SpeechBubble.Format.BorderSpriteTop = 1194;
  SpeechBubble.Format.BorderSpriteBottom = 1191;
  SpeechBubble.Format.BorderSpriteLeft = 1192;
  SpeechBubble.Format.BorderSpriteRight = 1193;  
 
  // Set up the tail
  SpeechBubble.Format.TailRenderMode = eRenderSprite;  // Use a sprite to render the tail
  SpeechBubble.Format.TailSprite = 1186;
  SpeechBubble.Format.TailTipOffset = 30;  // This is what x-coordinate in the tail sprite the tip is (the pixel that should be over the character's head)
  SpeechBubble.Format.AllowTailSlide = false;  // The tail will always be centered in the bubble
  
  // We set negative padding so the text actually extends into the edge sprites (since they are quite big)
  SpeechBubble.Format.PaddingTop = -10;
  SpeechBubble.Format.PaddingBottom = 5;
  SpeechBubble.Format.PaddingLeft = -5;
  SpeechBubble.Format.PaddingRight = -5;
 
  // General formatting
  SpeechBubble.Format.BackgroundColor = Game.GetColorFromRGB(0, 0, 0);  // Black background
  SpeechBubble.Format.BackgroundTransparency = 40;
  SpeechBubble.Format.TextOutlineWidth = 1;
  SpeechBubble.InvisibleFont = eFontinvisibleFont;


And allways stop animation with any character.

SMF spam blocked by CleanTalk