Nice job and a perfect game to learn the basics on.
I had a sneak peek at the code and can see @Pharap’s influence all over it. If you kept up with him, you would have learnt a lot - forward declarations, default constructors (using the keyword default and void parameters) and so on. I bet he didn’t use the keyword ‘and’ or ‘or’ and I bet he nagged you about enumerating the gscreen and gstate values
I have never heard of ‘Cat’s Game’ in Noughts and Crosses.
I like the titlescreen graphic the most, it’s very polished.
I think the last version I tried was before sound was added, the sounds are pretty neat.
One small thing that I didn’t notice before: arduboy.audio.on() forces the sound on and ignores the Arduboy’s settings.
You might want to change that to an arduboy.audio.begin() so that kids can play late at night without waking their parents. :P
I bet you’ve been following the thread you cheat :P
Seriously though, I forgot to mention gstate and gscreen.
I think @Pygasm is planning to move on to his next game now though, so I don’t know if it’s worth brining it up.
Nor had I.
I’d never heard of it, but I just read the plot on Wikipedia.
Looks interesting.
Reminds me of Short Circuit and Short Circuit 2 (also from the 80s).
While I think of it: I like that more and more people are making their own splash screens, I think it gives games character.
Since the game is only ~12000 bytes, why not call arduboy.begin() instead of arduboy.boot() and arduboy.audio.begin()? boot() and audio.begin() will be called by arduboy.begin().
Games are never finished … they can always be improved.
Im going to add board saving and for the hell of it change gstate and gscreen to enums
I have never heard of ‘Cat’s Game’ in Noughts and Crosses.
I learned it when I was young and it stuck with me. Not sure if it just an american thing or not but it what you called a draw in tic-tac-toe.
Since the game is only ~12000 bytes, why not call arduboy.begin() instead of arduboy.boot() and arduboy.audio.begin()? boot() and audio.begin() will be called by arduboy.begin().
I have my own custom splash that arduboy.begin overrides so i used boot in order to have my own splash.
The only thing missing from what begin() does is the boot logo and the wait for no buttons being pressed. Since there’s plenty of code space available, what’s wrong with just doing arduboy.begin()?
I presume at least part of the reason @Pygasm chose boot was to miss out the boot logo.
I know you’re going to say “it can now be disabled by the EEPROM flag, so why not leave it in and let the players decide”.
But some people prefer leaving out the logo even on the final version, whether they need the space or not.
Maybe it’s time we all sat down and had a discussion about it?
Perhaps with a poll to gather opinions?
Normally I would have included it but in this case I left out the buttons thing because @Pygasm is using a delay at the start.
I was assuming the button waiting was just to prevent someone accidentally skipping the titlescreen, but perhaps they serve some purpose I’m unaware of?
While I think of it, perhaps the splash screen should have been a state and used a time/frame counter instead of a delay, but frankly @Pygasm 's put a lot of work into get it going and patiently listened to my ramblings so I’m happy to let him off on that one if he just wants to add the EEPROM saving and call this project done.
Yes, it was if someone used RIGHT to skip the logo. RIGHT would still be pressed when the actual sketch was entered and might trigger something that the sketch used RIGHT for when it started. The flashlight feature used to need it, as well, but it no longer exits.
It’s also there for any future features that might have the same problem. I decided that it would be good to guarantee that no buttons were pressed when the actual sketch was entered. It’s easier to do this globally at the end, instead of in each function.
I want to suggest something: a function called beginNoLogo(). This function will do every function in begin, but will exclude the boot logo. Even better is a function called beginCustomLogo() which you could pass your own image and coords to be drawn.
The original Arduboy library had beginNoLogo(). It was replaced by using boot() and then following it with the desired functions, so you could pick and choose what you desired, based on how much code space you wanted to recover. Otherwise we would need:
beginNoLogo() beginNoSystemButtons() beginNoLogoAndNoSystemButtons() beginNoFlashlight() beginNoLogoAndNoFlashlight
etc.
etc.
So in this case it doesn’t make much difference because of the enforced delay. If it were to do anything like that it would have to be used after the delay.
I’d somewhat disagree there.
I’ve seen plenty of people who want to exclude the logo, but far fewer want to exclude the other stuff. Often discluding the other functions is unintentional.
Again, we could do a poll or turn this into its own topic.