dealing with matrices (arrays)
Moderator: Stef
Re: dealing with matrices (arrays)
thanks for your advices, stef.
I read a little about C, now I know how to make a variable global.
also, I can do what I want to do at this part: two levels and a way to add more levels. thanks again.
here is my small contribution so far, a small platformer example with a simple big map scroll and collisions.
it could not be the clever way to do, but at least it is working.
all the project with some comments in english and portuguese.
https://drive.google.com/file/d/15F-3YR ... sp=sharing
the transition between levels needs a lot of adjustments.
I read a little about C, now I know how to make a variable global.
also, I can do what I want to do at this part: two levels and a way to add more levels. thanks again.
here is my small contribution so far, a small platformer example with a simple big map scroll and collisions.
it could not be the clever way to do, but at least it is working.
all the project with some comments in english and portuguese.
https://drive.google.com/file/d/15F-3YR ... sp=sharing
the transition between levels needs a lot of adjustments.
Re: dealing with matrices (arrays)
I get some trouble when adding some music to the game, I copy + paste the code from sprite example, also copy + paste same vgm music etc. then my game only runs on fusion emulator with music and stops to work on gens (black screen). when I comment the code from the music "//SND_startPlay_XGM(musica);" the game works fine on both emulators. any solution?
The code of the game is the same one I added a link on the last post, I just added the line
"SND_startPlay_XGM(musica);"
where musica refers to the same vgm music from the sprite example.
Gens emulates better than fusion, as the game with music did not play on my mega drive. Withouth music it played.
EDIT: problem with the music solved. I added sound fx, the jump sound, then the game worked 100% and the music played on gens emulator. Later I will test again on mega drive.
also I wanna know if it is possible to destroy a sprite, then create another using the free space that it left on vram tiles and change the animation.
the order I did the commands
1- sprites[1] = SPR_addSprite(&inimigo1, fix32ToInt(inimigoX[0]), fix32ToInt(inimigoY[0]), TILE_ATTR(PAL3, TRUE, FALSE, FALSE)); //add a sprite with animation inimigo1, ok
2- SPR_setVRAMTileIndex(sprites[1],200); //uses the tile index 200, ok
to test the way to destroy the sprite and put another with other animation I press button A, then these commands are executed:
3- SPR_setNeverVisible(sprites[1],TRUE); //truly hides the sprite
4- sprites[1] = SPR_addSprite(&inimigo2, fix32ToInt(inimigoX[0]), fix32ToInt(inimigoY[0]), TILE_ATTR(PAL3, TRUE, FALSE, FALSE)); //add a sprite with a new animation inimigo2, ok
5- SPR_setVRAMTileIndex(sprites[1],200); //goes to the same tile index vram position=200, ok
but if I keep pressing A button, I thought it will clean/delete with never visible, but then the game crashes.
what could I do to avoid the game crashes?
The code of the game is the same one I added a link on the last post, I just added the line
"SND_startPlay_XGM(musica);"
where musica refers to the same vgm music from the sprite example.
Gens emulates better than fusion, as the game with music did not play on my mega drive. Withouth music it played.
EDIT: problem with the music solved. I added sound fx, the jump sound, then the game worked 100% and the music played on gens emulator. Later I will test again on mega drive.
also I wanna know if it is possible to destroy a sprite, then create another using the free space that it left on vram tiles and change the animation.
the order I did the commands
1- sprites[1] = SPR_addSprite(&inimigo1, fix32ToInt(inimigoX[0]), fix32ToInt(inimigoY[0]), TILE_ATTR(PAL3, TRUE, FALSE, FALSE)); //add a sprite with animation inimigo1, ok
2- SPR_setVRAMTileIndex(sprites[1],200); //uses the tile index 200, ok
to test the way to destroy the sprite and put another with other animation I press button A, then these commands are executed:
3- SPR_setNeverVisible(sprites[1],TRUE); //truly hides the sprite
4- sprites[1] = SPR_addSprite(&inimigo2, fix32ToInt(inimigoX[0]), fix32ToInt(inimigoY[0]), TILE_ATTR(PAL3, TRUE, FALSE, FALSE)); //add a sprite with a new animation inimigo2, ok
5- SPR_setVRAMTileIndex(sprites[1],200); //goes to the same tile index vram position=200, ok
but if I keep pressing A button, I thought it will clean/delete with never visible, but then the game crashes.
what could I do to avoid the game crashes?
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Re: dealing with matrices (arrays)
Well done ! To delete / remove a sprite you need to use SPR_releaseSprite(..) method Here you were just hiding it, it was always allocated internally (still that doesn't really explain the crash).
Re: dealing with matrices (arrays)
as it is just hiding the sprite, maybe the crash (game stop and hide all sprites) is that it passes the max limit of 16 sprites that is set at "SPR_init(16, 256, 256);".
I will take a look at this "SPR_releaseSprite(..)" thanks
EDIT: with "SPR_releaseSprite(..)" it works 100% ok. really nice.
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Re: dealing with matrices (arrays)
Oh 16 sprites, indeed you were probably quickly reaching the limit then Glad you fixed it =)
Re: dealing with matrices (arrays)
Thanks.
I was just testing the sprite engine.
Now I am trying to move enemies over the screen. My code needs lots of improvements.
When I used BEX, I could control 6 enemies + player + 1 bullet that player shoots. Using a loop to make the enemies move.
Now, with SGDK, unfortunately, I can control only 4 enemies + player + 1 bullet, with a little slow down. The better I can get with no slow down is: 2 enemies + player + 1 bullet.
Even just showing more sprites with that code that I posted here, the limitations are the same 4 sprites.
Maybe I am using numbers too big to handle at the code as I am using lots of "<<6" and "<<11".
EDIT: or I am not using the engine correctly with the FIX32 and so on. I have to take a look at this. I will study carefully the sprite example.
Re: dealing with matrices (arrays)
my problem was so simple to solve, it was the way I was using rescomp, I setted everything to BEST, when I changed to FAST, I get out of problems.
now the game runs ok, even better: 8 enemies + bullet + player; I will see how many enemies I can add with just one loop to control everything.
now the game runs ok, even better: 8 enemies + bullet + player; I will see how many enemies I can add with just one loop to control everything.
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Re: dealing with matrices (arrays)
Oh yeah indeed this is the compression used for your images
For sprite it's recommended to set to NONE (no compression) or FAST (fast compression) if you plan to use dynamic VRAM upload (mean it will unpack and upload tiles on the fly), for static VRAM allocation you can use BEST compression as it will be done once only.
For sprite it's recommended to set to NONE (no compression) or FAST (fast compression) if you plan to use dynamic VRAM upload (mean it will unpack and upload tiles on the fly), for static VRAM allocation you can use BEST compression as it will be done once only.
Re: dealing with matrices (arrays)
Hello again.
Maybe I did not search very well, my doubt is:
Is there any code to enable/disable screen?
In BEX there is a simple code to do it.
I am trying to hide some glitches when drawing on plane A and B, when changing between screen, for example: start screen to first stage.
On emulator it is working ok when changing screens, but on mega drive some tiles remain on screen. If there is no code to do it in a simple way: I will try to set all palettes black.
Maybe I did not search very well, my doubt is:
Is there any code to enable/disable screen?
In BEX there is a simple code to do it.
I am trying to hide some glitches when drawing on plane A and B, when changing between screen, for example: start screen to first stage.
On emulator it is working ok when changing screens, but on mega drive some tiles remain on screen. If there is no code to do it in a simple way: I will try to set all palettes black.
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Re: dealing with matrices (arrays)
You can use VDP_setEnable(..) method to quickly disabled / enabled display
Re: dealing with matrices (arrays)
Thanks again!
It works in part, but sometime the screen freezes at black screen.. I solved the problem when setting all the palettes black.
Everything is working fine.
I will upload the rom of the game soon.. just making more levels. Wait for it.
It works in part, but sometime the screen freezes at black screen.. I solved the problem when setting all the palettes black.
Everything is working fine.
I will upload the rom of the game soon.. just making more levels. Wait for it.
Re: dealing with matrices (arrays)
And what has to do disabling render with palettes? Probably you have found a bug that appears and disappears depending on the code around.
Anyway try to do a fade in since is much better visually.
Anyway try to do a fade in since is much better visually.
HELP. Spanish TVs are brain washing people to be hostile to me.
Re: dealing with matrices (arrays)
I may add a fade in.
It is a really small visual problem.. some garbage tiles keeps randomly appearing on screen when transition between levels.
It happened in this old game called "I hate cars" (english translation of "odeio carros") that I made with BEX before I learnt how to disable screen. On emulator works fine, but on real hardware you can see the garbage tiles that I mention when go to other level or restart a level (pressing A).
https://youtu.be/nmXX0rMg5sA
Re: dealing with matrices (arrays)
For "stop and load" games (those that only load between levels) the following procedure is observed:
1- A "end level" condition is detected
2- Some changes to the behaviour of characters is applied to forbid the game to continue in regular conditions (like main character dead)
3- Fade in is started (SGDK has it build in, I think)
4- On fade in completed, game is completely stopped, and loading commences (level, gfx,...). You could disable render to access faster to vdp.
5- On finish loading, characters are resituated (perhaps initialized), level vars (like scroll) set and fade out is started. Game starts.
1- A "end level" condition is detected
2- Some changes to the behaviour of characters is applied to forbid the game to continue in regular conditions (like main character dead)
3- Fade in is started (SGDK has it build in, I think)
4- On fade in completed, game is completely stopped, and loading commences (level, gfx,...). You could disable render to access faster to vdp.
5- On finish loading, characters are resituated (perhaps initialized), level vars (like scroll) set and fade out is started. Game starts.
HELP. Spanish TVs are brain washing people to be hostile to me.
Re: dealing with matrices (arrays)
I followed the tip of Stef to use the 64x64 screen size.
I do not understand about those address, but I get some trouble when using the 64x64 plan size with those address.
The problem was related with sprites: I add 4 sprites on screen, then the forth sprite didnt show.
When I erased the command line "VDP_setSpriteListAddress(0xBC00);" the 4 sprites were on screen.
I dont know if without this command "VDP_setSpriteListAddress(0xBC00);" I will get into trouble in the future.
Code: Select all
VDP_setPlanSize(64, 64);
VDP_setWindowAddress(0xB000);
VDP_setSpriteListAddress(0xBC00);
VDP_setHScrollTableAddress(0xB800);
VDP_setBPlanAddress(0xC000);
VDP_setAPlanAddress(0xE000);
The problem was related with sprites: I add 4 sprites on screen, then the forth sprite didnt show.
When I erased the command line "VDP_setSpriteListAddress(0xBC00);" the 4 sprites were on screen.
I dont know if without this command "VDP_setSpriteListAddress(0xBC00);" I will get into trouble in the future.