Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics

Anime Twin Stick Shooter

A topic by DoujinDev created Jul 05, 2019 Views: 1,616 Replies: 20
Viewing posts 1 to 20
(1 edit) (+3)

Hi everyone! I am DoujinDev and this is my First Game Jam, so I am hoping to finish this game in 2 weeks time.

The concept is a twin-stick shooter with anime aesthetic! The first few days will be nailing the framework of the game. Hopefully, I will be able to add compelling artwork nearing the end of the jam. The most important part is the gameplay loop.

Thanks for following my progress!


Yessss this is a really great plan for finishing the jam on time! I can't wait to see what you work on!

Thanks J! And thanks for hosting! :D


Day One

I hit a lot of snags from the onset. I am using the Godot Engine and trying out it's new 3D features. For me, it's a lot more intuitive than Unity and I think it has a lot of potential for growth.

Unfortunately, I found out that Godot has a standing issue with its GridMap for 3D objects. For some reason the Meshes lose their custom material settings. I think this issue is resolved in Godot 3.2, but that has not been released yet, so my workaround was not to use a GridMap and just add a bunch 3D instances directly into the level. It's going to be a bit cluttered, but thankfully, Godot allows me to organize all map items into a single node. And when I start replacing assets with actual 3D stuff, I can create levels in Blender with collision maps.

Since this is a twin stick shooter, I got a 3D project with an isometric camera. I made sure the camera follows the player and that the basic collisions work between player and walls.

Next challenge was having the mouse tracked properly. Since this is 3D, it's not as straightforward as 2D. I had to raycast the position of the mouse to the floor and find where the collision happens. I used a box and positioned it at the location of the collision so I can visualize the mouse tracking.

Then lastly, I made sure that the player rotated towards the mouse position properly.

That solves the first part of the problems with a Twin Stick shooter using Keyboard and Mouse.

To Do List for Day Two

- I have a minor bug to fix with the mouse tracking. 
- Interpolation for the rotation of the player towards the mouse so the character doesn't do "snap" 180s.
- Firing "bullets" in the direction of the mouse
- Setting Enemy "targets" to get hit and die from bullets

If I can get these by Day Two, I'll be happy, with stretch goals of Enemy's "chasing" the player like in Gauntlet and with Enemy Generators that can be Destroyed.

Day Two

Today was fully of doozies. 

The "minor bug" turned out to be quite a fix trying to get around. The main issue is that the mouse tracks and moves a node to where the viewport mouse position intersects the floor. But when the mouse doesn't move, there is no update to the node position. This causes a problem because the player will keep on looking at the node when the mouse isn't actually there. This caused a "jitter" effect when the mouse moved and the node moved to the correct position. Fixing this was a bit of stretch.

Interpolating the player rotation was a BIG learning curve and caused me quite a bit of issues trying to figure out which direction was the actual shortest path - clockwise or counter-clockwise, and then linearly interpolating the directional change.

Once I got that in place, I had to figure out how to fire bullets. I wanted to make both the enemies and bullets into rigid bodies so I could have the enemies recoil from getting hit by a bullet. This will give a lot of player feedback. But I wasn't familiar with the nuances of Godot's rigid body system. I had to turn on things that were normally turned off by default, such as collision detection. And then I was wondering why it was shooting through walls, only to find out that I needed another setting to do "continuous detection" because of the "tunneling" effect. Lots of little things here and there that I had to learn and did so painfully.

This is the result:

I'm just glad I'm in the GameJam, because it kind of "forces" me to bite the bullet and really learn these very basic systems.

To Do List for Day Three

I didn't get to enemies yet. But I'll add them tomorrow.

- I am aiming at getting enemies that you can shoot and knockback with bullets thanks to the RidigBody physics system.
- Enemies turn towards the player
- Enemies slowly chase after the player

And as a stretch goal for tomorrow:

- Enemy spawners

Day Three

Sadly, I was not able to spend as much time programming today that I'd like. I was able to get enemies to show up and get shot. They react to the physics of the bullets. I may want to increase the size of the bullets and or enemy hitboxes...

I also added a "refresh" rate for firing, and a timer so that the bullet doesn't travel infinitely.

To Do List for Day Four

- Enemies Turn towards the Player
- Enemies Move towards the Player
- When the Enemy is hit, it is stunned before it tries to move towards the player again

And a stretch goal:

- Enemy Spawners

Day Four

Ok, I think I'm back on track. Today was fairly straightforward changes.

First, making sure the enemies are all tracking the player!

Also, you'll notice that I put a cylinder to mark the location of the mouse. I figured I'd need some sort of targeting reticle so that the player knows which way they are aiming in relation to enemies on the screen.

Now that the enemies know which direction to face, they can now chase the player!

And now that they are chasing, I'll make sure they get stopped and stunned when shot to give it extra "oomph!"

So today was good!

To Do List for Day Five

- Enemy Spawner
- Map Revision
- Destroying the Enemy Spawner
- Clearing the Stage (Win Condition with Exit and Level Restart)

Stretch Goal:
- Enemy Attack (When in close range)
- Player Death (Lose Condition and Level Restart)

Once the stretch goal is done, I'll have the basic gameplay loop of an Isometric Gauntlet-like game! I'll just have to add the menu structure to play the game and it's pretty much the very very basic game. To be fun, it needs more enemy types, risk/reward structures such as treasure, healing items, and powerups. Really fleshing out the gameplay aspect. I think if I focus on that till the end of the week, I can spend next week really hammering out the aesthetics.

Day Five

A bit of a side trip today. I got the spawner working!

Got a bit excited with it...

Also, the Spawner is now killable.

Side Quest: to finish up with an Exit with an End State, I needed to add Pause functionality. So I added new functionality to pause and unpause the entire game. I'll need that mechanic for the Begin/End transitions to the game.

To Do List for Day Six:

- Transition for Game Start
- Exit Tile
- Transition for Level Clear
- Keys and Doors
- Redo Layout of Level (Perhaps a couple of Levels)

Stretch Goal:
- Enemy Attack 1 (Melee Timer for Striking at Close Distance)
- Enemy Attack 2 (Simple Collision with No Need for Melee Strike)
- Player Death
- Transition  for Game Over

After the Stretch Goals, it's working the Menus. Then it's reskinning.


Day Six

Decided to take a break from programming and do some actual character art. Spent a lot of time on the main character and will be animating her soon. Just a bit of warning because she is very suggestive.

Here is a turnaround. Her resolution will be quite a bit smaller in game. But I think she has a pretty strong silhouette.

I need to work on her animations for attack, movement, getting hit, and death. Maybe a few other custom animations for the menus. In addition, I was trying to model her for a challenge going on for Sketchfab by @MinionsArt for using only small gradient textures. So I figured, I could do both since I needed a 3D character for the game anyway! I think it turned out nicely for a small game.

In either case, I'll be moving my goals that were supposed to be for today to tomorrow.

To Do List for Day Six Seven:

- Transition for Game Start
- Exit Tile
- Transition for Level Clear
- Keys and Doors
- Redo Layout of Level (Perhaps a couple of Levels) 

 Stretch Goal:
- Enemy Attack 1 (Melee Timer for Striking at Close Distance)
- Enemy Attack 2 (Simple Collision with No Need for Melee Strike)
- Player Death
- Transition  for Game Over

Day Seven:

Good day for programming. Not only did I hit my goals, but I completed the stretch goals as well!

First had to get the Start Up screen to fade in, then I got the Exit Tile completed so that the scene can fade out with a win.

Then, I had to figure out the logic for keys and doors. Learned that Rigid bodies don't register impact from Kinematic bodies. So I had to add an additional "sensor" for registering the player getting near a door with a key.

Lastly, I added UI icons to show how many keys and life points you have left. I also added a Game Over state as well.

To Do List for Day Eight:

- Basic Menu Structure for the Game
- Startup Screen
- Instruction Screen
- Credits Screen
- Game Over Screen
- Game Win Screen

Once the menu structure is done, the basic framework is complete. I can start making several levels and coming up with enemy variants. The current enemy only does damage upon initial impact. I may want to change the damage from being individual hearts to a lifebar since it is more of a "draining" effect of keeping in touch over time.

Bug Fix:

- Change Life to be a meter that drains.

In addition, I need to finish up the #GradientChallenge for my Succubus model.

Stretch Goal:

- Add the succubus model into the game with basic movement animations.

Day Eight

I hit all my goals for today. I build the Startup Screen and the transitions to Credits, Quitting, to the Main Loop, and back again to the Menu through the Pause Button.

I decided to remove the Instructions Screen and decided to put instructions into the first level of the game which I will build later. It would be much faster to have the instructions on "billboards" throughout the level rather than having to add an additional screen.

In addition, I changed the life system to be a life bar that drains over time.

To Do List for Day Nine

- Finish Succubus Model for #GradientChallenge
- Add Succubus to Start Screen
- Add Succubus and main animations to Main Loop
- Change Floor and Walls to Textured Dungeon Tiles
- Create Tutorial Level and Level 1.

So going into the next week, it's going to be "polish", "polish", "polish" with some enemy and level variety, power ups, health packs, etc... Possibly adding a boss level before the end of the jam as a super stretch goal!

In addition, a friend of mine volunteered to add music. So I'll be adding some music tracks! Music is already added to the "Start Up" screen!

Side Note: I've found some major issues with Godot's export to HTML5 with the 3D physics engine. I'll have to check it with 2D physics engine, but it looks like I won't be able to export my game as a web game. :(

Day Nine

Taking a break. Will be back on Day Ten for the final stretch this week.

(1 edit)

Day Ten

I've completed the Succubus for the#GradientChallenge by @minionsart on Twitter

This is what it looks like:

You can see and manipulate the actual 3D model here:

I'll be working on incorporating the Succubus into the actual game over the week. I will admit, this is the scariest part for me because this will be the first time I'll be getting any 3D character of mine into a game... So I'm very nervous.

But I have to push through!

Side Note: I've been doing various exports of different 3D games from Godot into HTML5 and none of them seem to be working well... I think that I'll have to experiment with 2D only for HTML5 games in the future.

To Do List for Day Eleven

- Add Succubus to Start Screen
- Add Succubus and main animations to Main Loop
- Change Floor and Walls to Textured Dungeon Tiles
- Create Tutorial Level and Level 1.

Closing in on the final week!

Day Eleven

Today was a painful learning experience. I learned that the gITF exporter from Blender to Godot has a lot of quirks. It seems like mixing Blendshapes with Armatures doesn't seem to work. It might once Godot is able to get FBX importing, but that won't be around for a bit. DAE importing may have it working, but the Collada exporter for Blender 2.8 doesn't seem to be working either. So, I stuck it out with gITF, but only used Armatures. Otherwise I would have the Succubus blinking in the opening screen:

Further, there seems to be a lot of information I'm missing about Animation Trees and blending animations in Godot. I never learned how to use them. I really would like to blend the Succubus's flight and fire movements, but that is more a "polish" than anything else which I may do after the jam.

So for right now, I'll try to get just the basic movement into the game with no blending. It won't be as refined, but it'll get the job done.

I also did a lot of work today incorporating sounds and music into the game. I think the only thing I'm missing is a spawning sound effect, and a "hurt" sound effect from the succubus.

To Do List for Day Twelve 

- Add Succubus and main animations to Main Loop
- Change Floor and Walls to Textured Dungeon Tiles
- Sound Effect for Spawning
- Sound Effect for Getting Hurt
- Swap out Enemy and Spawner with Actual 3D Models

Stretch Goal
- Succubus Animation for Winning the Level
- Succubus Animation for Losing the Level (Dying)


Day Twelve

Man... I'm running out of time! :(

But at least I got the Succubus in-game now!

She's super tiny though...

To Do List for Day Thirteen

Switching around priorities:
- Succubus Animation for Winning the Level
- Succubus Animation for Losing the Level (Dying)
- Sound Effect for Spawning
- Sound Effect for Getting Hurt

Stretch Goals:
- Swap out Enemy and Spawner with Actual 3D Models
- Change Floor and Walls to Textured Dungeon Tiles

Day Thirteen

Finally got the animations for Winning and Losing done. I had to learn that there are differences between Euler and Quaternion rotations in Blender. Doing full 360s with Quaternions is difficult because Quaternion math tends to take the shortest path. So if you go from 0 to 360, it just doesn't move. So depending on the situation, it may be better to use Euler rotations on certain bones than others.

In either case, I got the Win and Lose animations on the Level Complete/You Lose screens.

Hm... I may want to put the Succubus behind "Level Complete"...

To Do List for Day Fourteen

Refine Sound Effects Including:
- Sound Effect for Spawning
- Sound Effect for Getting Hurt
- Music
- Other Sounds

Finish All Enemies
- Swap out Enemy and Spawner with Actual 3D Models with simple animations.
- Change Floor and Walls to Textured Dungeon Tiles

Stretch Goals: Level Design Focus
- Tutorial Level with Instructions
- Level Designs
- Final Win Screen
- Pickups (Health, Attacks)
- Enemy Variations

Day Fourteen

Got an actual enemy model in with a simple animation. Also redid a whole bunch of sounds from SFXR to sounds I got from FreeSounds. I'll be sure to post credits on the actual game. I also replaced the "dot" for an actual fireball with actual sounds. I also did a few bug fixes.

I also confirmed that Blendshapes has issues with the gITF import into Godot. I couldn't get Collada to work. So maybe I'll wait for 3.2 to see if this issue is resolved and if FBX works.

To Do List for Day Fifteen

- Enemy Spawner
- Change Floor and Walls to Textured Dungeon Tiles (I may want to find free resources for textures)
- Tutorial Level with Instructions
- Level Designs
- Pickups (Health, Attacks)
- Enemy Variations

Stretch Goal
- Final Win Screen 

Day Fifteen

Got the Enemy Spawner, textured floors and dungeon tiles working and got the shadows looking right. It looks so much prettier now!

Somehow, I got the HTML5 exporter working. I had to switch to GLES2 and it seems to have fixed most of the problems.

Going into the final 24 hours and I'll be sure to get a lot of rest for the final stretch. It's mostly level design, and adding enemy variations, and powerups.

To Do List for the Final 24 Hours:

- Tutorial Level with Instructions 
- Level Designs 
- Pickups (Health, Attacks) 
- Enemy Variations

Stretch Goal
- Final Boss Battle
- Final Win Screen 

Final Day

Made it with 14 minutes to spare! I completely forgot I had to get screenshots, a thumbnail and all sorts of things to put on the page beforehand! You can play the game both in browser or download to Windows here: 

Thank you for letting me participate in this GameJam!


Post Mortem

I did a couple more bug fixes after the end of the jam. I learned a ton of things over the GameJam including a few nuances of Godot. Also I'm surprised how well Godot was able to use that many 3D objects at once, especially in the HTML5 export. At least on my machine, it handled it well in both Chrome and Firefox.

One of the major issues I have with the design is that the angle and distance makes it too small to really appreciate the characters. If I close the distance, it makes handling the mobs and navigation more difficult. Perhaps I could do that if I switch out the gameplay for more combat rather than mob handling/maze traversal.

I also may need to switch to a more "chibi" style to get more personality out of the characters.

There are a number of things that I realize I have to learn:

  •  Between Level Loading Screens
  • Arm Twist Deformations
  • Animation Blending (This may only be necessary with Twin-Stick or Shooters. Not so necessary for other gameplay styles.)
  • Differences in Materials and Unique Instancing of Materials per Mesh
  • Spatial Material Manipulation and Logic
  • Level Design as an aspect of creating puzzles to solve + emotional impact

There are a number of technical issues that I need to see if they can be resolved in Godot:

  • gITF importing that has a combination of bone animations and blendshapes
  • FBX importing in Godot 3.2 may resolve this issue though

I also learned that with a more compressed 48 hour jam coming up, I'll need to be faster or create even simpler animations or levels or completely switch to 2D. It is difficult to squeeze the right amount of quality with 3D that could come from 2D in such a short period of time.

I certainly hope to do another project with Succubus as a character, but we'll see. There is a lot still to learn and I'm happy (and proud) to have completed this game.