MichaelSinsbeck / platformer

A ninja platformer written in LÖVE
7 stars 0 forks source link

Obtaining new Bandanas - and NPCs #213

Closed Germanunkol closed 7 years ago

Germanunkol commented 10 years ago

A few thoughts I had:

Overall, I think we should base the "story" around obtaining bandanas. Maybe there's a ninja-master who somehow hands out the bandana at the end of each world. Or the enemies of the ninjas' tribe took the bandanas away (leaving the ninjas helpless) and now he has to get them back, restoring the ninjas' power.

What are your thoughts/plans?

michalove commented 10 years ago

My initial plan was to put one almost-empty level between each world in which the new bandana is obtained. In some playtests the testers did not even notice the different color. The plan was something like this:

You are right in that the player should already collect the white bandana in the very beginning. The emphasizes the game concept.

One technical question: Can we have in-game objects at the moment, that display a text, when the player touches them? That would be the simplest way of implementing the old guy: Then the player is close to him, his text should appear right above him.

Germanunkol commented 10 years ago

That should be doable somehow. As long as there's no shader active, text should get rendered fine, I think when a full-screen-shader is active then text might not render. But this is never the case (only when fading to grey - so the text would be invisible in the pause menu and upon death - this should not be an issue).

If all else fails, we can still make visualizers that display the text (prerendered pictures)

I like the concept. Showing the player's face however might not look too great, I can't tell. We'll have to try it.

michalove commented 10 years ago

I just committed a first draft for the npc: When the player is close, then a text is displayed. Now comes the difficult part of drawing this guy.

In case we need to communicate something with wooden signs, we can simply extend this object and replace the image.

I had to change the implementation of the visualizer a bit to make the text wrap. I have probably broken the "input" object. We will have to check this later.

michalove commented 10 years ago

Here are two attempts for drawing an old man. bandana_alter_mann2 I am not happy with both of them, but maybe you have some feedback? I think they are both missing "attitude". The guy should not just stand there, but express something.

Germanunkol commented 10 years ago

I already like them! It would be cool if the old guy would be quite a bit taller than the ninja (like the one on the right, maybe even a bit taller - more like two tiles rather than one), it would make the ninja look small and cute.

When I first heard the idea with the old guy, I immediately imagined him sitting down, cross legged. It would be hard to cross his legs, though - since they don't have knees and are short (if we stick to the same shape as the ninja). Otherwise, a staff he leans on would also be nice.

Btw, all old ninjas/samurais seem to have bushy eyebrows in addition to that long bushy beard: http://www.thejrexperiment.com/wp-content/uploads/2012/09/ninja-master.jpg http://www.fubiz.net/wp-content/uploads/2013/02/The-Old-Samurai6-640x264.png

He could also have a (sheathed) sword, maybe on his back.

michalove commented 10 years ago

Thanks for the feedback. That gives me some idea what to try next.

michalove commented 10 years ago

Here is a new try. I like it much better. bandana_alter_mann3

I asked some friends to draw old asian men. Here are the drawings, from which I made the draft. npc1 npc2 npc3

Germanunkol commented 10 years ago

Yes. I agree, this looks great! His feet look very different to those of the ninja. But that might be fine if he stands further back ("behind" the ninja), I can't quite tell yet.

Germanunkol commented 10 years ago

You added a text property. I'll go ahead and see if we can add a text box to the properties panel - I think that'll be much nicer for users (that way they can create text content in their levels, too). Edit: Done, that was quicker than expected. You can now enter any text in the NPC object's properties panel. Do you like it this way? Or would you rather have predefined texts as you did before?

michalove commented 10 years ago

I like it. I was thinking about text properties before, but I thought it would take too much time. Thanks for implementing.

The only thing I noticed: I didn't know that I need to press return to "save" the changes. Could it work without a return? I think we will never have multiple text boxes, so there will be no confict(?).

michalove commented 10 years ago

I started implementing the bandana upgrade functionality. In the campaign, there is an additional variable "bandana" which is the current bandana. When a campaign level is started, the player color and abilities are set accordingly.

Go and try out playing the first level. I set the starting color to "blank" and in the first level you now get the white bandana (thanks for that good idea).

There are some open issues. I will hopefully implement them later this week:

Germanunkol commented 10 years ago

The text is now saved even when "clicking away", i.e. clicking outside of the properties box. There might be bugs (there's so many different combinations of things people can press and do, it's hard to keep them all in mind), but I think it works.

The way the first level works is awesome (the small jump of the ninja is very cute), but I'm not too fond of the layout yet. Maybe with some sort of background story, this could work... but the way it is now, it's just very random. Why is that old guy standing there? Why does he say that stuff? Who is he?

I think at least some of those questions should be answered. If not in a cut scene, then in the level.

Here's an idea I had (the mechanics of the level would stay the same, just the layout would differ) One way this could be implemented: Ninja is in the forest, counting next to a tree, eyes closed (fixed animation). "95 ... 96 .. 97 .. 98 .. 99 ... 100, coming!" Ninja stops counting and you have to start searching for the other ninja kids. But you can't find them. After moving through the forest for a few seconds, ninja says: "Huh, where is everyone?" Keep moving right and a short while later, a text appears: "HEY, YOU!" After another few meters: "Yes, you! Come back to town. Hurry!" When approaching the town, you see the old guy standing in front of the city wall. He says he's been hiding and explains that everyone has fled when the big [name of the end boss] reached the city. The old guy says he's too old to do it, so you have to defeat [name of the end boss]. But to do so, you need to gain the strength (i.e. collect the bandanas) to become a real ninja.

So he gives you the first white Bandana so you can jump over the wall into the city and follow the [name of end boss].

This is just a random idea, and we don't have to use it, but something along these lines could be the simplest way of motivating some sort of background story.

michalove commented 10 years ago

I agree that we now have to think of the background story.

I like the scene that you describe. Technically it is totally doable (mainly walking around and displaying text, plus some extra animations) and it clearly communicates the idea(why are you doing this, what is the aim of the game).

I would be even cooler if we could expand all the bandana-levels (where you get a new one) such that they tell the whole story. But that would be a lot of creative and technical extra work. Having the very first level and the end boss would be enough as a bare-bone story. Everything else is a "nice to have". That means we need to be able to "script" text events. We could simply add "text display objects" to the game objects. They would have a position and radius. When the player walks into it, some text is displayed for a certain time. The text could be displayed above the player or anywhere on the map (this can all be controlled with properties in the editor).

I had an additional idea regarding the background story. Maybe we can combine it with yours. I recently watched the video series "Tropes vs. Women" http://www.youtube.com/user/feministfrequency

The series is a bit long, but I think worth watching. There are two patterns in video games, that I wanted to avoid. First, "Damsel in Distress", the motive of having a male hero rescue his helpless girl. I wanted to invert this by having a female main character. The current ninja image is so far neutral, so we can easily define it as a girl (we could call her "Kunoichi" http://de.wikipedia.org/wiki/Kunoichi) Second, "gender signifiers". These are symbols attached to characters to tell their gender. This is usually pink color, long eyelashes and so on for women. I would like to leave these away. In other words, leave the ninja image as it is and just define the ninja as a girl.

In the end credits, she will take of her hood and show her face (much like in the original Metroid game) so the players see, it is a girl.

Germanunkol commented 10 years ago

I love that idea with the girl, especially if it's only truly revealed in the end. That's cool!

And yes, I fully agree that we should first only tell the story in the first (and last) level, and later add inbetween bits if we find the time.

I think it might be nice if we modified the NPC-object such that it's invisible, and the old guy is a seperate object. That way we can place the text object above the old guy, or we can place it somewhere else, without the old guy. Then we could create a similar object which lets the player say things instead (i.e. the text floats above the player's head while he's close to something). Of course we can easily add timers to it as well. So we would have:

michalove commented 10 years ago

Good idea to separate the npc appearance from the text. That way we can also make signs with text and npcs with different appearance.

I think static text and tracking text can be merged into one by having a property that can be "here" and "on player".

Next question: How do we trigger the text? We said text can be triggered by region or by timer. We could combine these by always having a region and a timer. One can set the timer to zero, if only the region counts and one can set the region to infinite size, if only the timer should count. This combination allows to make dialogs and triggered dialogs.

And the text should have a white, semi-transparent rectangle behind it, so that it is easier to read.

Germanunkol commented 10 years ago

I second the white rectangle, and also the idea of making the text just one object, with both timer and region. But don't we need two timers - one for starting the text and one for shutting down?

I think it might look cool if the rectangle is not a perfect rectangle, but instead has all 4 corners offset by a random, tiny amount (5 pixels or so). Sort of like the other boxes we have in the game. We could also think about a very subtle pop-up animation (maybe scale it up and down again, just a bit, when it pops up? Or make it shake a little?)

michalove commented 10 years ago

Yes, right. Two timers.

EDIT: And we need some booleans to specify, whether the text should disappear, when the player moves away (sign) or stay there until the delay timer runs out (dialog). And another property should specify if a text event can be triggered multiple times or only once.

I like box-imperfections. So, yes lets do it. And the animation is a good idea, too. I suggest a mix of scale up and fade in (transparency-wise).

How do we implement this easiest? Could we create a new image on level start (imageData) and then use this? Or is it straight forward to scale text, too?

Germanunkol commented 10 years ago

I've used ImageData on trAInsported - it was so slow I had to put it into seperate threads. And even if we create an ImageData, we'll still need to scale that. So I think we should try scaling text. I haven't tried it, but it should work... I think love.graphics.polygon, love.graphics.scale and love.graphics.print/printf would be the best options here - at least for starters.

michalove commented 10 years ago

Good.

One more idea: Could we add the possibility to display text in a speech bubble? http://www.freestockphotos.biz/pictures/15/15679/Illustration+of+a+cartoon+speech+bubble.png

Either all of the text can be in speech bubbles (maybe that is sufficient) or it is one option and the user can choose "speech bubble" or "box". The box could be for a narrator-type of text or for signs.

Germanunkol commented 10 years ago

The only trouble I see with speech-bubbles is that the placement might be a little frustrating, unless it updates in the editor in real-time (so you can see where the pointy end points, which should be pointing at the sign/npc) and that I don't know how we'd do a "calling" function with such a speech bubble - so we'd need the option to disable the pointy part?

Here's an idea: The left part is a polygon (love.graphics.polygon, here with around 8 vertecies) and the centre part (the pointy part) is an image. If we don't make the bubble transparent, we can use these two parts to dynamically create bubbles according to text size and other needs.

bubbles

We could add a property "pointer", with the values "none", "below" and "above", which would move the pointy part accordingly.

michalove commented 10 years ago

I will try, if real-time updating in the editor is possible. If so, we go for one polygon. If not, we find some other solution.

michalove commented 10 years ago

I split this issue in two: This one is for text display. The other one is for obtaining new bandanas.

michalove commented 10 years ago

A first version for the text object is implemented. There is a lot to discuss:

Germanunkol commented 10 years ago

I definitely like the way it pops up. That's good, we should leave it this way. I don't mind the way it disappears, I find it all right as well. We could think about making it move slightly up or downwards while appearing and disappearing (though not too much). The fact that you don't scale the text is good, too. I would leave it that way.

I think it might be nice if an extra speechbubble pointer was optional, so that we can have plain boxes for signs and speechbubbles when people talk.

I think we shouldn't round it off too much - it's good if it's rectangular like the rest of the world.

Yes, we should probably split it into multiple objects. The region-based popup could keep the same symbol it has now and the timer popup could have an additional watch-symbol on the image.

Germanunkol commented 10 years ago

Update: I made the lines of the text boxes fuzzy. Think it looks better - what do you think? Update 2: I also added a small speechbubble pointy part. As mentioned above, we could disable it for signs and enable it for speech (as another property).

michalove commented 10 years ago

Nice, I like both changes.