Discussion about software development for the old-school Gameboys, ranging from the "Gray brick" to Gameboy Color
(Launched in 2008)
You are not logged in.
Hi, I want to share with you the latest status of my project. Genesis is a shooter which is inspired by Solar Striker or Nemesis. The game features at the moment two levels and five different powerups.
Here are some screenshots:
Here you can downlaod the demo:
https://drive.google.com/open?id=1M_QRm … gEzlEYz0Yw
I would be glad about some feedback!
Last edited by 0x7f (2019-12-29 07:52:09)
Offline
Sorry I don't have any feedback, but awesome game so far!
Offline
Hi h0tp3ngu1n,
thanks. Do you find the "one hit game over" concept is to hard? I thought about a life system which is quite common for such games but since the difficulty is not high I decided to make it this way.
Offline
I think it works. I personally find it to be hard, but it's not frustrating. It feels like an arcade game, where you constantly lose and keep putting more quarters in until you eventually beat it (or lose all your money trying, lol)
Offline
Looks good and very much like a Solar Striker clone. I'm working on a similar project but don't have anything to show yet.
I think you should give the player more than one life simply because that's what you expect when you play a game of this kind.
Also, I think the difficulty is not very challenging. I'm normally very bad when it comes to playing shmups, but in this case it took me only a few tries to beat stage 1. When I arrived at stage 2, I beat it in my first attempt (including the boss).
Anyways, well done and keep working on it!
Last edited by Jonas (2020-01-04 18:47:17)
Offline
One hit game overs are fine as long as it feels like the game is playing fair. The learning curve set by presenting different enemy behaviors one at a time helps a lot with that.
Offline
Hi Jonas,
yes, because of the missing life system I wanted to make the game not too hard. The coming stages will be more difficult. It also depends on the powerups you get. With a good weapon it is easy to beat the boss.
Offline
Thanks for sharing the game!
The gameplay and movement feel good. They have the the right speed and pace. The graphics look good too.
A pause feature would be nice.
A shield power-up can be nice middle ground in a one-life game.
Offline
Hi bbbbbr,
thanks! I already have implemented pause feature in the latest version. The shield powerup is a good idea. Maybe I will add this...
Offline
Hi,
I completed Genesis and added the following features:
- 4 levels
- New title screen with high score
- HUD with shield energy, weapon energy and score
- New shield powerup
Here you can download the final ROM:
https://drive.google.com/open?id=1cItIW … bCpQDkGe43
I programmed the game with 100% GBDK. Hope you like it!
Offline
Great update, the gradual increase in difficulty keeps it engaging.
I'm always interested in process and tools- if you have anything you'd like to share about what you used to make the game or how it was made, it would be interesting to hear.
Last edited by bbbbbr (2020-02-13 16:35:34)
Offline
Hi,
I just used the Gameboy Tile Designer and Map Builder together with GDBK-N and the latest SDCC 3.9.0. To fix the banking problem of GBDK-N I used the standard GBDK linker instead of the one comming with GBDK-N (thanks to Zalo for the hint). Let me know if you want to know any programming details.
Yes, the game is finished and I stopped working on it.
Offline
I gave it another try over the weekend and it's really entertaining to play.
In the first stage it's a bit too easy to dodge the enemies and bullets, but I keep dying in the third stage. That's where I regularly die in Solar Striker, so the overall difficulty seems to be just right.
I like that the enemy projectiles aim very precisely, maybe you could give us some detail on how that is done.
Offline
Hi Jonas, sure.
the enemy shots are generated using the bresenham's line algorithm by drawing a line from the enemy to the player. The algorithm uses only additions and a division by two which can be done with a right shift.
Offline
Here is a longplay for Genesis.
https://www.youtube.com/watch?v=EVlsc2Z804Q
Last edited by 0x7f (2020-04-14 13:51:21)
Offline
Hi Zalo,
here is the source code.
https://drive.google.com/open?id=1itPAt … xg7N0wXmLP
Offline
just played, pretty fun game.
Wish I had more lives.
Offline
The source code is available in the link above... If you want you can reduce the damage and compile it again.
Last edited by 0x7f (2020-05-06 13:04:22)
Offline
calculated the profiling statistics... impressed!
_main:_init_registers MIN: 68 AVG: 68.00 95P: 68 MAX: 68 TOTAL: 0x0000000000000044 NCALLS: 1 _main:_init_title:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x0000000000001c48 NCALLS: 40 _main:_init_title:_set_music MIN: 1567 AVG: 1567.00 95P: 1567 MAX: 1567 TOTAL: 0x000000000000061f NCALLS: 1 _main:_init_title MIN: 33964 AVG: 33964.00 95P: 33964 MAX: 33964 TOTAL: 0x00000000000084ac NCALLS: 1 _main:_update_title:_play_music MIN: 25 AVG: 64.63 95P: 208 MAX: 406 TOTAL: 0x00000000000057db NCALLS: 348 _main:_update_title:_play_sound MIN: 28 AVG: 35.47 95P: 28 MAX: 181 TOTAL: 0x0000000000003039 NCALLS: 348 _main:_update_title MIN: 104 AVG: 474.86 95P: 837 MAX: 96966 TOTAL: 0x0000000000028584 NCALLS: 348 _main:_lcd_isr MIN: 8 AVG: 8.00 95P: 8 MAX: 8 TOTAL: 0x0000000000005a18 NCALLS: 2883 _main:_vbl_isr MIN: 8 AVG: 8.00 95P: 8 MAX: 8 TOTAL: 0x0000000000005a10 NCALLS: 2882 _main:_update_title:_set_sound MIN: 89 AVG: 89.00 95P: 89 MAX: 89 TOTAL: 0x0000000000000059 NCALLS: 1 _main:_update_title:_init_stage:_lcd_isr MIN: 8 AVG: 8.00 95P: 8 MAX: 8 TOTAL: 0x0000000000000028 NCALLS: 5 _main:_update_title:_init_stage:_vbl_isr MIN: 8 AVG: 8.00 95P: 8 MAX: 8 TOTAL: 0x0000000000000028 NCALLS: 5 _main:_update_title:_init_stage:_get_sprite MIN: 53 AVG: 182.50 95P: 312 MAX: 312 TOTAL: 0x00000000000005b4 NCALLS: 8 _main:_update_title:_init_stage:_update_hud MIN: 951 AVG: 966.33 95P: 988 MAX: 988 TOTAL: 0x0000000000000b53 NCALLS: 3 _main:_update_title:_init_stage:_stop_music MIN: 26 AVG: 26.00 95P: 26 MAX: 26 TOTAL: 0x000000000000001a NCALLS: 1 _main:_update_title:_init_stage:_set_music MIN: 1567 AVG: 1567.00 95P: 1567 MAX: 1567 TOTAL: 0x000000000000061f NCALLS: 1 _main:_update_title:_init_stage MIN: 95038 AVG: 95038.00 95P: 95038 MAX: 95038 TOTAL: 0x000000000001733e NCALLS: 1 _main:_update_stage:_update_player MIN: 28 AVG: 284.22 95P: 441 MAX: 2602 TOTAL: 0x00000000000afd4c NCALLS: 2534 _main:_update_stage:_update_player_shots MIN: 301 AVG: 431.35 95P: 715 MAX: 1136 TOTAL: 0x000000000010adab NCALLS: 2534 _main:_update_stage:_update_powerup MIN: 10 AVG: 16.87 95P: 23 MAX: 223 TOTAL: 0x000000000000a703 NCALLS: 2534 _main:_update_stage:_update_enemys MIN: 301 AVG: 1199.40 95P: 3369 MAX: 4538 TOTAL: 0x00000000002e6035 NCALLS: 2534 _main:_update_stage:_update_big_enemy MIN: 10 AVG: 10.00 95P: 10 MAX: 10 TOTAL: 0x00000000000062fc NCALLS: 2534 _main:_update_stage:_update_enemy_shots MIN: 301 AVG: 301.00 95P: 301 MAX: 301 TOTAL: 0x00000000000ba36e NCALLS: 2534 _main:_update_stage:_update_explosions MIN: 301 AVG: 321.19 95P: 402 MAX: 1409 TOTAL: 0x00000000000c6b42 NCALLS: 2534 _main:_update_stage:_update_collisions MIN: 596 AVG: 960.32 95P: 1780 MAX: 7941 TOTAL: 0x00000000002521ac NCALLS: 2534 _main:_update_stage:_play_music MIN: 25 AVG: 82.62 95P: 317 MAX: 419 TOTAL: 0x00000000000331d1 NCALLS: 2534 _main:_update_stage:_play_sound MIN: 28 AVG: 69.09 95P: 181 MAX: 313 TOTAL: 0x000000000002abea NCALLS: 2534 _main:_update_stage MIN: 2125 AVG: 4012.40 95P: 7279 MAX: 53003 TOTAL: 0x00000000009b3422 NCALLS: 2535 _main:_update_stage:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x000000000000043e NCALLS: 6 _main:_update_stage:_new_enemy:_get_sprite MIN: 53 AVG: 208.50 95P: 460 MAX: 534 TOTAL: 0x0000000000003c45 NCALLS: 74 _main:_update_stage:_new_enemy MIN: 869 AVG: 1197.73 95P: 1744 MAX: 1892 TOTAL: 0x000000000000ad1c NCALLS: 37 _main:_update_stage:_update_enemys:_get_mov_data MIN: 113 AVG: 113.00 95P: 113 MAX: 113 TOTAL: 0x0000000000051a90 NCALLS: 2960 _main:_update_stage:_update_player:_set_sound MIN: 89 AVG: 89.00 95P: 89 MAX: 89 TOTAL: 0x00000000000016f2 NCALLS: 66 _main:_update_stage:_update_player:_new_player_shot:_get_sprite MIN: 53 AVG: 178.58 95P: 423 MAX: 497 TOTAL: 0x0000000000002e0a NCALLS: 66 _main:_update_stage:_update_player:_new_player_shot MIN: 443 AVG: 586.17 95P: 821 MAX: 893 TOTAL: 0x000000000000971f NCALLS: 66 _main:_update_stage:_update_collisions:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x00000000000037db NCALLS: 79 _main:_update_stage:_update_collisions:_new_explosion:_get_sprite MIN: 53 AVG: 141.03 95P: 460 MAX: 497 TOTAL: 0x0000000000001ff4 NCALLS: 58 _main:_update_stage:_update_collisions:_new_explosion:_set_sound MIN: 89 AVG: 89.00 95P: 89 MAX: 89 TOTAL: 0x0000000000000a15 NCALLS: 29 _main:_update_stage:_update_collisions:_new_explosion MIN: 850 AVG: 997.14 95P: 1629 MAX: 1664 TOTAL: 0x00000000000070f5 NCALLS: 29 _main:_update_stage:_update_collisions:_update_hud MIN: 887 AVG: 950.09 95P: 1007 MAX: 1019 TOTAL: 0x0000000000007a79 NCALLS: 33 _main:_update_stage:_update_explosions:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x0000000000002902 NCALLS: 58 _main:_update_stage:_update_player_shots:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x00000000000022a5 NCALLS: 49 _main:_update_stage:_update_collisions:_set_sound MIN: 89 AVG: 89.00 95P: 89 MAX: 89 TOTAL: 0x0000000000000321 NCALLS: 9 _main:_update_stage:_update_collisions:_random MIN: 55 AVG: 55.00 95P: 55 MAX: 55 TOTAL: 0x00000000000000a5 NCALLS: 3 _main:_update_stage:_update_collisions:_new_powerup:_get_sprite MIN: 423 AVG: 478.50 95P: 534 MAX: 534 TOTAL: 0x000000000000077a NCALLS: 4 _main:_update_stage:_update_collisions:_new_powerup MIN: 11 AVG: 980.33 95P: 1539 MAX: 1539 TOTAL: 0x0000000000000b7d NCALLS: 3 _main:_update_stage:_update_player:_update_hud MIN: 924 AVG: 974.91 95P: 1028 MAX: 1030 TOTAL: 0x000000000000a790 NCALLS: 44 _main:_update_stage:_update_enemys:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x0000000000000cba NCALLS: 18 _main:_update_stage:_get_sprite MIN: 53 AVG: 182.50 95P: 312 MAX: 312 TOTAL: 0x00000000000005b4 NCALLS: 8 _main:_update_stage:_lcd_isr MIN: 8 AVG: 8.00 95P: 8 MAX: 8 TOTAL: 0x0000000000000008 NCALLS: 1 _main:_update_stage:_vbl_isr MIN: 8 AVG: 8.00 95P: 8 MAX: 8 TOTAL: 0x0000000000000008 NCALLS: 1 _main:_update_stage:_update_highscore MIN: 123 AVG: 123.00 95P: 123 MAX: 123 TOTAL: 0x000000000000007b NCALLS: 1 _main:_update_stage:_init_title:_clear_sprite MIN: 181 AVG: 181.00 95P: 181 MAX: 181 TOTAL: 0x0000000000001c48 NCALLS: 40 _main:_update_stage:_init_title:_set_music MIN: 1567 AVG: 1567.00 95P: 1567 MAX: 1567 TOTAL: 0x000000000000061f NCALLS: 1 _main:_update_stage:_init_title MIN: 33964 AVG: 33964.00 95P: 33964 MAX: 33964 TOTAL: 0x00000000000084ac NCALLS: 1
ps: added 95 percentile (95% of calls are faster than value)
Last edited by toxa (2020-05-21 04:58:54)
Offline
I played it and it is really fun, great job!
One question (before I dive into the sources): How do you layout the level (enemy spawning in particular)? Is it random or are there any spawn points?
Offline
Hi, no the levels are not random. I have for each level a big array holding all the information. In detail one enemy is represented by 6 bytes in the array:
1 Counter defining the number of frames before the enemy is generated
2 Action
3 X position
4 Y position
5 Type
6 Move option
A stage_counter is load with the first byte and then decreased every frame. When the stage_counter reaches zero the enemy is generated. You can find the mechanics in the update_stage function.
Last edited by 0x7f (2020-05-24 13:28:32)
Offline