Difference between revisions of "Programming methods used in games"
(→Hardware Scrolling) |
(→Hardware Double Buffer) |
||
Line 24: | Line 24: | ||
However, page flipping eats up a lot of memory area (which is crucial especially for 64Kb machines). This explains why a lot of games can have small game-areas ! | However, page flipping eats up a lot of memory area (which is crucial especially for 64Kb machines). This explains why a lot of games can have small game-areas ! | ||
+ | |||
+ | === Scrolling === | ||
+ | |||
+ | The following types of scroll are used: | ||
+ | |||
+ | 1. The player controls a character on the screen. When the character is moved the screen scrolls but the character remains in the same position on the screen. If they get to the edge of the map, they may walk up to the sides of the screen. If they walk back the other way when they reach a particular point on the screen it starts to scroll again and they remain in the same position. | ||
+ | |||
+ | 2. The player controls a character on the screen. When the character is moved towards the edges of the screen, the scroll moves a whole screen in width or height. The character is now on the opposite side. e.g. the character moves left, the screen scrolls by a whole screen width, the character is now on the right. The screen only scrolls when they get close to the sides. | ||
+ | |||
+ | 3. The screen always scrolls. The player controls a character who is either static or moves freely around the screen. | ||
==== Software Scrolling ==== | ==== Software Scrolling ==== |
Revision as of 05:05, 13 November 2012
This section describes specific programming methods which are used in games and the games that use them.
Contents
Rasters
Rasters is a colour changing effect.
Examples:
Zynaps.
Hardware Double Buffer
Most good CPC games use the hardware double buffer technique in order to display sprites and/or to scroll the play area smoothly.
In particular, two memory areas (instead of one) are reserved for the screen ram.
In each frame, one of the two screens is displayed while the other is not visible but is drawn to. After the draw is done, the screens are exchanged using the hardware, so that the previously invisible one is now visible and the previously visible one is invisible.
The exchange is done using the hardware specifically by changing the screen-offset, Reg 12 and 13 of the CRTC).
This process is repeated.
The big advantage of this technique is that we can use a whole frame (or more) machine-time for our code (with no problems that arise when we alter screen ram at the same time the electron beam displays it on the monitor such as tearing or flickering).
However, page flipping eats up a lot of memory area (which is crucial especially for 64Kb machines). This explains why a lot of games can have small game-areas !
Scrolling
The following types of scroll are used:
1. The player controls a character on the screen. When the character is moved the screen scrolls but the character remains in the same position on the screen. If they get to the edge of the map, they may walk up to the sides of the screen. If they walk back the other way when they reach a particular point on the screen it starts to scroll again and they remain in the same position.
2. The player controls a character on the screen. When the character is moved towards the edges of the screen, the scroll moves a whole screen in width or height. The character is now on the opposite side. e.g. the character moves left, the screen scrolls by a whole screen width, the character is now on the right. The screen only scrolls when they get close to the sides.
3. The screen always scrolls. The player controls a character who is either static or moves freely around the screen.
Software Scrolling
The screen is scrolled using the CPU only. This can be done by moving the data on the screen, or re-drawing it in a different position to give the illusion of scrolling.
Hardware Scrolling
Hardware scrolling is performed by changing the CRTC registers 12 and 13 (start address).
The scrolling is normally 1 CRTC char (4 mode 0 pixels, 8 mode 1 pixels or 16 mode 2 pixels) in the horizontal and 1 char line (scroll amount dependant on R9, but normally 8 scan lines) vertically.
Horizontal scrolling can be made smoother by using R3 (Hsync Width) and makes the scrolling effectively half a CRTC char (2 mode 0 pixels, 4 mode 1 pixels, 8 mode 2 pixels). (Changing between values 5 and 6 for the horizontal sync causes a half CRTC char movement. This is an effect on the monitor).
This effect works well on Amstrad monitors but produces a black and white image on a MP-2 modulator because of the adjusted HSYNC timing.
Vertical scrolling can be made smoother by using R5 (Vertical Adjust) in combination with Rupture/Splitting to make perfect 1 scanline vertical scrolling.
This works on all monitors.
This following is an incomplete list of games using hardware scrolling. From this list it can be seen that hardware scrolling has been used from 1984 :
Title | Year | Vertical | Horizontal | R3 | R5 | Confirmed |
3D Stunt Rider | 1985 | No | Yes | No | No | Yes |
Action Force | 1988 | No | Yes | No | No | Yes |
Amazing Shrinking Man (The) | 1986 | Yes | Yes | No | No | Yes |
Anarchy | 1988 | No | Yes | No | No | |
Axys: The Last Battle | 1991 | Yes | No | No | Yes | Yes |
BMX Kidz | 1988 | No | Yes | No | No | Yes |
Bob Morane Science Fiction | 1987 | Yes | Yes | No | No | |
Boulder Dash | 1984 | Yes | Yes | No | No | Yes |
Builderland | 1991 | No | Yes | No | No | |
Canadair | 1987 | No | Yes | No | No | Yes |
Cyborgs | 1991 | Yes | Yes | Yes | Yes | Yes |
DJ Puff's Volcanic Eruption | 1992 | Yes | Yes | No | No | No |
Doctor Who and the Mines of Terror | 1986 | Yes | Yes | No | No | Yes |
Energy Warrior | 1987 | No | Yes | No | No | Yes |
FlySpy | 1986 | Yes | Yes | No | No | |
Fusion 2 | 1988 | No | Yes | No | No | |
Gothic | 1988 | Yes | Yes | No | Yes | |
Ghosts 'n' Goblins | 1986 | No | Yes | No | No | Yes |
Ghouls 'n' Ghosts | 1989 | No | Yes | No | No | Yes |
Into The Eagle's Nest | 1987 | Yes | Yes | No | No | Yes |
Jinks | 1988 | No | Yes | Yes | No | Yes |
Killer Cobra | 1987 | No | Yes | Yes | No | Yes |
Led Storm | 1988 | Yes | No | No | Yes | Yes |
Legend of Kage | 1986 | Yes | Yes | Yes | Yes | |
Leviathan | 1987 | Diagonal | scroll! | No | No | Yes |
Le 5eme Axe | 1985 | Yes | Yes | No | No | |
Mission Genocide | 1987 | Yes | No | No | Yes | Yes |
Monty Python's Flying Circus | 1990 | Yes | Yes | No | No | Yes |
Octoplex | 1989 | Yes | Yes | No | Yes(?) | Yes |
Out of This World | 1987 | No | Yes | Yes | No | Yes |
Paraplane | 1992 | Yes | Yes | No | No | |
Plate-Forme | 1988 | No | Yes | No | No | Yes |
Prehistorik 2 | 1992 | Yes | Yes | Yes | Yes | Yes |
Prohibition | 1987 | Yes | Yes | No | No | Yes |
Realm! | 1987 | Yes | Yes | No | No | Yes |
Return of the Jedi (The) | 1989 | Diagonal | scroll! | No | No | Yes |
Rick Dangerous 2 | 1990 | No | Yes | No | No | |
Rig Attack | 1985 | No | Yes | No | No | Yes |
Rockford | 1988 | Yes | Yes | No | No | Yes |
Roland on the Ropes | 1984 | Yes | Yes | No | No | |
Sentinel (The) | 1987 | Yes | Yes | No | No | Yes |
Skate Ball | 1989 | No | Yes | No | No | Yes |
Skateboard Kidz | 1988 | Yes | No | No | Yes | Yes |
Skate Rock | 1987 | No | Yes | No | No | Yes |
Skate Wars | 1990 | No | Yes | No | Yes | Yes |
Sly Spy Secret Agent | 1990 | Yes | Yes | No | No | Yes |
Star Avenger | 1984 | No | Yes | No | No | |
Street Machine | 1986 | Yes | Yes | No | No | Yes |
Striker in the Crypts of Trogan | 1992 | Yes | Yes | No | No | |
Super Cauldron | 1992 | Yes | Yes | Yes | Yes | Yes |
Titan | 1988 | Yes | Yes | No | No | |
Tornado Low Level | 1985 | Yes | Yes | No | No | Yes |
Ultima Ratio | 1987 | Yes | No | No | Yes | Yes |
Vector Ball | 1988 | Diagonal | scroll! | No | No | Yes |
Warhawk | 1987 | Yes | No | No | Yes | Yes |
Xeno | 1986 | No | Yes | No | No | Yes |
Rupture (or splitscreen)
A CRTC programming technique used to split the screen into more than one block vertically.
The sizes of each block are defined using CRTC register R4. Vsync is turned off in all but one block (by setting CRTC R7 to a value larger than R4). The start address of each block can be changed using CRTC registers R12 and R13.
This allows each block to reference different ram or to hardware scroll one block while another is static.
This method requires careful timing for the CRTC register updates, it also needs testing on all CRTC because there are differences of when each will accept and use the values programmed. However, the result can be made to work on all with more simple ruptures. Care must also be taken to ensure the timings are setup for a 50Hz screen.
It is worth noting that some monitors are more tolerant to longer or shorter frames so the result may appear correctly on them and not on others. In addition some games may have been programmed and tested on only 1 CRTC type so may not work on others.
This is a an incomplete list of games that use this technique, but according to this list the earliest games used this technique was 1987:
Title | Year | Confirmed |
Action Force | 1988 | Yes |
Axys | 1991 | Yes |
Dynamic Duo | 1988 | |
DJ Puff's Volcanic Eruption | 1992 | Yes |
Energy Warrior | 1987 | Yes |
Enlightenment: Druid 2 | 1988 | |
Grell and Falla | 1992 | |
Mission Genocide | 1987 | Yes |
Octoplex | 1989 | Yes |
Prehistorik 2 | 1992 | Yes |
Rockford | 1988 | Yes |
Skate Ball | 1989 | Yes |
Skatewars | 1989 | |
Skateboard Kidz | 1988 | Yes |
Snowstrike | 1990 | |
Storm Warrior | 1989 | Yes |
Super Cauldron | 1992 | Yes |
Turrican | 1990 | Yes |
Twin World (Ubi Soft) | 1990 | Yes |
Ultima Ratio | 1987 | Yes |
Usagi Yojimbo | 1988 | Yes |
Warhawk | 1987 | Yes |
Wonder Boy | 1987 | Yes |
Xyphoes Fantasy | 1991 | Yes |
Firmware
The following games are known to use firmware functions. This probably explains why they are poor. If the programmer had used the hardware directly they would have lots more cycles free which they could have used to make the game better.
This list is not exhaustive.
- Xevious