Saturday, January 6, 2018

Reflections and Aspirations


So it's a new year, and with that comes the desire to reflect on the time gone by and what's to come in the year ahead. 2017 was such an important year in general and for me personally, both in good ways and in bad, that I wanted to take some time to talk about it.

First off, it has now been just over a year since I started this blog! On Christmas Day 2016 I wrote my first post, though I had been thinking about starting to get into game dev for a couple of months before that. I started very small, with the goal of learning a little of the MonoGame framework by way of making a simple Pong clone. I honestly wasn't sure how far I would get; I had very little self-confidence in myself going into it given my past history with writing code outside of work projects. I was afraid that life would get in the way again and I would lose focus, sweeping this venture under the rug to join all the other hobby projects I had started and stopped over the years, left to be forgotten. To my surprise though, I enjoyed it. It was a challenge from the start, to be sure, but I stuck with it, and in September of last year I declared Pongquetball to be finished. It is definitely not perfect, and I could continue adding new features and changing things if I wanted to, but I achieved my goal. I made a game! It's a free download on itch.io, so feel free to check it out if you want.

Doing that taught me a few things. It helped me begin to learn how to manage my time better and stay focused on the current task. I have a very bad habit of getting distracted while working (including while writing this lol...it's terrible), so this is a big thing for me. It also helped me to start getting in the habit of writing down goals, plans, and notes as I coded. This helped me to continue moving forward and gave me the feeling that there was an end goal in mind, which also helped a lot in keeping me focused and motivated.

Now that I've finished working on Pongquetball I've moved on to playing around with the Unity game engine. It's super slow going (you know, that whole issue with time management, plus dealing with work and other obligations), but I am enjoying it. Currently I'm working on throwing together a quick and dirty breakout game, just to help me learn my way around the engine. But I do have a couple of original game ideas that I want to start working on eventually, and I think Unity will be a great engine to use.

Aside from game dev, 2017 was a big year for me in terms of personal growth. I'm not going to get into all the details because it's a long story, but I grew up in a very fundamentalist Christian environment, and was very religious, especially throughout high school and the first few years of college, until I realized I was an atheist and no longer believed in 2010. In the 7 years since I have basically reinvented myself piece by piece. My views on pretty much everything have changed and continue to change. And my appearance has evolved has well. You see, one of the big things you often learn as a male in fundamentalist religion is the importance of "being a man"...strong, muscular, confident, able to be the head of the household. I have never felt that way about myself. And I've also never been the kind of person who enjoyed just hanging out with a bunch of guys, talking about sports or whatever. The result was that I always thought something was wrong with me and I never really learned how to be myself. I was always just aspiring to be what everyone told me I should be. Since leaving religion behind I've finally been able to start to work through that. It hasn't been easy. However, last year was kind of a breakthrough year for me. I'm coming to terms with the fact that I am not a very manly person, and that's ok. I don't want to be. For years I had a mustache and small goatee. Eventually I grew tired of the mustache and shaved it off. Late last year I realized the goatee didn't feel right either; I just really don't want facial hair anymore. So it's gone, much to my relief.

I've also been letting my hair grow out for...wow, I think it's been about the whole 7 years! I love it. I have no desire for short hair again; this feels like me. So a few months ago I began to think about dyeing it. Would I like it if I did, or would I come to resent doing it? And what color? I had no idea. But I've never done any sort of body modification like that before, and eventually I figured why not? I'm tired of being boring, so I'll just go for it. So now my hair is a nice deep red and I absolutely love it. I'll probably stick with the red for a while, but I plan on going to a brighter and more wild color eventually.

The result of all of this is that I'm beginning to like myself a lot more. I have never felt this comfortable in my own skin before and I want to continue exploring this. For the first few years after I left religion I was solely focused on what I had left behind. Now I'm ready to focus on the future...who I really am as a person, and become a better educated and more well-rounded person. After all, I need to make up for all those years when I was sheltered and didn't realize it. ;)

So, 2017 is over...what about 2018? What do I want to accomplish in the coming year? Well, I'm going to continue learning Unity for one thing. I want to finish this breakout game and then I'm thinking I'll move on to starting to flesh out some original ideas I have! I have two game ideas in mind, one that I've been thinking about for a while. So maybe I'll start toying around with that and see what I can learn how to do, one small bit at a time.

I'm also trying to take what I learned last year about keeping notes, setting goals, and planning, and apply that to more of my life. I'm the kind of person that has to write everything down as soon as I think of it, or I'll forget. And I've seen how much that can help me. So I want to be better about setting daily goals and to-do lists for myself, to help me better manage my time. Hopefully that way I can begin to accomplish small tasks every day or so, rather than going for weeks feeling like I haven't accomplished anything, because let me tell you, that shit sucks lol.

One other small thing...2017 was a terrible year for the United States. There's no denying that. Our country has taken a turn in a direction that honestly scares me (not saying I wasn't bothered by the state of things before, but now it's a whole new level of fucked up). I am not exaggerating when I say that I have been internally screaming every single day pretty much since Donald Trump announced he was running for president, and that screaming has increased every day as well. The result is that I have become a very bitter person. It is easier for me to hate. It is easier for me to lose my temper, something which scares me because my father has a terrible temper, and I never want to emulate that. Frankly, I'm angry. Now, that's not necessarily a bad thing. But I think I need to learn how to better manage this constant anger and annoyance at large parts of the population around me. It's not going to go away, I recognize that. And I don't want it to go away, because that would mean I don't care anymore. But the bitterness is eating me up in a way, and that's not good. So hopefully I can learn how to deal with this.

Well, I guess that's about it! Turns out I had a lot of thoughts I needed to get out. Thanks for reading friends. I know this was a lot more personal than anything I've written before and not strictly focused on game dev, but it's important to take stock of things every once in a while, right? Here's to a new year and working to improve ourselves and the world around us in any way we can. :)

Thursday, September 21, 2017

It Is Finished!

I did it. I have finally finished a substantial hobby coding project for the first time since...high school, I believe. That was 12 years ago, so yeah, it's been a while. And I have actually made my first video game, to boot. Now, by "finished" I mean "works well enough to be functional and playable". I know I haven't fixed every bug. And I don't really intend to. My goal when I started working on this in January was just to make something that worked; something that I could use to begin to learn. And I must say, it's been really fun so far! :)

I also decided to upload it to the indie game website itch.io as a free download, just because I could.


But anyway, time for a final change log!
  • Remove the incomplete controller support
    I had originally planned for this to have controller support but eventually it just felt like a waste of time, so I gave up haha.
  • Add sounds
    Pretty self explanatory, but this was a big one. It's amazing how even the simplest of sounds can make a game so much more enjoyable. I had downloaded a few free collections of random sound effects and just started going through them until I found the right blips and bloops, lol. I added sounds to the main menu and paused/game over menu, ball-to-paddle collision, and when the ball goes out of bounds. I didn't record any video to demonstrate this, so you'll just have to play it for yourself if you want to hear it in all its glory. ;)
  • Redo the paused and game-over text so it's readable over the dotted line in a 2-player game, and also add a simple menu that allows you to restart/play again and return to the title screen
    It's much more functional now.
  • Only run the score timer on a one-player game
    This is just a behind-the-scenes change. The timer was still running unnecessarily on two-player games, and I wanted to make sure I fixed that just to make sure it wouldn't screw up the high score at all
  • Change how the initial ball movement direction is calculated
    This one bugged me ever since I first wrote this little bit of code. Here's how it initially looked:
    private float GetVelocityValue(float seed)
    {
        int posNeg = random.Next(0, 2);
    
        if (posNeg == 1)
            return seed * -1;
    
        return seed;
    }
    So it's picking a number, either 0 or 1, and if it's 1 I'm negating the "seed" number that was sent to the function. The returned seed number, either positive or negative, was then used for the speed of the ball. This function was horribly written though. For one thing, there was no need to send a seed number to it in the first place, because I was always using the same number for the ball's initial speed. But more importantly, it was terrible at determining a direction because it was only choosing between two numbers. It was common for the ball to start moving in the same direction 4, 5, or even more times in a row. Turns out, randomly selecting between only two values doesn't really work so well, lol. So I changed the function to this:
    private float GetVelocityValue()
    {
        int posNeg = random.Next();
    
        if (posNeg % 2 == 0)
            return BallSpeed * -1;
    
        return BallSpeed;
    }
    
    I'm not sending a seed value; instead I'm using a pre-defined BallSpeed variable that is declared up at the top of the file, which just makes more sense. Also, I'm selecting a random number from the full range of numbers that C#'s random number generator uses, 0 ≤ n < 2,147,483,647, and if it's even I'm making the ball speed negative. After a little bit of testing it seems to be better.
  • Update the window title so it longer says "Pong Clone"
    Consistency is important. :)
Sooooo...that's it! Like I said, it's not perfect. I've seen the ball collision detection act up every once in a while when it gets going pretty fast, but eh, at this point I'm not going to take the time to try to fix it. I did this just to get my feet wet and my hands writing *something*, and I would say "mission accomplished"! My next plan is to start playing around with the Unity game engine (which I may have already started doing) and maybe try making a 2D game with that. Breakout, maybe? It's an idea at least. I'm probably gonna stick with Unity for a long time, because I know there's a lot you can do with it, and I do have the start of an original idea that I eventually want to work toward. I figure Unity will be the perfect tool for the job. So with that...onward! :D

Tuesday, July 4, 2017

Almost There!

Another couple of months have gone by, and while they've gotten busier and busier as spring has turned to summer, I've been able to make another good bit of progress on Pongquetball, including something that I've really been looking forward to doing! In keeping with tradition, here's my changelog:
  • Only change the color of the ball when it hits the inward facing sides of the paddles
    There's not much I need to say about this. I just wanted to refine the way the color changes a bit. No need to change it when the ball is just going to go out of bounds anyway.
  • Make the ball appear above the score text (and other elements) instead of underneath
  • Display the high score on the title screen
  • Add a menu on the title screen to choose between a 1- or 2-player game and to reset the high score
  • Some general code cleanup
    This needed done for a while. I had some random numbers scattered throughout the code with no apparent meaning to them, so I assigned them to variables so they had meaning and weren't repeated. Also, I eliminated a few boolean variables and replaced them with a GameState variable, which is used to keep track of whether the game is at the title screen, is paused briefly just before starting, is actually running, or is paused. Doing that definitely helped make some parts of my code a bit cleaner and easier to read, and it just makes more sense.
  • And finally, the big one: TWO PLAYER MODE!
    This has been on my mind for a while, as a goal that I really wanted to work toward. So I was so happy when I finally got to it. Some of it was fairly simple, such as removing the left wall and replacing it with another paddle. All of the code needed for it to work correctly was simply copied from the code for the right paddle and modified slightly whenever necessary.

    Beyond the paddle, I also added a dotted line down the center, because come on, it's not proper pong without it, lol! The line actually took me a few tries to get right when I was creating it in Pyxel Edit. I couldn't quite get my math right for the correct number of black and white sections and the proper (in my mind, at least) height for them. Eventually I was able to figure out that the problem was the fact that I was trying to make it only as tall as it needed to be; i.e., the height between the top and bottom walls. The solution was to make it as tall as the entire window, which means that most of the very top and bottom "dots" in the line are actually *in* the top and bottom walls. It's a little weird, but hey, it works!

    Now, you can't play a proper two-player game of pong without keeping score, right? So I also had to add in proper point scoring, rather than keeping track of time like a single player game. And I went ahead and limited two player games to a maximum of 10 points.

    The last thing I did was to modify how the ball changes color for two-player games. Rather than being random, I just assigned a color to each side, and the color changes back and forth as the ball is hit back and forth. This was suggested by a friend, and I think it's a nice little touch. :)

Check it out! :D

So, I'm down to the last few changes I want to make to this game before I put it down. I want to add some simple sounds, remove the incomplete controller support it currently has (it just feels unnecessary to me now), and redo the "Paused" and "Game Over" messages so that they aren't obscured by the dotted line in two-player games. I also have a couple obscure bugs that I may work on for a bit, depending on how I'm feeling at the time. :)

That's all for now. Time to go finish this up and move on!

Saturday, April 15, 2017

Adding a Bit of Polish

Well, would you look at that! A blog update! It's been a while. Life tends to get in the way like that. But I have finally managed to get some more work done on Pongquetball; enough to write about I think. So, here's a quick little change log, complete with some code samples for once!:
  • Add a high score feature. If a new high score is set when the ball goes out of bounds, the number is updated, and it's also saved when the game exists and loaded when the game starts up. Currently it's just saved in a plain text file...this is only a practice project after all. :)
  • The ball now starts with a random color, and the color is changed every time it hits a paddle. This was a suggestion of my wife, Ashtan. I figured, why not? It's fun and it'll make it a little bit different. To select the color, I'm simply creating a new Color object with 3 random RGB values:
    private Color GetBallColor()
    {
        return new Color(random.Next(255), random.Next(255), random.Next(255));
    }
    
    There's one obvious downside to this: there's a small chance that the color will be black or a dark gray, making it hard to see. It would make for an interesting game though. :)
  • Add a slight pause after the ball goes out of bounds and before the game restarts. It's the same as the pause after the title screen.
  • Add pause/unpause functionality by pressing 'P'
  • Increase the score counting speed to be twice as fast. Originally I think I had it counting every second, and that just felt too slow. I wanted it to be more in line with something like the timer from Super Mario Bros., to give some more excitement to the game.
  • And finally, the big one: detect collisions between the ball and the top and bottom of the paddle. In other words, react differently based on where the ball hits the paddle. Before I changed this, the same collision code was being executed no matter where the ball hit the paddle.
    else if (ball.BoundingBox.Intersects(rightPaddle.BoundingBox))
    {
        ball.Velocity.X *= -1;
    
        ...
    }
    
    I'm simply reversing the ball's horizontal direction of movement. Of course, that doesn't make sense if it hits the top or bottom of the paddle. It resulted in some...interesting behavior as the ball tried to move back to the left:


    I slowed down the ball so you could clearly see what's happening.

    In those cases I want it to change directions vertically, not horizontally. The first step was figuring out how to detect where the ball hit the paddle. And I'll be honest, I had no idea how to go about doing that. I finally did some Googling and found an excellent and simple solution: if you calculate a straight line from the center of the ball to the center of the paddle, you can then find which side of the paddle that line intersects, and that's the side that the ball hit. Duh. That was one of those forehead-smacking, "why didn't I think of that?" moments. But then the next problem: how to actually go about calculating that line and where it intersects. The info I was reading made it seem like there were some somewhat complex calculations involved in this, but thankfully I eventually found this page, which was amazingly helpful. I adapted the LineSegmentsIntersect() method to fit my needs, because it was checking for more situations other than a simple intersection of two line segments at a single point, and ended up with this:
    private bool LineSegementsIntersect(Vector2 p, Vector2 p2, Vector2 q, Vector2 q2)
    {
        Vector2 r = p2 - p;
        Vector2 s = q2 - q;
        double rxs = Cross(r, s);
        double qpxr = Cross(q - p, r);
    
        // t = (q - p) x s / (r x s)
        double t = Cross(q - p, s) / rxs;
    
        // u = (q - p) x r / (r x s)
        double u = Cross(q - p, r) / rxs;
    
        // If r x s != 0 and 0 <= t <= 1 and 0 <= u <= 1
        // the two line segments meet at the point p + t r = q + u s.
        //if (!IsZero(rxs) && (0 <= t && t <= 1) && (0 <= u && u <= 1))
        if (rxs != 0 && (0 <= t && t <= 1) && (0 <= u && u <= 1))
            // An intersection was found.
            return true;
    
        // Otherwise, the two line segments are not parallel but do not intersect.
        return false;
    }
    
    p and p2 are the endpoints of the line segment between the centers of both objects, and q and q2 are the endpoints of one of the sides of the paddle. So using this, along with some of the other helper code from that web page, I was able to improve my collision detection!
    else if (ball.BoundingBox.Intersects(rightPaddle.BoundingBox) && ball.Velocity.X > 0)
    {
        bool intersect = false;
        int intersectedSide = -1;
    
        for (int i = 0; i <= 3; i++)
        {
            switch (i)
            {
                case 0: // top side
                    intersect = LineSegementsIntersect(ball.BoundingBox.Center.ToVector2(), rightPaddle.BoundingBox.Center.ToVector2(), new Vector2(rightPaddle.BoundingBox.Left, rightPaddle.BoundingBox.Top), new Vector2(rightPaddle.BoundingBox.Right, rightPaddle.BoundingBox.Top));
                    break;
                case 1: // right side
                    intersect = LineSegementsIntersect(ball.BoundingBox.Center.ToVector2(), rightPaddle.BoundingBox.Center.ToVector2(), new Vector2(rightPaddle.BoundingBox.Right, rightPaddle.BoundingBox.Top), new Vector2(rightPaddle.BoundingBox.Right, rightPaddle.BoundingBox.Bottom));
                    break;
                case 2: // bottom side
                    intersect = LineSegementsIntersect(ball.BoundingBox.Center.ToVector2(), rightPaddle.BoundingBox.Center.ToVector2(), new Vector2(rightPaddle.BoundingBox.Left, rightPaddle.BoundingBox.Bottom), new Vector2(rightPaddle.BoundingBox.Right, rightPaddle.BoundingBox.Bottom));
                    break;
                case 3: // left side
                    intersect = LineSegementsIntersect(ball.BoundingBox.Center.ToVector2(), rightPaddle.BoundingBox.Center.ToVector2(), new Vector2(rightPaddle.BoundingBox.Left, rightPaddle.BoundingBox.Top), new Vector2(rightPaddle.BoundingBox.Left, rightPaddle.BoundingBox.Bottom));
                    break;
            }
    
            if (intersect)
            {
                intersectedSide = i;
                break;
            }
        }
    
        if (intersectedSide == (int)PaddleSides.Left)
            ball.Velocity.X *= -1;
        else if (intersectedSide == (int)PaddleSides.Top || intersectedSide == (int)PaddleSides.Bottom)
            ball.Velocity.Y *= -1;
    
        ...
    }
    
    I'm basically just checking for intersection with each side of the paddle. Once I find it, I make note of which side it is and move on. Now, when the ball hits the top or bottom of the paddle, it bounces off vertically and continues moving in the same direction horizontally, like so:


    That's much better. Obviously, there's more I could do with it. It might make more sense for the ball to bounce more up or down rather than continuing in the same direction horizontally. But I don't think I'm going to spend any more time on this. I'm happy just knowing that I was able to handle this situation a little more properly and eliminate that wild "rapid bouncing" bug.
At this point I am very happy with how this is turning out. But I am also ready to move on from it and play around with Unity and some other ideas that I have floating around in my head. So my plan is to work on the last few bugs and feature ideas that I already have written down, and leave it at that. But that's for the next post. :)

Monday, February 6, 2017

Pongcquetball

Time for another Pong update! Er, well, racquetball, I mean. Pongcquetball? Yeah, that sounds about right.

I am very happy with the way it's coming along. I have finally reached the point where I have a basic working game! Here's a list of changes and updates I made since my last post:
  • Reset the ball position back to the center of the screen when it goes out of bounds
  • Use a stopwatch to track seconds while the ball is in play and display this as the score (I love how C# has a stopwatch class built right into it)
  • Reset the score when the ball goes out of bounds
  • Increase the ball's speed (by 0.5) every time it hits the paddle (it's actually challenging now!), and reset that speed when it goes out of bounds
  • Display a static high score beneath the normal score
  • Add a simple title screen
  • Wait two seconds after the title screen disappears before showing and moving the ball; basically, give the player a couple of seconds before the game actually starts
So this is what it looks like now...




I'm especially happy with the font. It's called Press Start 2P. I happened to find it in the comments of a post on the gamedev subreddit the other day, and it's the perfect fit for this project.

So yeah, I have an actual playable game now! I know it's really simple, but it's something that I made, and I'm really proud of it. Overall, this hasn't been too challenging so far, but I know that's mostly because I'm only making a clone of Pong, of all things. Not exactly a complex game. And even then what I have so far is simpler than the actual game. But still, to have gotten this far means a lot to me.

So what am I going to do next? Well, my next immediate task is to save the high score when the game exits so that it isn't lost every time you quit; probably just in a text file. Nothing fancy. After that, I've made a nice little to-do list of other features I want to add and things to change, such as adding another small delay after the ball goes out of bounds and before the game starts over, and increasing the score counting speed, just because I feel that counting normal seconds is too slow. Also, my wife suggested that I make the color of the ball change every time it bounces off of something, just for fun, so I am going to see if that will be possible to do. :) And I have a few bugs to fix as well, the most amusing of which is the fact that if the ball's speed is very high and it hits the left wall in just the right way multiple times rapidly, it turns into The Flash and phases right through it, never to be seen again. So the whole game breaks. That's going to be a challenge to fix, I'm sure.

Monday, January 30, 2017

From Pong to Racquetball, or Somewhere In-between

This is the continuing saga of my efforts to make my own Pong clone. I actually made a lot of changes to it since I last wrote about it, so I think what I’m going to do is simply make a bulleted list and then go from there. My first post, where I described my early progress, can be found here: http://bitsandpixelsdev.blogspot.com/2017/01/and-so-it-begins.html

Changes

  • Made the ball start in the middle of the screen and move in a random direction
  • Updated the textures used for the ball and walls
  • Added left and right player paddles
  • Added collision detection for the walls and paddles, so the paddles won’t move into the walls and the ball will bounce off of everything
At this point, I was pretty happy with things. I had something that worked! The ball moved and bounced, and player interaction was possible. I was especially proud of the fact that I was able to work out how to change the direction of the ball when it bounced off of something on my own. I know it’s a small detail, because it’s actually a really simple calculation for the new direction, but that was one of my goals with this whole project: see how much I could do on my own without looking for help.
However, I suddenly realized something. I had put in two paddles simply because I had the normal game of Pong in my mind, but I didn’t really have any intention of creating a two player game; at least not at that moment. And I didn’t want to try to create an AI for the second player either (more complexity, and all that). So I decided to remove the left paddle and put in a wall instead.
Easy. Except now I don’t have pong; I have racquetball instead. And that leads to something else: how do I handle scoring for racquetball? Points don’t make sense. So I think what I’m going to do is implement two game modes, just for fun. There will be racquetball with a timer, and the goal is to see how long you can hit the ball before it goes past your paddle, and then there will be proper two-player Pong with point scoring. In both cases, I’ll speed up the ball slightly every time it’s hit by a paddle. And maybe I’ll try to implement an AI in the future; I haven’t decided yet.
So, next steps...
  • detect when the ball leaves the window for scoring, and reset the ball back to the middle of the screen
  • add a second game mode for two-player pong proper, and a way to switch modes
  • add scoring for both game modes
  • oh, and change the color of that left wall :)
But for now, at least I have progress!

Monday, January 2, 2017

And so it begins...

So I want to use this post to talk about what I've accomplished so far in the little bit of time I've spent learning about game development. It may not seem like much, but it's actually been a lot of fun for me.

After doing a little bit of reading about some of the more popular frameworks and game engines that are out there and talking to one of my coworkers who has experience with game development, I decided to start off with the MonoGame framework. If you don't know what MonoGame is, their website has a nice and concise history of the project and you can find more info on it with some quick searching. Briefly, it's a re-implementation of Microsoft's XNA video game framework, which they stopped developing in 2013. The goal was to provide support for XNA on more devices and continue to support the API once XNA was discontinued. Why MonoGame? Mainly because it allows me to write my code in C#, which I am very familiar with. I wanted to start off with something that would be easy to pick up and get stuff done in.

After installing MonoGame I started looking for good tutorials, and found RB Whitaker's Wiki, which seems to have a plethora of information on XNA, MonoGame, and game development in general. I went through some of his MonoGame tutorials which take you through the very basics of the framework and some simple 2D stuff. In the process I learned for the first time about what a game loop is (as I said, I knew little and was starting at the basics). In the end though, I learned my way around the framework a bit and ended up with a cool little program of swirling lights to demonstrate additive blending using sprites. Not a game, but fun to watch nonetheless.

I tried to make a GIF but it looked terrible. It is pretty fun to watch the colors change.

After going through those tutorials I wanted to start working on an actual game and I figured a good place to start would be a Pong clone. It seems relatively simple, but I'm sure it's also going to be a good challenge for me. I'm trying to see how much of it I can get done on my own without having to look up examples of Pong games from other people. So far, this is what I have:



Notice there's absolutely no collision detection yet. That ball will just keep moving in the same straight line forever. But look, I also added walls!



And that's as much as I've gotten done so far. I haven't had much time to work on this during the busy holidays, but I'm hoping to get a little more done this week. I suppose I'll try to make it bounce off the walls next, which I'm sure is going to be an interesting challenge.

So what are my goals for the future? I'm still trying to figure that out, to be honest. I want to also play around with the Unity game engine sometime, since it also makes use of C#. I think it would be interesting to compare it to MonoGame and try to get a sense of which I prefer, since they're really different beasts. So I had the idea of attempting to make a Pong clone in Unity as well. I may also try to make some more clones of other really old games for fun, like Breakout. And after that? I have no idea. I don't really have any original ideas yet, but that's the goal that I eventually want to work toward. And if I do come up with an idea and actually make it, maybe I'll put it up on itch.io and see what happens. I'm not doing this with profit as the main goal, after all. I just want to have fun with it.

But for now, I'm just going to focus on making this ball bounce around the screen. :)

Until next time!