For the past couple of weeks I have been reviewing CPP, and while doing so I’m creating a small Snake game
I started the game without any images at all. everything is a rectangle and then when the game was working I wanted to replace the food rectangle with an image that moves. and found an asset of itch.io with a spinning coin sprite.
The sprite is 5 frames each 16 pixels. so to draw one of these frames each drawing operation I had to store the current frame number and for every iteration I increase it and when it goes out of bound I reset it to zero;
1int frame = 0;
2frame = (frame+1) % 5;
That makes the frame include only the values (0,1,2,3,4). So I wanted to flex a bit and make a type that’s an Int that I can increment it and it bounds itself to a max value.
My first attempt was using a template.
1template<int max>
2class LimitedInt {
3public:
4 LimitedInt() : v {0}{};
5 operator int() const { return v; };
6 LimitedInt<max>& operator++(int) {
7 v = (v+1) % max;
8 return *this;
9 };
10
11private:
12 int v;
13};
this can be used as follows:
1LimitedInt<5> frame;
2frame++;
the frame unary (++) operation will increase the int by 1 and reset it when it reaches 5. same behavior. I just can reuse the class multiple times when I need this behavior for another sprite.
But I thought for a while and figured that I don’t really need the template at all. I can get away by storing max in the class itself.
1class LimitedInt {
2public:
3 LimitedInt(int max) : v {0}, max {max}{};
4 operator int() const { return v; };
5 LimitedInt& operator++(int) {
6 v++;
7 v %= max;
8 return *this;
9 };
10
11private:
12 int v;
13 int max;
14};
and it will be used as follows:
1LimitedInt frame(5);
2frame++;
And frame can be used as int as I overloaded the int
operator (that’s my TIL).
Here is the final code as part of the snake game