Continuing my quest for learning Rust, I elaborated a list of potential projects. I started a couple privately but then I found the suggestion of creating a Chip-8 emulator somewhere. Unfortunately, I don’t remember where it was.
I started reading about the programming language and consumed resources like CHIP-8 Classic Manual, Cowgod’s Chip-8 Technical Reference v1.0, and Guide to making a CHIP-8 emulator. The latter kind of ruined the experience because it explains it so well, it also suggested implementing the opcodes needed to get the IBM Logo ROM running. Speaking of ROMs, I got a set cloning this repository.
I started with my code reading the ROM file to a byte vector and the basic rendering window. Then I started creating variables for the program counter, the RAM, the registers, and the stack. I proceeded to wrap these variables in a struct and added the call_operation function.
The display opcode was quite fun to implement, I first used SFML Rectangles directly but then moved to use a multi-dimensional array. Oh, and my bitwise operations to extract the bits from the sprite were inverted, so it caused some confusion.
As usual, there is a lot of improvement and refactoring to be done. I like to start with a dirty proof of concept and then work on it, but the call operation needs some serious refactoring and the display can be done directly to SFML Image/Texture.
I can’t deny it was a satisfactory experience since I never did something like it. Similar to other projects that I created and that are not web-related.
Except for reading files in binary form, there is nothing new regarding Rust in this project. I also need to practice writing unit tests during the development process.
As I mentioned in my last post, I’ve had some really busy weeks – actually, it’s been busy for months now…
I was still contemplating whether to transition to another project since we had pretty much accomplished all the challenges and goals for this one. But in the end, I decided to continue and incorporate both graphics and sound.
I began by creating a sprite sheet and then proceeded to load the textures. Within just a couple of minutes, I managed to transform the food item rectangle into a sprite, and from there, I updated the snake graphics and later, the wall graphics. I also added a subtle sound effect for when the food item is consumed.
The entire process was fairly straightforward and uncomplicated; the only challenging part was ensuring that some segments’ rotations were correct (e.g., graphics for movements from Left-Top needed to be rotated 180 degrees in comparison to Top-Left movements).
With the project now considered complete, I’ve posted it on itch.io. You can check it out by clicking here. I’ve also updated the code on its GitHub repository.
I already have a few ideas for my next projects and will be sharing them here soon!
It’s been some busy weeks for me. So I had to slow down my side projects.
Well, I finished the implementation for highscores. Returning a struct with strings is way harder than I anticipated. I used another approach, fetching the values when needed.
I am not happy with the final implementation, but I can always refactor it when I fully understand the language and its concepts.
Oh, I forgot to mention it in the previous post. I got the debugger running and it was one of my goals.
I also moved the project to Linux. Had a hard time setting up the SFML/CSFML dependencies, but everything went ok after I changed the crate dependency to the rust-sfml git repository.
Well, not much was achieved. But I finally got the highscores working. I am just going to implement graphics and sound and then finally call the project done.
Hope the next iteration happens soon.