A Little Isometric Fun for the ZX81
I’ve been wanting to challenge myself with some isometric graphics.
Looking at various ideas for retro style games, something I’ve been wanting to try has been isometric graphics. I have a pretty good hand on tile based graphics now and wondered if I could do something similar with an isometric set. Hunkering down, here is how my testing is going.
# Starting with a picture.
Not knowing where to start, I did some initial research to see how others might have done it. I had moved back to the US by ’84 and missed out on much of the Spectrum scene. As such, I missed out on many of the isometric games released for the spectrum. By 1985, I myself had moved on the Commodore 64 and was playing the tile based Ultima games, the text adventures of Infocom, and classic arcade platforms like Mission Impossible. Isometric wasn't in the running.
Now, I know there were some isometric games such as Xaxxon that I played in the Arcade and on various gaming consoles. But most games I played were traditional top down games. The likes of Knights Lore weren’t familiar to me.
I think the first real isometric tile game I played was Populous on my Amiga in the early 90’s. I think it worked really well with the world building game play and colorful graphics. That image stuck with me, but I never thought about it being something possible on the ZX81.
# Sketching out some ideas.
Inspired by games like Ant Attack by Bob’s Stuff, I knew it was possible to build an isometric game on the ZX81. The worry I had was speed. To that end, my first step was to try to build a little test program and see how it worked.
Before I could do that, I needed some graphics. I had been looking at different ideas on Pinterest and landed on trying out some sort of box based system. I spent a few hours trying out different ideas in Excel. Yes, not really meant to be graph paper but it works for me. I went through a few different designs until I landed on one I liked.
I then built out a very simple assembly program that printed a tile to the screen. The routine acted like a stamp that I directly input the block into memory. That worked well and allowed me to skip the characters that I want to show through. Unfortunately, the graphics didn't look quite right. As I started adding more, the overlap looked off.
After revamping the graphics, I found that I needed to use an odd numbered characters to get things to line up right. With the new sprite programmed, I soon had a screen that looked great. A few more tweaks to clean up some overlaps and adding in player sprits, and I had my first screen test.
isotest [2022-12-17 18:40:53] by Steven Reid, on Flickr
# More advanced stuff.
Okay, with the graphics looking right, now I needed to do something with it. The best idea was to allow the players to move around the board. To do that, however, I needed to change up how I display the playfield.
To make my life a bit easier, I had created a routine to locate where the tile displays on the screen. As such, you can set row and col that each block is. This dealt with the offsets of each line and made it easier to define locations. Because of that, I could define a simple table that held all the locations on the screen and then set each block based on if that location was filled or not.
With that working, I then tested out movement by flipping one of the pawns back and forth. This let me work out the motion and delay. Not liking the flicker from clearing the screen, I grabbed my double buffer routine form Picture In Motion.
With that working, I then built out the routines to move the player around the screen. That was a bit of pain as movement needs to be calculated a bit due to the offset row. I then could add in various tests to make sure the move was legal. That included making sure the player was in bounds of the playfield, that the block was there, and the other player wasn’t already on the block.
isotest [2022-12-17 22:47:08] by Steven Reid, on Flickr
# What’s next?
With that routine working, my testing feels complete. The display is relatively fast and should let me create a scrolling like version without too many hassles. I can expand my playfield and use the double buffer to print, trim, and display what I want. From the challenge I had in front of me, I accomplished what I had set out to do.
That said, I now have the challenge of what to do with the engine. I have a few ideas. One is a board game or adding like a mini-challenge mode or something. Another is a puzzle like game where you try to remove blocks or lose blocks as you move. Another would be a transitional RPG or combat game with an isometric tile board. So many ideas, I just have to choose something.