Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - BladeJunker
Pages: 1 ... 6 7 [8] 9

71
General Discussion / Re: Atari 2600 pixel art?
« on: March 09, 2012, 05:38:32 pm »
I'll start this post listing the 2 layer order options found on the 2600. 1 is the top layer.

Order#1=
1:Player0, Missile0
2:Player1, Missile1
3:Ball, Playfield
4:Background

Order#2=
1:Ball, Playfield
2:Player0, Missile0
3:Player1, Missile1
4:Background

Okay I'll start with some setups and other uses for the sprite objects.

This first example demonstrates skipped scanlines and odd to even alignments using bit constructed sprites. Since it is being constructed one line at a time you can skip every second line and offset another sprite within the same vertical scanline zone using the same Bit Sprites. This is useful for text, background sprites, icons, anything static where you need more sprites horizontally but you've run out of free sprite objects and need to stretch your resources further. Cycle costs will vary on pattern complexity, the objects shown should be practical but the faces would likely need some vertical isolation to make up for more expensive drawing instructions.

I think it goes without saying that skipping lines works best under a 1 line kernel since a 4 line kernel would have some pretty big gaps to say the least. The alternative to skipping scanlines and offsetting there alignments is to render sprites in 2 passes instead of 1 where you render the odd lines and then another pass for the even lines which gets rid of the gaps but creates flicker and color bleed as a byproduct. Its a good method for very short text where skipped lines would destroy font legibility and also the thicker the lines get the faster and cheaper 2 pass rendering gets so that has some uses.

I'm not sure how specifically either method applies to Player object rendering although I have seen them rendered with alternating scanline rendering to achieve certain tricks. This is something I'll have to inquire about sometime. ???


Color bleed caused by flicker varies based on the frequency of flicker but I can explain the basics. If you render White pixels over a Black background with flicker you get grey and it will get darker the higher in frequency the flicker gets since in this example the Black background is visible more frequently being a constant and therefore is dominant to the viewer's eyes. It operates on the same principal as the "bird in cage" optical illusion.
Primarily color bleed reduces overall color palette usage as darker luminances become invisible and other colors are dependent on what you can actually blend together attractively. Actually programmers have gone to the extent of testing and producing flicker based color palettes since flicker factored so heavily into pushing beyond the 2600s limits.
Here's a good thread about it that has both visual and tech related jargon on mixing colors with flicker. It's more detailed and specific than I could ever get into. :)
http://www.atariage.com/forums/topic/98820-mixing-colors-with-flicker/


Okay I want to say one thing about flicker and that is to not fear it or avoid it completely as some of the best 2600 games include flicker as part of there rendering cycle, yes you want to minimize the degree of flicker overall so it doesn't offend the eyes but it should be regarded as just one of your many tools for making 2600 games.

Something odd about the TIA video output of the 2600 is it uses the actual TV hardware as part of its video card, by that I mean the output is generated on the TV as opposed to the console generating the picture for the TV to display. It was cost saving measure by Atari as the 2600 is extremely economically built even by 70s standards.

I bring this up on account of some differences in video output on modern flat panel displays in terms of flicker based rendering. The main one I heard about was automatic interlacing of 2 flicker passes into one visible image which was quite handy and offered certain code optimizations but it didn't work on every flat panel display unfortunately. Actually what I notice about flicker in general on modern TVs is depending on the engine it can get pretty bad at times EG. Contra on the Nes has acceptable sprite fallout but Toki looks awful on my LCD and I tend to play it exclusively on a CRT.

Generally speaking there are 2 main methods of flicker which are to render passes of the sprites as a whole full render top to bottom and the "Venetian Blinds" method of odd to even scanline render passes. Venetian Blinds look and work best on CRTs as the phosphor is kept lit quite well but often looks bad on LCDs and sprite flicker rendering of whole sprites looks good on LCDs but comes out dark and inconsistent on CRTs.
While this doesn't matter within an emulator it does represent a split in code base since 2600 code tends to get bloated and slow with options added like this(EG. Adding a player life display after the fact to Pitfall was a fair amount of work since the code was so trim and tight.), its more optimal to have one or the other while trying to include both is best left to stronger hardware platforms. I haven't seen examples of this but based on the use of separate ROM files for NTSC and PAL the CRT LCD difference is much like producing different ports or using double capacity carts and a startup menu to select a version to load.

The stock RF output of the 2600 was rather poor even when it was new that modding was inevitable for the future. The highest quality output caps off at S-video standard, the best mod I've seen so far is from the Longhorn Engineer which offers kits of various levels of completion and price.http://longhornengineer.com/atari-av-mods/
I bring it up since I've become displeased with the picture quality offered by my 2600 that I thought I should give you a heads up if you intend to acquire an Atari console and the picture quality is less than charming. :-\

Here's a video of the Longhorn's AV mod in action, cover your kid's ears or turn the volume off because the guy demonstrating it swears like a trucker periodically. It's funny but if you're easily offended you've been warned. The video is quite good since he zooms in to show the sharp clear pixels possible with this mod.
http://www.youtube.com/watch?v=KzJkh_b8i4U



Here we have a Playfield using Tiling mode.


And here I've used the Ball object to create a wall on the left side. This was first used in the game Adventure to avoid the added costs of asymmetrical Playfield rendering. The same can be done with either Missile if you're willing to spend it on that task.


This example shows the use of the Player object as a background tile.

The top row uses a tall tile leveraging the unlimited height resolution possible with 2600 sprites. Typically using this setup would either limit you to a single Player entity or that all other sprites are constructed with the 3 loose bits.
The bottom row of blocks uses a variation on this setup instead isolating the curve portion to minimum size or a shorter vertical scanline zone and instead draws the black gaps at the sides over the Playfield pixels that make up the width of the block. Good option if you wanted a unique sprite within the middle of the blocks height using the same Player object as the corner tiles.
Actually here's a good spot to mention that the Player objects can flop horizontally but not vertically on account of the way the 2600 draws pixels that vertical flop isn't applicable thus being able to make any object sprite to incredibly tall heights if desired. In my block example a corner tile would simply switch from a top version to a bottom version when it got to that elevation of the screen.


Or you can skip burdening the movable objects and just try to make a Playfield equivalent.



I'd be remiss if I didn't mention scrolling on the 2600. Vertical scrolling is basically supported on the 2600 as the top to bottom nature of its pixel rendering cycles pretty much make vertical scroll a given. Horizontal scrolling is a different matter on the 2600.

This example demonstrates the 2 horizontal positions between each Playfield pixel width and how it requires supplemental pixels around its outer edges to achieve these states. These edge pixel positions are typically filled by Missile0,Missile1, and the Ball as they are stretchy appropriate objects to fill this need. Most of the time such systems include a certain amount of prerendered table data in the code kernel which is served best by repeating patterns instead of free form landscapes.
Other requirements include minimizing horizontal scrolling zones to small lanes or rows of short height (EG. Defender's urban landscape.). The isolation to a row or lane is optional but minimizing its vertical acreage will create zones where both Missiles and Ball can be used for other things (EG. Defender ship laser blasts.). I guess you could think of them as the 2600's version of parallax scrolling.
Beyond the initial restrictions things like Playfield edge smoothing with loose bits isn't possible with horizontal scrolling as all the "extra" pixel rendering can barely cover the needs of the interim positions of the scroll approximation that scrolling graphics have to be standard Playfield resolution.

The only other way to do horizontal scrolling is to fake it by moving the objects left & right relative to the player sprite which usually remains centered on the screen so it appears things are scrolling by. This setup needs a completely straight flat Playfield graphic to complete the illusion. (EG. Texas Chainsaw Massacre)


Although 3D games are sparse on the 2600 one dependable method is the race track engine approach seen in Pole Position since the perspective descends up into a vanishing point it works well with vertical scanline zone isolation as the sprites get smaller the higher up the screen you go which I use as a basis for discussing sprite scaling or rather the approximation of that through prerendered sprite states or LODs.

Because of the lack of sprite objects making a larger zoom state for a sprite will require larger and larger pixels. It comes down to the shear horizontal acreage you have to cover with the larger states and doing so with the fewest number of sprite objects and widths setting for each within. You might be able to make a more attractive zoom state sprite if you had only one sprite total like in a demo project but games need multiple sprites so you have to get each state or code kernel as frugal as possible in cycle use which on average is served best through coarse blocky resolutions.


I'll start Multi-color discussion with the standard approach used in most 2600 games which is creating holes in your sprites where a Black background shows through. If you're familiar with 1 bit color graphics on other platform like the ZX Spectrum then you probably understand the technique. Other good examples include Nes games that feature Black as a dominant or universal color such as Batman or Shatterhand. The basic method is to include holes that suggest outlines or deep shadows in the sprite like you would on other 8-bit platforms. Black has the benefit of being the most contrasted color in the 2600 color palette.

Personally I think Black is used way too much in 2600 games as background or "peek through" color as any 2 contrasting colors will work, I get the logic of it as in maximum contrast and it being a great outlining color but it gets dull.
The key thing is making sure the color placed over the background color is bright or dark enough to contrast since even the darkest tones in the color palette aren't nearly as contrasted as Black.

I should note some things about this example. It would likely take every object excluding one Player object for the gamer to use, and it would only be able to move up and down smoothly. Other than that it uses the Playfield for the bulk mass, the 3 loose bits to smooth its outer edge, a couple of color changes per scanline here and there, and the port holes use a Player object copied 3 times and since the propeller is lower I use the same Player object for that as well. Also I use the Playfield to render not just the ocean floor but also the sky above suggesting waves, if the Subfish never vertically intrudes into the waves it could probably be smoothed much like the sub is.
 Lastly this is a visual target not definite so its likely I'd have to adapt things if I used this in an actual game, usually just a little loss in precision of shape or compromising the shape based on the rigid horizontal positions allowed for each object and its copies.



This example was designed to show the variation on not just varying your 2 contrasting colors when defining sprites but also in how it can effect the construction of the sprite such as the cloud in this example. On a Black background the clouds outer shape defines itself simply through the pixels being opaque while on a Blue background I'm omitting the fill color and instead defining the shape through an outline.


Gradients?

You've probably seen plenty of examples of 2600 graphics that feature a Playfield with a color gradient across its vertical field since its fairly easy to invoke within the code kernel. I'll instead bring to light the issue of how ugly, obvious, overused, and contrasted it is to change the colors so much vertically when horizontally you can only do 4 per scanline by default. Its a hard nosed stance on the matter but I just think its used too much as visual gimmick rather than serving the art direction as a whole.
This is why I suggest letting the horizontal color limit dictate how much color you use vertically if only to create a better balance between the 2 and save cycles for other things.
The 2 primary methods I use to deal with X & Y axis color amount differences is dithering either through creating hole patterns with a single color for the background to shine through or the other which uses a transition of solid color then a dither of the previous color with the next color in line followed by the next color in the gradient and so on which approximates more shades but with fewer as I'm also alternating the vertical position of each color to either odd or even scanlines to create the illusion of more than 4 colors per scanline. The only limitation of odd to even alignment offset is the thickness of line used globally since 1 or even 2 line kernels will reap benefits from use but 3 or 4 line kernels aren't very compatible with dithering since the pixels are so large.
At the end of the day you'll have decide what to do, horizontal gradients beyond "holes" use Missile or Ball supplemental pixels which may be otherwise occupied depending on your game design or layout. I just wanted describe how you can make it happen given the restrictions.


I mentioned mid-line color changes as an option in regards to the Playfield rendering which allows more than one color per scanline. I was hoping for better news about it but this option isn't as versatile or cheap to render as changing colors vertically per scanline. I'd say the best case scenario is 2 colors per scanline using either the SCORE bit or using one mid-line color change at one of the supported distances.
One of the better adoptions I thought of was inspired by a mockup by 8bitbeard of a mountain climbing scene, this led me to a setup of half the screen with White Playfield for clouds and the other half with Dark Grey for mountain ledges with both sharing the same background color of Sky Blue. Since the 2600 can scroll vertically without additional sprite object assistance a game that focuses on traveling up & down seemed like a logical choice as I could spend my sprite budget on making it more pretty (EG using the Ball to smooth out the cliff face.). I should also mention that Pinball games are ideal for the 2600 rendering limitations as well since they too are vertically oriented and use objects with fixed positions.



3 or 4 colors per scanline?

This is the best example of 3 color changes per scanline I could show, here you can see one "color zone" with the border on the left, another color zone in the middle for the gem stack, and another color zone for the border on the right. I call it the best example since its mirrored and both the left and right zones match making it frugal to render despite the additional cost in cycles of having 3 horizontal color zones. Other examples include BMX Airmaster for its bike ramp and Robot Tank which I think is related to its rendering of large "3D" sprites.
Its safe to say mid-line color changes of the Playfield scanlines beyond 2 equal zones(Score bit) is a costly matter since it has no native hardware support that its best avoided unless you're willing to make sacrifices to visual quality and level layouts.

*I should mention that mid-line color changes can be applied to the Background layer as well, with 3 horizontal color zones you can actually define a square despite a complete lack of actual image resolution. ;D

Thank goodness my buddy SeaGTGruff chimed in with some useful information on mid-line color changes and precision placement of the color zone border lines. The exact point where a color zone border can occur in the Playfield is at 3 color clocks or 6 pixels in my canvas. Anyway this gives you a good deal of options for the width of the 3 color zones.


He said based on Playfield pixel width that rounds up to every 3rd Playfield pixel if you want the color changes to line up with the Playfield pixel widths.


Based on this width increment I tried for the aforementioned 3 colors per Playfield scanline or 3 color zones so it would fit more evenly within the Playfield column layout which worked out to 12 Playfield pixels, then 16, then the remaining 12. You can put the 2 zone borders at any 6 pixel increment but if you want to use the Playfield in a tile like manner this is the closest division into 3rds.



The 2600 color palette?

I thought it might be worth discussing the color palette used on the 2600, although this is a digital approximation of an analog color palette its close enough to make judgments on its limitations. Generally speaking the 8 luminances available for each color(Well 7 and Black for the greys.) go from a small dark and saturated range to a heavy amount of light almost whitened brighter range of shades. In practice the 1st & 2nd brightest luminance of every color are so close that I often skip one and just use either one but not both in a row unless I'm doing an obvious gradient. What proves challenging is coloring things with desired color and saturation and still having sufficient contrast at the same time, most of the time I vary the Background color to try to balance the contrast of 2 sprites in opposing luminance ranges as in using a medium tone for the Background.

I tend to favor the darkest luminances of Green since the brighter range is just too minty for my tastes when trying to emulate the green tones on other gaming platforms.

The brown column is the best base colors for flesh and earth tones but with such limited colors per sprite you can risk humans disappearing in forests when they overlap one another. In between the Green and Brown columns are 2 ranges of brownish green which are kind of sickly with there green hue but the brighter range of luminances are brighter than the brightest brown shades so they can work as highlight tones for brown sprites. Also the darker Orange range(Last 3 shades.) can fill in for brown at times.

The standard Nes color choice of highlights in White and shadows or outlines being Black works just as well on the 2600 when applicable to rendering limits jsyk.

The red range pretty much sucks since only the last 2 darkest tones come close to the traditional Red we all know and love. Red pretty much changes almost immediately to Rose red and just gets brighter as you go up. I tend to favor the 3rd brightest Red for my traditional red needs.

Yellow,Orange, and Red Orange are fairly interchangeable for regular fire needs. The brightest Yellow is pretty much the closest you'll get to its primary color equivalent (EG. Pac-Man color ^_^.).

There is plenty of Blue and Magenta to play with, Blue has obvious uses but I never know what to do with Magenta other than Bubblegum or pink dresses. :lol:
Starting from the left going right after Magenta we have Purple, Navy Blue, Blue, Light Blue, Pale Blue.

Although Purple, Navy Blue, and Blue represent distinct colors they are close enough to match in a gradient or color ramp as for example the darkest Purple luminance is darker than the other dark blues. In this regard its possible to run diagonally through the palette.

Blue & Light Blue mix well as far as gradient, saturation, and contrast wise which I bring up only because the upper luminances in the palette don't differ enough for adequate contrast most of the time.

Pale Blue is kind of dead or drained of life that it could make a nice stormy ocean color or perhaps a colored metallic. You could use it for creatures but it lacks warmth so in someways it would be better for a sickly tone or for the look of the undead.

In those rare contexts where you actually have maximum control over the choice of colors and resolution put into one subject matter IE. an art slide you're going to have to aim for hue approximation most of the time much like C64 pixel art as in the smoothest color ramps rather than a traditional gradient (EG. bridging with greys or other differing colors.).


ANSI art? I think the artist's name is within the image translation.

ASCII art is pretty much out of the question since text rendering is not a strong suit of the 2600 but ANSI based art is more viable. This example takes a safe approach employing only the Playfield for the bulk of the image rendering. Here I just created Playfield based scanline dithered equivalents of the blocks used in ANSI art and replicated there positions within. It's very basic and plain but it gets the job done. :)

Here a more refined approach.

This work is far from complete but I wanted to mention it right now. What I'm seeing so far is the need to use quadruple width resolution as a visual standard since although the Player objects can produce a good double wide block graphic of dither the bit constructed variants can only cover decent amounts of screen width distance if I set the Missile and Ball width to 4 pixels wide to get as many dither blocks in a row as possible. Also note the use of Player object blocks drawn to wider resolutions rather than actually being stretched by hardware so they match there bit constructed counterparts at the wider resolution visual standard but don't cancel out Missile bits.

As you can see the denser dither patterns can actually be rendered partially with the Playfield while lighter less dense dither requires more and finer gaps which only the Player object can do effectively. Need to work on this more but I think that's enough to get the basic method and limitations of doing ANSI style art on the 2600.

Traditional dither test:

Here I tried the standard 5 variations of dither pattern common to pixel art at 3 pixel widths of 2,4,and 8 or Playfield standard. While 2 and 4 pixel widths worked normally the 8 pixel width option required both more vertical pixel spacing and 2 additional dither patterns(wavy lines) to smooth out the dither transition and stop banding within an 8 bit wide Playfield bank. I could likely normalized the 8 pixel width variation if I stepped up to 2 Playfield banks or 16 bits wide but that would result in an enormous dither transition that would be hard to fit on screen at once.
Strong color contrast definitely looks worse the wider you make a pixel unit that you'll likely want to stick to the least amount of contrast especially with 8 pixel width units which primarily resides in the brightest luminescences of the 2600 color palette.
While a gradient invoked in the Playfield or Background will offer a smoother gradient it doesn't contain any texture and dithering a gradient does have the advantage of requiring less color interrupts per scanline which does make for a trimmer display kernel simply from less color changes per line.

Anti Aliasing? Short answer no usually, long answer...

You only really have 2 main options of horizontal streaking dither or employing one of the 3 loose bits to render the aliasing colors. Despite such large pixels in the Playfield the same basic rules apply to dithering on the 2600 which include mostly gross large scale use with small scale turning to noise when dithering is applied. Despite CRT blur I tend to look to the future and avoid high contrast colors when dithering so graphics will look good on both new and old display technology, it worked for Capcom it will work for you.
Using actual aliasing is a highly contextual setup to use on the 2600 best left to demos and title screens since it would be very difficult to design a game around its limitations. Your strongest usage lies in working with Missile copy gap distances as to avoid the employment of yet another Missile or the Ball for every occurrence. Its easy to assume you will be limited to primitive shapes and repeating patterns in this pursuit. Regardless the line being drawn with Missile changes shade per scanline smoothing the difference between the 2 colors you'll likely be restricted to within your specific height resolution zone.
Wish my example was better but I'm only fair at manually aliasing pixel art but I keep trying. :-[

Here's some examples of dithering and aliasing from my attempt at porting Shadow of the Beast to the 2600. :crazy:


Still it demonstrates dithering within the Playfield resolution quite well. ;D


Since the Playfield pixels are much wider than they are tall even when you thicken the scanlines the difference in resolution is very obvious. The best you can do in a Playfield drawing to make lines appear thinner is to omit lines to make it look less solid and more thin. As you can see there is a limit to how much you can omit as it just turns into pixel noise and the line disappears.


Its best to try and find a compromise between details and solid color or solid dither color zones as the coarseness can really degrade an image into unspecific homogeneous noise. It can be tricky to balance symbolism with specific pixel detail. :yell:

I gave a go at dithering the Playfield within a 2 line kernel.

What I'm seeing already is I'm macro-sizing the bitmap size just to define the texture better with the taller pixels. Based on this I'd say the number of viable dither shades will lower as you thicken the lines and you'll have to use dither shades with higher density contrast between each shade just to keep the difference apparent and keep the image from turning into noise.
Because of this thicker line design should probably lean towards more colors through color changes per scanline per sprite object which actually makes sense since often thickening the lines is used to help towards the cycle costs of invoking color changes per scanline.


Multi-color is the most common term used for making 2600 pixel graphics with more than 4 on screen colors, while 4 is the limit horizontally changing the color per scanline in each object will increase the number of on screen colors.

Increasing the number of colors horizontally is extremely sparse and costly to render with the Playfield capping off at 3 at most which based on its CPU costs won't work with every single game design. 2 colors per Playfield scanline is practical when it occurs at the center but when placed off center still comes at a cost that may limit what you can do overall. The sprite objects(Player0/Missile0/Player1/Missile1/Ball) also can have mid-line color changes per scanline but the timing and horizontal distances between color changes have the same width restrictions(Every 3 color clocks or 6 pixels) plus CPU costs making this option very limited in uses except if you design towards that limitation like in a HUD or menu but it gets hard to apply to game sprites. Because of this I suggest working within the defaults instead of relying on rendering tricks as much as possible.

I'll go over the basic color limit of each sprite object. Note this is if each object has the same scanline alignment since scanline isolation will allow independent colors for each.
-The Playfield and Ball share the same color default.
-Player0 and Missile0 share the same color default.
-Player1 and Missile1 share the same color default.
-The Background is only one color total.

So the basic rule of adding another color horizontally per scanline comes at the cost of spending one sprite object set to that intended color. Beyond the large sacrifice of one of the very few sprite objects we have to use it also creates a requirement that every occurrence of that object regardless of shape will be set to that color for each individual scanline those sprites reside on and there copies.

Here's a basic example of plotting logical color zones vertically in a game. I used this for a platformer game to work out the average height of each color zone where I intended to add a color change vertically across the Playfield. I went with a logical order of the top row being being black for HUD space, followed by white for a cloud zone,then various colors for the platform blocks, and then the last row or lane being my ground color zone. From there you can work out further color changes per individual zone. A good example of this color distribution can seen in Keystone Kapers which is the closest equivalent I've seen to Super Mario Bros. on the 2600.

I know it doesn't really line up but things change in practice. :P Despite being a rather ambitious/dubious visual target it will suffice for this description. It at least demonstrates how plans can change when faced with the reality of rendering setups. I should credit PAC-MAN-RED for the Mario sprite with the highest color count that I used as a base for the other variations.

I thought the ground couldn't be done efficiently but if I use the Background to create the light green block and layer the Playfield of dark green over it that should work. :)

The pipe bells are colored yellow as I assigned that color for that vertical zone and I've varied it to outline and shadow it but I also used a Missile1 segment to create the edge shadow on the right side. Okay I've just boxed myself in since I wanted to use Missile1 for the turtle as part of a bit construct but its busy doing a pipe shadow lol. My best option is to make the turtle with Player1 instead of a bit construct made from Missle0 & Missile1, I wanted to allow at least 2 enemies to occupy the same vertical space but that would only work well if both sprites were a single color otherwise one would corrupt the colors of the other. I think I'll just keep them vertically separate instead so they can share the same object. This means Goombas with Vertigo as in fear of edges or falling. Actually much of the problems associated with the pipe side shadow rendering could be avoided if I accepted Black or another dark color as the default Background color and just created holes for it to show through.

Okay despite the Piranha Plant & Thwomp being part of this mockup I never intended them to exist on the same screen since they both use Missile1 and the Ball so only one or the other per screen but not both unless I can keep them from aligning horizontally with careful positioning.

The platform Blocks are a combo of Playfield,Missile0, and Missile1 where I've offset light red and black in an odd & even scanline alignment so they can share the same object, plus I vary the width of the Missile bit every other black line. This will mostly be a challenge of getting the copy spacing to align gracefully with the block layout, may have to flicker or strobe some copies to more ideal horizontal positions if it proves too difficult.

Next we have Mario and a Goomba which are Player0 and Player 1 or your basic player & enemy division of sprites. Seperate objects so seperate color schemes. I'll have Mario throw the Ball object for his fireball and limit it to only one active Ball which clips after a certain number of seconds not unlike Super Mario Land on the GB. Since we have objects sharing different duties color dominance becomes an issue between the platform tiles and sprites. Since Mario and the Fireball are smaller we let the platform tiles color them in those instances meaning the fireball will change color as it bounces around and Mario will strobe briefly as he passes through each platform blocks color zone. Its a bit glitchy but I'm willing to accept the consequences of enhancing the background graphics.

Next up the breakable blocks which are built from Playfield for the main brick part where I'll leave spaces and fill the ? blocks with a Missile bit as that's the easiest way to give them a separate color. The ? icon would likely use Player 1 to avoid the complication of creating it with a bit construct but the bolt pattern is simple enough to bit construct so we can avoid any multiplexing flicker issues if it shared Player0s scanlines with Mario as he passes through those vertical spaces often. Clipping parts of the Playfield has been done since Pac-Man, Dig Dug, Centipede, etc. all use Playfield alteration as part of the gameplay structure meaning something could be worked out for smashing and eliminating blocks. Also Mario Bros. on 2600 had upward block bumping animation so the different behaviors between large and small Mario can be accomplished.

Then clouds which are pretty much a repeat of the platform graphic in construction but without the interaction or clipping needs.

And lastly the top row for the HUD which gets its own lane so it can go about the task of rendering text unhindered by any other sprite needs. Despite being able to walk over the stats in the original SMB you sure can't do that on an Atari.

Well it started as a discussion of multi-color use and it became a total restructuring of how I'd approach SMB on the Atari. Still you have to work out ahead of time what object renders which sprite, the average costs of any rendering tricks needed, and possible graphical step downs for everything involved.



I'm going to say as a general guideline the pursuit of multi-color doesn't just come with CPU costs but also limits your gameplay structure at times just to keep the visuals "solid" and consistent. A good example is Grand Prix on the 2600, it looks nice but the gameplay is incredibly limited just to maintain its graphics standard.

 I keep coming back to the polygon analogy to describe how graphics limits work on the 2600 as every graphical enhancement adds rendering cost just like increasing poly counts or effects passes as it dictates what you can do in the game as a whole while tilemapping is more about the palette limits of all tiles as a group since you're never limited in the number of tiles that can be rendered on screen nor are you restricted in the design of its form.

Something that can reveal more than I can ever describe about object distribution in 2600 graphics rendering is if you download the Stella emulator and try the debug mode on some game ROMS (Alt+Comma on Windows/Linux) as this will show the method employed if you're trying to make a particular type of game and need to know the way the 2600 achieves that.
http://www.atariage.com/2600/emulation/index.php?SystemID=2600
http://www.atariage.com/system_items.html?SystemID=2600&ItemTypeID=ROM


Multi-color Sprites?

If I had any advice for sprites on the 2600 is to either prepare to reduce quality to get the desired gameplay within your cycle budget or alter and scale back gameplay to cater to your visuals.

Here's a couple familiar characters I've tried to translate into 2600 form, I decided to give myself carte blanche in width resolution suggesting a setup with Missile and Ball based pixel extensions so its plausible but would be a rather limited game with only 1 or 2 sprites per vertical zone at most for the most colorful versions if at all. Regardless it demonstrates the basic color techniques and layouts used with early Atari sprite design.

-Despite the dubious nature of my highest color variant the concept behind it is sound which is to share colors between both Player objects by using the opposing Missile on the opposing Player object to create instances of 2 colors per sprite scanline as well as leveraging the Ball for a limited use of a 3rd color. I say dubious because despite these two guys sharing the same colors the setup would work better if they had roughly the same height and build(EG. River City Ransom) so the vertical color zones wouldn't be so different from each other. Perhaps you'll have more luck with this setup than I did.

-The most basic step down is using a single color instead of using interrupts to change the colors per scanline. I'd say this option works better under a 1 line kernel setup as the single color will have you carving outlines and shapes into the sprite thus more height resolution equals better results. It truly comes down to making sure the forms are readable with this option and maintaining contrast between your foreground and background color, which a lot of 2600 games failed at in the pursuit of using every single color put before them.

-As you can see a 2 line single color sprite isn't a simple transfer from the 1 line version, it instead has to be optimized to its own standard often times adding height just to define forms better.

-Using basic color changes per scanline in the sprite is the most reliable way to increase the number of colors per sprite as it confines its color influence to itself which is the main drawback of mixing objects for more colors. Probably the hardest thing to deal with in the color changes per scanline is the vertical orientation as it only works well if your character is standing upright but it can't deal with rotation or diagonal slanting of character poses. The only leeway I've found in slanting or irregular section borders is to use a gradient to smooth the difference between these very short instances while drastic orientation changes need to default to a single color or consider overlays.
When switching from one color to the next I'd suggest avoiding total omission and instead outline forms with this differing color as you don't want entire body parts clipped off when one color zone dominates another.

The 2600 be a harsh mistress for any pixel artist as it demands much and offers little compromise. I'd say most of the time 5200 sprite work is transferable to the 7800 or even the C64 with some palette changes but much of 2600 sprite design is so specific to said platform that it only really supports itself unfortunately.
One minor exception is the Intellivision since when the 2600 uses a 2 line kernel they then share the same basic screen resolution if not the same on screen color count or the number of sprites possible per scanline, still is offers a rudimentary base for cross platform support.

I should mention mid-line color changes as it applies to Player objects. The 3 color clock or 6 pixel distance used in mid-line color change is a fixed value so using it to change the color of Player objects requires horizontal color zone borders to line up favorably with the copy gap distances.

In Medieval Madness the 4 player score numerals are spaced correctly so that they can have 4 unique colors. Also the Playfield use a combo of mid-line color change and the SCORE bit to create instances of unique colors in the Playfield as well such as the crowns and the section of wall next to them.


For reference here's a fellow making 5200 games which discusses in part the challenges of layering Players and Missiles, the 5200 uses more objects than the 2600 but I think it is still relevant to the 2600 subject matter.
http://cafeman.www9.50megs.com/atari/5200dev/KoffiArchives.html

Also here's Atari sprite work by PAC MAN RED who is quite good and a good reference point for Player object based sprite art.
http://www.atariage.com/forums/topic/169238-free-sprites-for-the-taking/

And for inspiration the Homebrew available at AtariAge, plenty of screenshots and reviews.
http://www.atariage.com/store/index.php?l=product_list&c=24

Plus the games that will hopefully eventually be for sale. :)
http://www.atariage.com/development_list.html

72
General Discussion / Re: Atari 2600 pixel art?
« on: March 09, 2012, 05:06:33 pm »
Quote
I still am not sure what you're trying to say.

Based on the Frogger example, is it just that you're using a single very tall sprite to draw several images, and delaying the drawing during different scanlines to change their positions?
Single tall sprite, no that is not the case in Frogger. Everything on the 2600 is being rendered in real time so it literally changes from one "bitmap"(Player0 or 1) to another bitmap over and over again as it draws the screen top to bottom. The 2600 doesn't have a frame buffer so it constantly has to manually refresh the pixels just to keep them lit. While this is a hectic process always "racing the beam" it makes the data highly modular thus using the same address or object across multiple sprites rather than one sprite per sprite like on other platforms. I know it sounds crazy the first time you hear it but that's the way it works.

73
General Discussion / Re: Atari 2600 pixel art?
« on: March 09, 2012, 04:10:29 pm »
Quote
So...  Two unique sprites per horizontal scanline as long as sprites are not occupying the scanlines?  Or are you talking about a very specific programming trick.
I know it seems confusing when compared to how scanline to sprite limits work on other platforms with block based sprites but it is different. Remember what I said about the 2 Player objects being capable of being any height resolution you choose, well the height of the sprite defines the amount of scanline height and its limitations for said Player object. Where ever the sprite is within the vertical field defines the zone at which only 3 copies can be rendered per Player object, and that's per object as Player0 & Player1 do not effect each others rendering limits.

Specific programming task, well everything on the 2600 would fall under that definition lol but if you're asking if its a common practice then yes it can be done without much difficulty. I'll always make sure to clarify anything that could prove difficult or proves to be unreliable for average use or only possible under certain contexts.

Quote
I'm going to be honest, learning about Atari 2600 hardware restrictions becomes that much more difficult for the purpose of doing mockups (that have no programming backing) and pixel art when one also has to learn about every specific programming trick in very specific games that have broken the restrictions.  I'm hoping to mostly get a summary of the hardware itself with some minor exceptions that can be made.
Believe me I sympathize with what you say about no programmer backing as it can put you in a position of much doubt but that's where I'm everyday since starting this quest. I'm afraid there isn't much of anything done on the 2600 that isn't restricted or defined by its unique hardware, as far as breaking the restrictions we're talking hand and glove here since its more like if you want to do X then this is the particular setup you'll need. This is kind of why I described this guide being in terms of sprite contexts(Portraits/HUDs/Text/Sprites/Level Tiles) and or game Genres(Shooter/Platformer/Fighter/Etc.), a lot of my proposals on AtariAge are setups or structural templates for achieving the 2600 equivalent of things done on stronger gaming platforms.

Quote
I did want to ask, is it possible to feasably alter a chunk of the playing field (such as the middle two columns) without affecting the rest of the playfield?  I'm thinking about doing an Atari 2600 mockup of a first person view AD&D style game and I'd like the view of a first person area to change to that of a detailed creature.
Yes you can alter specific Playfield columns while leaving the others unchanged, such setups have been done before since the Playfield columns constitute individual banks in the Playfield register.

I'd love to take a look at it when you're ready to show it. :)


74
General Discussion / Re: Atari 2600 pixel art?
« on: March 08, 2012, 01:53:37 pm »
Quote
Technical Resolutions: 320x192, 320x96 (double tall pixels), 320x64 (triple tall pixels), or 320x48 (quadruple tall pixels)
NOTE: Depending on the game, some horizontal pixels may be omitted where clock cycles were used to process game logic.
Some horizontal pixels may be omitted sounds kind of vague, if you are referring to what I said about pillarboxing then yes omission of certain Playfield columns is possible. I tend to find clipping the first 4 blocks off the left and right useful for some games as well as dedicating the first 12 blocks on either side of the screen for a menu or HUD.
As far as processing game logic that is usually done in between graphics rendering passes. The reasons for omitting a column or bank of Playfield pixels tend to vary.

Quote
Playfield: 8x1, 8x2, 8x3, or 8x4 pixels (depending on resolution) of foreground & background color, foreground color can change within the scanlines on an 8x-width pixel by pixel basis.
Hardware demands the playfield to be symmetrical, but can be coded to be asymmetrical.  [See BladeJunker's guide on how collumn splitting works]
That looks right to me about Playfield pixel size. However the hardware defaults are Symmetry mode or mirroring and Tiling mode like you see in my column split chart. Only asymmetry requires special coding.

Quote
Player sprites: Up to two unique sprites on screen, 2x1, 2x2, 2x3, or 2x4 size pixels, must be 8 2x pixels wide, can be as tall as desired.  Can be copied*.
Okay pixel sizes look accurate to what I described. However up to two unique sprites on screen isn't exactly true since you can vary the Player sprite vertically based on a set height resolution. Let's say you use a Player sprite that is 24 pixels tall, based on 192 lines of vertical resolution you could vary that one sprite 8 times. A good example of this feature is Frogger where the type of sprite switches from different car styles up to logs and turtles which all use the same Player objects but are isolated into vertical bands.
This will be featured as part of my scanline isolation post jsyk.

Quote
Missile 1 & 2 sprites: Single pixel that is 2x, 4x, 8x, or 16x wide, can be any height.  Corresponds to relative player sprites.  Can be copied*.
Looks good on pixel size. I'd say Missile0 and Missile1 are associated to there Player counterparts as each share the same default color with there pair but should still be thought as there own separate independent movable object. Can be copied up to 3 times*. I'm guessing the * is related to the unique visual quirks when copies are invoked?

Quote
Ball sprite: Single pixel that is 2x, 4x, 8x, or 16x wide, can be any height.  Cannot be copied.
Pixel sizes look good. Can not be copied is a little strict since by default the hardware may not support a copy per se, but with the right setup of multiplexing you could get more than one per scanline. I admit that multiplexing is a less stable and dependable option but it still exists. Perhaps another * is required? ^_^

Quote
* Whenever you copy a sprite, it shares the same x & y origin of the original sprite for movement, and must be offset by 32, 64, or 128 pixels.
It only really needs to share the X axis of the original sprite in movement, refer to what I said about Frogger. The offset pixel widths are fine but its important to remember that the said objects width is included as part of the offset distance rather than just added to the width of the object and the origin point is to the left most side. Can't hammer this point enough I'm afraid since its not at all like "regular" tiling on other platforms. :)

75
General Discussion / Re: Atari 2600 pixel art?
« on: March 08, 2012, 05:28:27 am »
Okay so...  The missiles cannot intrude on another player copy's personal space just as another player object cannot? 
No all 5 movable objects including Player0, Missile0, Player1, Missile1, and the Ball can all overlap with each other but when you render a copy of any of these objects(excluding the Ball which has no default copy ability.) it requires a mandatory gap of 3 possible distances from itself not the other objects.

Try to think of it as a multi-layered abacus where the beads are locked to a set distance apart from each other if that helps.

76
General Discussion / Re: Atari 2600 pixel art?
« on: March 07, 2012, 08:07:27 pm »
Quote
Everything looks in order here too. Just be careful with the horizontal alignments as its easy to put pixels where you want them versus where they can actually be.
I'm honestly not sure what you mean.  Are you saying that the missile and ball sprites' x & y positions are attached to a grid based on their size?

Sorry I didn't describe the width distance between object copies very well, but I think I made it more coherent now hopefully.

77
General Discussion / Re: Atari 2600 pixel art?
« on: March 07, 2012, 03:06:28 am »
Quote
Do I get this right?
I think so.

Quote
Standard Resolutions: 320x192, 320x96 (double tall pixels), 320x64 (triple tall pixels), or 320x48 (quadruple tall pixels)
Looks okay to me as long we call it the Standard Canvas Resolution since you never actually get to use all 320 pixels on a real 2600. Just making sure. :)

Quote
Playfield: 8x1, 8x2, 8x3, or 8x4 pixels (depending on resolution) of foreground & background color, foreground color can change within the scanlines (I assume keeping to the 8 pixel wide grid?)  Normally symmetrical.
Yeah that will work, I'm guessing you're going to try to setup a specific pixel size within a paint program and save yourself a lot time versus etching them out manually like I've been doing which is slow? Yes keep each Playfield pixel 8 pixels wide only as that will approximate the real thing. I wouldn't get too hung up on symmetry unless you intend to use a lot of color changes per scanline, asymmetrical rendering does use a moderate CPU cycle cost.

Quote
Player sprites: Up to two unique sprites on screen, 2x1, 2x2, 2x3, or 2x4 size pixels, must be 8 2x pixels wide, can be as tall as desired.  Can have three copies of each, but the copies move with the original.
Well specifically up to 2 unique Player sprites per vertical scanline height as you can create more sprite variations with vertical isolation from each other. Okay 2X1, 2X2, etc. size pixels, yes that will work for Player object sprites. Yes the 2 Player objects only have 8 bits or pixels across its width. And yes 3 copies of the Player sprites which all move and animate in unison with fixed mandatory distances between each other, there are 3 gap distances for copies which basically doubles with each setting higher.
I'll cover more of this in my next post, just been tired so its taking a while to get everything together. :)

Quote
Missile 1 & 2 sprites: Single pixel that is 2x, 4x, 8x, or 16x wide, can be any height.  Corresponds to relative player sprites.

Ball sprite: Single pixel that is 2x, 4x, 8x, or 16x wide, can be any height.
Everything looks in order here too. Just be careful with the horizontal alignments as its easy to put pixels where you want them versus where they can actually be. ;)

78
General Discussion / Re: Atari 2600 pixel art?
« on: March 06, 2012, 04:10:07 pm »
Quote
I seriously need to try and break down your post and simplify things for reference.

Do I get this right?

Standard Resolutions: 320x192, 320x96 (double tall pixels), 320x64 (triple tall pixels), or 320x48 (quadruple tall pixels)

Playfield: 8x1, 8x2, 8x3, or 8x4 pixels (depending on resolution) of foreground & background color, foreground color can change within the scanlines (I assume keeping to the 8 pixel wide grid?)  Normally symmetrical.

Player sprites: Up to two on screen, 2x1, 2x2, 2x3, or 2x4 size pixels, must be 8 2x pixels wide, can be as tall as desired

Missile & Ball sprites: ???  I don't think these were properly introduced, you only talk about how to incorporate them into player sprites instead of what they are on their own.

At times it doesn't look it but this is actually the simplified description, the real 2600 development environment is primarily a programmer's domain. Believe me I barely understand it even after of months of research and consulting with anyone who would answer my many questions which probably seemed elementary to them.

Sorry about the missing info, those are those kinks I mentioned lol. I revised my post and I hope it is better, if not I'll change it some more. :)

79
General Discussion / Re: Earthworm Jim's "Animotion" Technique
« on: March 06, 2012, 06:31:24 am »
Quote
I've tried to downsize a picture with about 8 or 16 colors, but I could never get anything this nice.

How bad are your results since you're so dissatisfied, may we see your tests? A closer look at whats going wrong for you would help narrow down the problem more than remarking at how great it worked for Shiny. :)

80
General Discussion / Re: Atari 2600 pixel art?
« on: March 05, 2012, 11:43:47 pm »
Why did I set my sights on the Atari 2600 for a discussion of pixel art? The main reason is that the machine gets a lot flack unjustly, I'm sure you've heard derogatory statements like "That looks so bad it looks like Atari." or patronizing it "It doesn't look good but what can you expect, its Atari.". Every game system has its strengths and weaknesses but each has a maximum quality level that should always be met, like with pixel art you want it to look as good as it possibly can get whether 2600 or PS3 the standard should always be the same.

I'd say its safe to say we're a visual lot on this pixel art forum and although being a good artist doesn't negate programming ability its safe to assume an abridged cliff notes approach is more useful here than a long description of how the TIA works. I'm not a great writer so might as well try some descriptions out and work out the kinks. :)

Well might as well start by saying that 2600 graphics design is directly transferable to the Atari 5200 and 7800 as the hardware architecture of graphics rendering is pretty much the same. So even if you go overboard on a design and it ends up not being possible on the 2600 you can always go up a hardware generation. I mostly focused on the 2600 because it was the most popular of the 3 consoles having the longest life span ever for a game console.
I don't know the 7800 well enough but the 5200 has twice the sprite objects of the 2600 and includes hardware acceleration for many of the common code kernels used in Atari based graphics rendering so its significantly faster and more versatile despite not selling very well when it was released. One good thing is that Atari 400/800 computer line(Which did sell fairly well.) and the 5200 console share the same hardware design except for a few small differences but it does expand the retro user base further for software of this type.

Atari 2600 object list: Playfield, Background, Ball, Player0, Missile0, Player1, Missile1

Atari 5200 object list: Playfield, Background, Player0, Missile0, Player1, Missile1, Player2, Missile2, Player3, Missile3
*As you see 4 Players & Missiles but I couldn't find a Ball object on the 5200, Atari cutting to the bone as always offering no extras. :'(

I should explain Color Clocks since the 2600 doesn't technically deal in pixels with the TV acting as part of the video card. Despite looking like pixels they are actually analog drawing units thus being able to literally stretch instead of doing so with scaling calculations like you would normally do with pixels. Anyway I'm making it sound complicated so here's a conversion table so you can use actual 2600 terminology so mis-communications don't occur if you pursuit a 2600 homebrew project and need to speak more literal Atari terms.

1 color clock=2 pixels wide
2 color clocks=4 pixels wide
4 color clocks=8 pixels wide(A Playfield pixel is 4 color clocks wide.)
8 color clocks=16 pixels wide
...and so on.

I find this table helpful when trying to describe the dimensional size of a sprite or explaining distances to an actual 2600 programmer. Not to knock programmers but they tend to be a literal bunch without any means of interpretation for less than specific programming terms. Perhaps I'm being hard on them since "moving" within any programming environment is probably hard that sticking to a single mind set makes navigation easier. :sry:

Let's explain the canvas size I use when screwing around with 2600 graphics design. It's 320X192, while the 2600 is technically capable of doing more than 192 vertical lines of resolution, on average most games do not exceed this amount for CPU and overscan considerations. Despite using a single layer canvas the actual 2600 is a multi-layer system of differing resolutions.
My buddy SeaGTGruff uses 800X576 as he is trying to approximate the vertically stretched pixel into a crisp exact pixel unit of 5:3 in shape but even that isn't perfectly 4:3 in aspect ratio. In the end the stretch is "soft" and analog that I think for the sake of file sizes in mockups 320X192 would suffice as old VGA 320X200 was also a stretched standard too.

*Exceeding 192-200 active scanlines can result in the top & bottom of the screen being chopped off. While it varies from TV set to TV set 192 is the safe overscan limit most likely to work with the widest range of NTSC sets. The overscan is different for PAL standard but you would be better off asking someone who lived in PAL regions to get a proper assessment since I just barely understand NTSC as a standard. ;)

The Playfield is your primary means of rendering level graphics which is only 40 "pixels" wide. Its not as bad as it seems since realistically much of level construction is bulk fill but you do have the option of changing the color per scan line, changing the color mid-line, or stripping out pixels and having the background color show through the holes. Before someone mentions mirrored Playfields, asymmetry has been conquered on the 2600 so its "mostly safe" to draw freely across the screen with Playfield pixels.

Overall the Playfield should be thought as a single image or a low resolution bitmap that fills the screen in regards to the degree of segmentation possible. There is no tile sheet or tilemapping to speak of except for a few small exceptions(The Playfield columns,the Missiles, and the Player objects.). While you can design blocks of graphics to specific block sizes for the sake of balancing the level graphics scale to the sprite scale for the most part the Playfield is just one big chunky bitmap, sort of liberating in its own way. :)

Here's some testing of block sizes from 1X1 up to 8X8 blocks(1X6 pixel block).





Something of note about the Playfield is its a 20 bit or pixel register split into 3 columns of 4 blocks wide(PF0), 8 blocks wide (PF1), and another 8 blocks wide (PF2) to the center which by default mirrors or tiles the other half to complete the full 40 of the screens width(4-8-8-Center-8-8-4). I mention this since these horizontal breaks can be used in a semi tile fashion to repeat image blocks or to omit areas of the screen as in pillar boxing. Yeah I know they are giant tiles but it is supported in hardware.
For the curious I'll mention vertical splitting of the Playfield for tiling purposes, while a single split added for the HUD is common to 2600 games splitting the Playfield vertically for tiling purposes is a difficult programming task only accomplished by a few 2600 masters over at AtariAge (EG. Boulderdash on 2600,check it out.).

http://www.youtube.com/watch?v=w6Ge6G9sT9E

The complication in smaller scale tiles is the code kernel related to the division itself as the Playfield image data (tiles) can exist in a variety of sizes or dimensions when not being displayed but when actually rendered on screen the 40 bit wide Playfield register is the end result always meaning it has to be converted to the larger Playfield bank size (4 & 8 bits wide respectively.). It really comes down to overburdening the CPU with so many tasks and those precious few cycles afforded to you.

EG.(Typical)
-Game Logic
-Sound
-Standard Display Kernel(Default use of all sprite objects.)

EG.(Small Tiles)
-Game Logic
-Sound
-Tile construction
-Tile sheet combiner
-Asymmetrical Playfield
-Standard Display Kernel

EG.(Small Tiles+Sprites+)
-Game Logic
-Sound
-Tile construction
-Tile sheet combiner
-Asymmetrical Playfield
-Missile Sprite Left Kernel, Missle Sprite Right Kernel
-Ball Sprite Player Extension Left Kernel, Ball Sprite Player Extension Right Kernel
-Standard Display Kernel

Although just a basic example you can see how tasks accumulate and the timing and execution of them can overwhelm the 6502 CPU quite easily when the vast majority of CPU time is spent with real time rendering everything both visible and behind the scenes with no hardware assistance.

This aspect wouldn't be so bad if there was more room to segment and module the engine like we do now for convenience at what is now a minor cost in CPU time. However with the 2600 there is little opportunity to segment making the engine a fully integrated optimized code base, much like the game Jenga push one block out and the whole structure could cease to work.
As an example David Crane didn't have a Lives meter in Pitfall initially until his colleagues badgered him to add it which was worth while since it made the game more accessible to the large majority of players. Despite this addition being warranted he basically had to take the entire engine completely apart to add this gauge since it was so tight with 1-line kernel graphics and the level generating demands.
I bring this up since the 2600 development environment is the polar opposite of something like Flash where you can just add things at will. I'm a terrible game designer with bad habits but even I would say a well thought out design document is needed before you actually make an Atari 2600 game.


Sorry this should have been in here from day one. :-[
The Playfield has a SCORE bit which allows you to change the Playfield color at the center of the screen to a different color for the left and right side of the screen. This is hardware based so it doesn't come with the usual software based CPU costs of mid-line color changes. So this is another safe bit of color change you can invoke in the Playfield. :)



Here's an example of the Playfield columns, added some arrows to show the default mirroring directions.


Same thing but here's the Playfield tiling option which in my opinion doesn't get employed enough despite being a default setting.


Something I should mention about using the Playfield columns as a tile grid is that you can only use it to expand configuring options under an asymmetrical rendering setup but not to save image space because the Playfield register has a fixed linear reading order. To be specific you actually use 50% more image space IE. 2 full Playfields for asymmetrical rendering since each Playfield Tile has to include both a left and right facing copy in order to render in the correct orientation for each side of the screen.
The Mirrored or Tiled Playfield modes are completely fixed layouts where you can omit a column completely but any exchange of one column graphic for another would be reflected in its opposing column register.
Lastly these are 2 column widths of 4 and 8 bits respectively which aren't interchangeable so its an either or situation in that regard making 2 distinct groups or types of Playfield columns.

Whoops sorry again. :-[
The Background layer actually does have a small amount of resolution control in it that you can change the color per scanline IE. a 1X192 image layer. Despite limitations these 2 layers combined (Playfield & Background) do offer possibilities of 2 color background graphics if catered to.

Here's an example of a simple background made using the Background layer, I could use the Playfield to layer on some other details, or make a giant Playfield sprite,  etc.

2 Color tiles:Mostly concept work of Playfield+Background colors and others that use Missile layers.

Despite a lack of true tiling options its best to cater to the Playfield as if it had tiling when it applies to bitmap patterns and you should also try to fit things to the natural horizontal breaks in the Playfield register of 4 or 8 bit wide banks.

Options: Default savings through mirroring always present with tile mode offers varying amounts of image space savings.

-40:40 bits(Playfield pixels) wide or the full screen of completely freeform bitmap data, other than mirroring no image space savings.

-40:12 bit wide tiles, partial savings in PF0 & PF1 which do tile but PF2 requires 2 unique tiles or island tile.
-40:8 bit wide tiles, decent tiling option as two-4bit and one 8:bit wide Playfield bank can tile fill whole screen.
-40:6 bit wide tiles, partial savings in PF0 & PF1 which do tile but PF2 requires 2 unique tiles or island tile.
-40:5 bit wide tiles, tiling option will save space but right side of screen irregular unless you use isolated tiles with border trim or islands.
-40:4 bit wide tiles, best tiling option as one-4bit and one-8bit wide (Two 4-bit wide tiles paired)Playfield bank can tile fill whole screen.
-40:2 bit wide tiles, same as 4 bit wide option.

The canvas is 320 wide simply because 40 Playfield pixels fit inside as do Player objects drawn to double wide res(160 to 320) or C64 width standards and Missile and Ball bits at variable widths. So in this canvas approximation all your sprite object designs will fit and align to the varied 2600 layer resolution scales.

I mentioned 192 as the basic height resolution used in most 2600 games but it is actually variable based on the thickness of line kernel used within the engine, using thicker lines is used to save cycles during rendering but typically helps with animation smoothness. At 192(1 line) regardless of pixel widths its about as sharp as C64 graphics, at 96(2 line) lines of vertical resolution its close to 1:1 pixels looking a lot like an Intellivision standard, at 64(3 line) its gets chunky and similar to a 80X64 screen resolution in practice, and 48 lines(4-Line) which is pretty much like 64 vertical lines but taller lol.

You can actually set line thickness differently between all 6 sprite objects per scanline (Playfield/Background/Ball/Player0/Missile0/Player1/Missile1) but for visual consistency and engine efficiency its best to stick to 1 global line thickness standard. If you do want to differ the height resolution its best to cordon it into deliberate areas of use like a single object or scanline height zone instead of changing it sporadically since everything invoked including line thickness changes consume those precious 76 machine cycles per scanline.
EGs. HUD bar scanline zone is 1-Line but game graphics region is 2-Line rendered, Player objects are 1-Line but all other objects are 2-Line rendered.

Playfield resolution options:
-40X192(1 line)
-40X96(2 line)
-40X64(3 line)
-40X48(4 line)


Note this example demonstrates line thickness but the pixel width is strictly different between Playfield, the 2 Player objects, and the 2 Missiles and the Ball which all have different pixel width standards(EG. 1 Playfield pixel is 8 pixels wide in the canvas while 1 Player object pixel is 2 pixels wide in the canvas.).

The grid scale in the canvas uses 40X32 blocks of 8X6 pixels each to compensate for the heavy vertical stretch that occurs when graphics are actually rendered to the 4:3 aspect ratio. Its not perfectly exact but its a close enough in dimensional size that each block will be close to equal in width and height when stretched. For game graphics I just rescale my mockups to 800X600 to test how tall things will be after stretching.
Overall the canvas block size of 8X6(Well really 1X6 on an actually 2600.) pixels is a sturdy guide for plotting out level structures and should be thought of as your minimum level block size akin to the 8X8 used on other platforms.

Here's an example of what 3 line kernel graphics would look like.

As you can see its very tight and the thicker vertical lines handicap any finer resolution horizontally in composition, used 4 pixel width standard to compensate. Level layouts are definitely made smaller or more simple at 3 lines thick out of necessity, it looks like 2 floors would probably reasonable and some added vertical scrolling or extremely spartan level design would balance out screen space constraints.
I know I overdid it a bit in colors and bits per scanline but it was mostly just seeing what could be drawn into the resolution well. Such a setup would have benefits in cycle cost reduction being only 64 lines tall, things like animation smoothness, multi-color graphics, and sprite multiplexing would have less drag on the CPU even when used in combination compared to doing the same with 1 or 2 line rendering.


Actually the formula for vertical aspect ratio stretch that SeaGTGruff gave me should work with one tweak. Take your height resolution value multiply that by 3 and divide that by 5 to get the color clock width, lastly multiply that by 2 to get the width resolution that is compatible with the canvas size I posted. Depending on the result of the width value you get you might have to round up or down so it will fit the resolution limits.
FYI I tried favoring the width dimension when trying for approximately equal height and width after stretching but was informed that catering to the height value was better since it falls more in line with how efficient kernels and graphics are rendered on the 2600 IE. per vertical scanline which is especially true with curves & circles.
Its not that you can't favor the width its just that it will be far less efficient in cycle usage if you vary line thickness and horizontally shift pixels differently per vertical zone in actual rendering just to get the exact height you're aiming for, its better to have a consistent basic display kernel using one line thickness option top to bottom and take advantage of tables and inverting width and position values for less CPU drag. It depends on the context which dimension you favor EG. Game graphics versus an Art Slide.


Sprites?  Whoops wrong credit, here is where I found these animal sprites. :-[
http://www.photonstorm.com/archives/2291/16x16-pixel-art-tutorial

The 2 player objects are 8 bits or pixels wide but since they are double wide they take up 16 pixels of width of on screen width not unlike C64 sprites. You have unlimited height resolution but that is actually a pretty useless feature except for a few isolated contexts where that factor can be utilized. You can pair both Player objects together for a 16 pixel width but its quite a sacrifice unless you can ensure both players never reside on the same scan line as in a Tennis game where the net separates them or that all other sprites can be made using Missile0, Missile1, and or the Ball pixel.

The standard 2600 sprite description of 2 Player objects 8 pixels wide is often enough to stop a pixel artist dead in their tracks based on its meager offering so I'll instead go over some options to make the 2600 less stifling.

The 2 Player objects will probably be the most familiar and friendly object found on the 2600 as its the closest you'll get to standard pixeling. There are quite a few editing programs to create standard Player object sprites but I haven't found any that support bit constructed sprites or extensions to the Player object as that is typically handled by a programmer.

The easiest way to describe Missile0, Missile1, and the Ball is to think of each as a single pixel with multiple width settings and any height you choose. There names denote there most infamous uses in most 2600 games as each Player object has a Missile object that acts as its projectile and the Ball object or sprite was first used as a ball that the 2 players could bat around. Over the years after the 2600's release both Missiles and the Ball started to get used in a myriad of ways beyond there initial purpose.

You can actually extend the default Player objects 8 pixel width using the Player objects corresponding Missile object up to a minimum 9 pixels wide with a basic kernel. Pretty basic but when dealing with so few pixels even a single pixel is a banquet. I mention the minimum of adding a single pixel to the width of both Player objects with there corresponding Missile because the Missile can copy 3 times like the Player objects so you can make three 9 pixel wide Player sprite copies quite easily.

The next best step to extending Player width is to utilize Missile0, Missile1, and the Ball bit all along one scanline which can each be set to different widths greatly expanding what can be done using the Player sprite object. Something to note about this usage is that if you need a lot of projectiles you won't have free bits to use for pixel extensions (Melee VS Shooter).

The 2 Player sprite objects can be copied 3 times per scan line at 3 possible mandatory distances from each other, the minimum gap size is 4 blocks(32 pixels) wide with the Player object included within that gap distance specifically to the left most side of the gap(See my spacing chart below.). All Player copies move in unison by default while true independent movement of entities requires flicker based multiplexing of Player objects or 1 object rendering multiple sprites with multiple screen renders(EG.Pac-Man ghosts.). The next 2 wider gap distances simply double the previous width or 32,64, and 128 (EG.Space Invaders 2600). This mandatory gap distance also applies to both Missiles objects and its 3 copies. The Ball object has no copy ability at all so copy gap distance is not applicable



2 sprites, that's not very many and I need more?  ???

The 2600 is extremely frugal in its construction since it doesn't have a frame buffer or video RAM of any kind meaning it has to refresh the screen pixels constantly without a break. While this puts quite a burden on the CPU as the level of instruction complexity is fairly high to form the graphics on screen it also mean everything is modular and alterable in real time as everything is real time rendered by default.
One interesting property of this is using one Player object sprite across multiple sprites since you can switch the bitmap pattern within set heights of vertical resolution as each objects copying ability and appearance is only influenced or limited by the scanline height zone it occupies. The height is completely negotiable as every sprite object has unlimited height resolution so you can set its vertical zone of influence to where ever you desire.

How far can you push the Player objects?

The most they have ever been pushed practically is 6 sprite blocks of unique appearance through multiplexing or flicker based passes. One of the more popular implementations of this is the Title Screen Kernel which can essentially render a bitmap of 48 pixels of width and any height you desire but only that since the timing and CPU needs are quite high that nothing can render on or beside it. As you can see in this example layering is also offered in this kernel but the increase in colors per scanline is minimal and it increases the flicker frequency. This was an elaboration on the score rendering approach which you see at the bottom with the 6 numerals that became a staple in 2600 games where score was the only stat required you could make the characters more fancy than the Playfield or Missiles would allow for.

Now I didn't put this here to scare you away from multiplexing your sprite objects beyond there default of 3 copies, I only wanted to express the costs involved with the maximum amount. Multiplexing sprites is a common practice in many 2600 games such as Ms Pac-Man & Jr Pac-Man which render there ghosts with minimal flicker unlike the crappy first effort in Pac-Man. So if you're careful and frugal with its use you can do a great many things. ;)


Another common issue faced with only 2 actual sprites is the need for a 3rd or a 4th type per scan line where your only option for an additional independent sprite is to build a sprite manually using the 3 loose bits of 2 Missiles and Ball separately or together.
Based on this canvas you can make each bit object(Missile0/Missile1/Ball) 2, 4, 8, or 16 pixels wide but only one width setting per object per scan line, actually in code its much more efficient to set all 3 bit objects to one default width for every scan line jsyk. Each Missile provides 3 pixels each through copies and the Ball one pixel by default, multiplexing with flicker can extend the amount of Missile copies you can use but its far less reliable in cycle costs and on screen appearance(The flicker burns my eyes!  :blind:)than just sticking to the default. Unfortunately the Ball literally can not multiplex at all which has something to do with the hardware architecture, perhaps its loss on the 5200 and 7800 wasn't such a bad thing. ;D

Its worth noting that the Player objects can be stretched too just like the 3 bit objects but unfortunately doing so cancels out its corresponding Missile and its ability to copy, yikes. To get around that the Ball is employed as the stretched Player objects projectile. Because of the Missile loss and copy cancellation I find this particular option unattractive to say the least but it has its uses within specific contexts(EG. The walker legs in Empire Strikes Back 2600.)

The major limiting factor of loose bit construction is that each bit has to be "tiled" with those damn color clock based gaps between each copy. Since that is so far apart we use the 3 bit objects and there copies at different horizontal alignments to compensate for that. Here I just show the default maximum number of copies but multiplexing with a moderate amount of flicker can extend the number of copies further IE. more than 3 Missile sprites per scanline. Also any bit constructed sprite has the same moving in unison gap distance requirement that the Player sprites do jsyk.

Something else I should warn you about bit constructed sprites is that they lack native hardware flopping, while the Player objects flop horizontally with a simple hardware setting switch the bit constructed sprites require separate Left & Right code kernels adding to the cycle overhead of using them.


Okay lets look at what we can build.


-In practice 1 bit is only capable of producing basic solid shapes through changing the bit width and horizontally offsetting the Bits position per scanline. Try to think of it like an Abacus with set distances between each bead where at its most basic a shape is split into 3 slices of Top, Middle, and Bottom.


-2 bits together is far more versatile when each is set to different widths per scan line. Something of note is that the 3 bit objects can overlap and occlude each other being on separate rendering layers which is handy for creating odd value widths more efficiently using 2 Bit Object widths rather than building a particular width with 3 different bits at 3 different widths butted directly against each other in horizontal alignment.

-3 bits is the easiest to use and has the fewest limitations especially in regards to non solid shapes and patterns. Most of the challenge is utilizing copy ability and trying to form the intended pattern.

-You can make center flopped sprites with the Player objects using both Players but that pretty much defeats the purpose of flopping in the first place. You can flop one Player object to create the other side but the mandatory distance between each copy requires a bit construct to fill the middle in.

-Generally speaking the 2 Missiles are your bread & butter when it comes to bit constructed sprites having a native copy limit of 3 and potential for multiplexing. The Ball is truly singular in use which is why Pitfall has a single swinging vine and Adventure has its single blocky knight. So in practice you could make a cursor, a simple main player sprite(Think Pac-Man), one additional sprite per vertical zone, a weapon for the main player with a distinct color,or to generically fill a portion or along a single edge of a Playfield graphic.

-One trick I forgot about is the use of very quick HMOVE functions applied to the sprite to streak in appearance odd value width sizes(EG. 3&6 wide pixels.) Basically by changing a pixels horizontal position every time the screen is rendered you can produce what appears to be a solid line(Bird in cage flicker.).
Don't get too excited about this function since its costly enough to invoke that its best to isolate its use to a few sparse places IE. using the Ball object to make one small odd value line segment width within a bit constructed sprite.


Sprite sizes?

One thing I learned about bit objects on the 2600 is that it doesn't matter how big you make sprites just as long as you have enough bits to fill the distance.

-Boss Sprites can be rendered using the Playfield itself as the large scale of the pixel doesn't look out of scale. Moving a Playfield sprite on the 2600 is similar to how the Nes did big Boss sprites in that you blank the background color and pan or scroll the image to "move" the giant sprite. While vertical movement of the Boss sprite can be done cheaply horizontal Boss movement requires the use of all 3 loose bit objects to render approximate interim horizontal positions between each Playfield pixel width distance across the screen otherwise it moves jerky.

-Medium scale sprites vary in size potential but one thing is certain which is you're better off using 4 pixel wide line segments or wider to plot its overall design as you don't have enough loose bits to vary the outline shape and fill shapes to the same crispness of a Player object.

-Small scale doesn't need much description as its straight forward pixeling with the Player object.

Probably the easiest way to compose an Atari sprite with multiple layers or bits outside of the actual hardware implementation is to take advantage of whatever paint program you're using and put each distinct sprite object onto image layers which should help greatly to keep things organized and discrete especially in regard to overlapping. Also most have options for tile or stamping grids to set distances which should help with plotting out sprites and there copies.


In my next post I'll likely go into scan line isolation, using objects in different ways, and or multi-color issues. Till next time. :D

Pages: 1 ... 6 7 [8] 9