Jump to content
IGNORED

How did Circus Convoy create 3 color sprites on same scanline?


lucienEn

Recommended Posts

Hi, I noticed Circus Convoy has a few sprites that have 2 colors on same scanline together with the player sprite on the same scanline with a 3rd color. How is that achieved? Can't be playfield since the resolution is higher. Maybe it's by alternating 2 sprites but I don't see flickering.

 

For example the giraffe has 2 colors with the player on the same scanlines.

Also the first screen shows a chameleon that appears to be 28 pixel wide but with full resolution yet player sprites are only 8 wide with that resolution.

 

See circus_convoy.png

 

Features01.jpg

  • Like 2
Link to comment
Share on other sites

On the Atari 2600, the Player/Missile graphics can be switched into duplicate / triplicate mode.  Sprite layout can be planned out to take advantage of that fact.

 

On the Chameleon screen:

   The Chameleon is probably using the two available Player sprites set to duplicate mode and interwoven with each other.  Also, there's a couple of coloring tricks going on.

   The wheels on the trailer... two sprites in duplicate mode.

   Those tumble weeds at the bottom are using triplicate sprite mode.

 

Basically, Circus Convoy is loaded with graphics tricks.  They probably used every trick in the metaphorical book.

  • Like 3
Link to comment
Share on other sites

You still would have only 2 colors since missile/ball/player all share same color. Switching color during scanline seems also not possible since there is not enough time over few pixels.

Perhaps the Playfield can be 3rd color but that's min. 4 pixel wide. Unless it's indeed cleverly under the sprite but the giraffe is at 1 line only 3 pixel wide yet with 2 colors.

 

Also note the Chameleon is assymetrical so replicating would also require changing the player bits and not enough cycles to do that it seems.

 

Let me play with the Stella debugger and override colors feature to see what is what.

Edited by lucienEn
Link to comment
Share on other sites

4 minutes ago, lucienEn said:

missile/ball/player all share same color.

The ball shares color with playfield, not with missiles and players. Also note that the players can also be set to 2x or 4x size and the missiles/ball also to 8x size. Plus each object can be repositioned on subsequent scanlines, and they can be interleaved. Number of copies and size can be changed on each scanlines too. Objects with lower priority will only be seen through the "holes" of the ones that are on top of them, creating what seems a high res multicolor sprite.

8 minutes ago, lucienEn said:

Let me play with the Stella debugger and override colors feature to see what is what.

If you have the rom, then just enable the "fixed debug colors" (ALT+"."), and/or turn each object on or off with ALT+ one of the letters from "Z" to "N" on the keyboard.

  • Like 3
Link to comment
Share on other sites

11 minutes ago, lucienEn said:

Switching color during scanline seems also not possible since there is not enough time over few pixels.

Switching colors during a scanline is indeed possible.  Just requires careful planning... The first screen of Sega's Congo Bongo does it.

 

16 minutes ago, lucienEn said:

Also note the Chameleon is assymetrical so replicating would also require changing the player bits and not enough cycles to do that it seems.

Here again, it is indeed possible.... Think about the 6-digit scores many games have:  Two sprites, triplicated, with 6 graphics changes per line.

  • Like 2
Link to comment
Share on other sites

19 minutes ago, splendidnut said:

Switching colors during a scanline is indeed possible.  Just requires careful planning... The first screen of Sega's Congo Bongo does it.

 

Here again, it is indeed possible.... Think about the 6-digit scores many games have:  Two sprites, triplicated, with 6 graphics changes per line.

Is that part of the reason why (other than obviously asthetics) typically no other changes are made on the scanlines with scores such as playfield, ball, and missle changes that would also suck up CPU cycles?  Basically all you're doing those lines is the score?

Link to comment
Share on other sites

15 minutes ago, lucienEn said:

The chameleon is still not very clear to me since it only shows 2 sprites and they don't look replicated:

They're not duplicated, but resized and repositioned on each scanline.

Single step through the code in the debugger while looking at the TIA tab to see exactly how.

 

  • Like 2
Link to comment
Share on other sites

52 minutes ago, lucienEn said:

The chameleon is still not very clear to me since it only shows 2 sprites and they don't look replicated:

 

Looks like the same thing I did with the Scarlet the Dragon in Medieval Mayhem:

  • each player set for 2x size
  • each player is a different color
  • each player shifted left/right over successive scanlines.

They did add changing the colors of the players over successive scanlines. 

 

 

1136810511_MedievalMayhem(NTSC)_dbg_c3f8a262.thumb.png.5ede922aed4cc85a4870950ab44303d2.png

 

1945004025_MedievalMayhem(NTSC)_dbg_c3f8c962.thumb.png.e7054af8ec16462e6db09069c36f177a.png

  • Like 2
Link to comment
Share on other sites

3 hours ago, lucienEn said:

I took some screenshots from debug colors. The giraffe I think is clear now since it's indeed ball color with just 1 sprite (no small feat still).

The chameleon is still not very clear to me since it only shows 2 sprites and they don't look replicated:

 

 

comp.jpg

Thanks!  A while back I asked for examples of using the ball or missile to add color and I don't believe this homebrew was mentioned as an example.

Link to comment
Share on other sites

2 hours ago, SpiceWare said:

 

Looks like the same thing I did with the Scarlet the Dragon in Medieval Mayhem:

  • each player set for 2x size
  • each player is a different color
  • each player shifted left/right over successive scanlines.

They did add changing the colors of the players over successive scanlines. 

 

 

1136810511_MedievalMayhem(NTSC)_dbg_c3f8a262.thumb.png.5ede922aed4cc85a4870950ab44303d2.png

 

1945004025_MedievalMayhem(NTSC)_dbg_c3f8c962.thumb.png.e7054af8ec16462e6db09069c36f177a.png

Do you change the player sprite further at any point above double width to accomplish the "length" of the dragon or was double enough to accomplish this?  It's very nice sprite work regardless!

Edited by LatchKeyKid
Link to comment
Share on other sites

48 minutes ago, LatchKeyKid said:

Do you change the player sprite further at any point above double width to accomplish the "length" of the dragon or was double enough to accomplish this?

 

Just 2x with line-by-line shifting. Manipulating the player's size and/or shifting the position line-by-line has been used to great effect for a long time, such as in Boxing and Dolphin:

 

229844456_Boxing(1980)(Activision).png.8

 

921793827_Dolphin(1983)(Activision).png.

 

I also use it for the largest asteroids in Space Rocks, and the space stations in Draconian

 

 

 

image.thumb.png.b8cc40905ff406cf50adbc35e4677570.png

 

image.thumb.png.2925121a36a8dcaf05c74d46cdc65257.png

 

  • Like 4
Link to comment
Share on other sites

8 hours ago, SpiceWare said:

 

Looks like the same thing I did with the Scarlet the Dragon in Medieval Mayhem:

  • each player set for 2x size
  • each player is a different color
  • each player shifted left/right over successive scanlines.

They did add changing the colors of the players over successive scanlines. 

Thanks! Getting close as I didn't think about shifting the next scanline so you still have illusion of 1 pixel resolution. However here player 1 is 28 pixel wide (yellow, see below). Double size would be only 16 pixels. However debugging this more it's actually changing the player sizes on each scanline. Pretty cool trick and still lot of work to convert into code (is there a tool for that?). I also noticed when the player is moving out of the center to the sides, the colors are removed for some reason (see 2nd image), not sure yet why:

 

Scanline: 130

- P0 NuSiz = 0: 1 copy

- P1 NuSiz = 5: 2x (16) sized player

 

Scanline: 137

- P0 NuSiz = 0: 1 copy

- P1 NuSiz = 7: 4x (32) sized player

 

Scanline: 147

- P0 NuSiz = 7: 4x (32) sized player

- P1 NuSiz = 7: 4x (32) sized player

 

Scanline: 148

- P0 NuSiz = 5: 2x (16) sized player

- P1 NuSiz = 7: 4x (32) sized player

chameleon.jpg

adgm.jpg

Edited by lucienEn
  • Like 2
Link to comment
Share on other sites

8 hours ago, alex_79 said:

They're not duplicated, but resized and repositioned on each scanline.

Single step through the code in the debugger while looking at the TIA tab to see exactly how.

 

Yes that's it:-). Looking at all complexity of this, would be great if someone could come up with editor that could convert this into code but not trivial with the limitations.

Link to comment
Share on other sites

5 hours ago, lucienEn said:

is there a tool for that?

 

I have a few web based graphic tool converters on my Atari VCS/2600 page.  The Two Color Sprite Converter is what I used to convert the dragon graphics.

 

On the first screen copy/paste one of the test URLS into the first field then click Load Image:

image.thumb.png.24232a9e70b9072c0b7d9993f07450e8.png

On the second screen specify which color is used for which player.  If text is hard to read click Change Colors to step thru a number of screen & text colors.  Click Show Results.

 

image.thumb.png.8554c591ad87ad78d9d50d1f076d1949.png

 

 

Result screen:

 

image.thumb.png.f0976eed6b23c43bc3f10201139eb581.png

 

 

Scroll to bottom to see results. Browser specs have changed a bit, so they all ended up on a single, and very long, line of text

 

image.thumb.png.50a82684c57635e2bbd2256d79331c0f.png

 

Use your browsers "view page source" feature to see it as intended:

 

 

image.thumb.png.b7dec50fa2d6a938e9fa4c97aed8e407.png

 

ImageA6
        .byte zz________ ;  0
        .byte zz________ ;  1
        .byte zz________ ;  2
        .byte zz________ ;  3
        .byte zz________ ;  4
        .byte zz________ ;  5
        .byte zz________ ;  6
        .byte zz________ ;  7
        .byte zz________ ;  8
        .byte zz________ ;  9
        .byte zz________ ; 10
        .byte zz________ ; 11
        .byte zz________ ; 12
        .byte zz________ ; 13
        .byte zz________ ; 14
        .byte zz___XXX_X ; 15
        .byte zz_X_XX___ ; 16
        .byte zzXXXX____ ; 17
        .byte zzX_______ ; 18
        .byte zzXX______ ; 19
        .byte zzXXXX____ ; 20
        .byte zzXX______ ; 21
        .byte zzXX______ ; 22
        .byte zzX_______ ; 23
        .byte zzXX______ ; 24
        .byte zzXX______ ; 25
        .byte zzXXX_____ ; 26
        .byte zzXXXXX___ ; 27
        .byte zzXXXXXX_X ; 28
        .byte zzXXX__XX_ ; 29
        .byte zzXXXX___X ; 30
        .byte zzXXX_____ ; 31
        .byte zzXX_X____ ; 32
        .byte zzXX_XX___ ; 33
        .byte zz_XX_X_X_ ; 34
        .byte zzXX__XX__ ; 35
        .byte zzX_X_X___ ; 36
        .byte zzX__XXX__ ; 37
        .byte zzXX_XX___ ; 38
        .byte zzXXX_____ ; 39
        .byte zz________ ; 40
        .byte zz________ ; 41
        .byte zz________ ; 42
        .byte zz________ ; 43

ImageB6
        .byte zz________ ;  0
        .byte zz________ ;  1
        .byte zz________ ;  2
        .byte zz________ ;  3
        .byte zz________ ;  4
        .byte zz________ ;  5
        .byte zz________ ;  6
        .byte zz________ ;  7
        .byte zz________ ;  8
        .byte zz________ ;  9
        .byte zz________ ; 10
        .byte zz________ ; 11
        .byte zz________ ; 12
        .byte zz________ ; 13
        .byte zz______XX ; 14
        .byte zz_XX_XX__ ; 15
        .byte zzXX_XX___ ; 16
        .byte zzX_X_____ ; 17
        .byte zzXX_XX___ ; 18
        .byte zzXXX_X___ ; 19
        .byte zzXXX_____ ; 20
        .byte zzXX______ ; 21
        .byte zzXXX_____ ; 22
        .byte zzX__X____ ; 23
        .byte zzXX______ ; 24
        .byte zzX__X____ ; 25
        .byte zzX_______ ; 26
        .byte zzX_______ ; 27
        .byte zz________ ; 28
        .byte zzXX______ ; 29
        .byte zzXXX_____ ; 30
        .byte zzXXX_____ ; 31
        .byte zzX__X____ ; 32
        .byte zz________ ; 33
        .byte zzX_______ ; 34
        .byte zz________ ; 35
        .byte zzX_______ ; 36
        .byte zz________ ; 37
        .byte zzX_______ ; 38
        .byte zz________ ; 39
        .byte zz________ ; 40
        .byte zz________ ; 41
        .byte zz________ ; 42
        .byte zz________ ; 43

Shift6LtoR
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  0 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  1 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  2 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  3 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  4 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  5 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  6 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  7 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  8 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  9 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 10 x0= 0 x1= 0
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 11 x0= 0 x1= 0
        .byte HMOVE_R3 | HMOVE_0  >> 4 ; 12 x0= 3 x1= 0
        .byte HMOVE_R7 | HMOVE_0  >> 4 ; 13 x0=10 x1= 0
        .byte HMOVE_R7 | HMOVE_R6 >> 4 ; 14 x0=17 x1= 6
        .byte HMOVE_R7 | HMOVE_R6 >> 4 ; 15 x0=24 x1=12
        .byte HMOVE_R6 | HMOVE_R4 >> 4 ; 16 x0=30 x1=16
        .byte HMOVE_L2 | HMOVE_R3 >> 4 ; 17 x0=28 x1=19
        .byte HMOVE_R4 | HMOVE_L5 >> 4 ; 18 x0=32 x1=14
        .byte HMOVE_0  | HMOVE_R4 >> 4 ; 19 x0=32 x1=18
        .byte HMOVE_L2 | HMOVE_R2 >> 4 ; 20 x0=30 x1=20
        .byte HMOVE_0  | HMOVE_R3 >> 4 ; 21 x0=30 x1=23
        .byte HMOVE_L2 | HMOVE_L1 >> 4 ; 22 x0=28 x1=22
        .byte HMOVE_R1 | HMOVE_R2 >> 4 ; 23 x0=29 x1=24
        .byte HMOVE_L3 | HMOVE_L2 >> 4 ; 24 x0=26 x1=22
        .byte HMOVE_L2 | HMOVE_0  >> 4 ; 25 x0=24 x1=22
        .byte HMOVE_L2 | HMOVE_L2 >> 4 ; 26 x0=22 x1=20
        .byte HMOVE_L6 | HMOVE_R6 >> 4 ; 27 x0=16 x1=26
        .byte HMOVE_L2 | HMOVE_0  >> 4 ; 28 x0=14 x1=26
        .byte HMOVE_L1 | HMOVE_L7 >> 4 ; 29 x0=13 x1=19
        .byte HMOVE_L1 | HMOVE_0  >> 4 ; 30 x0=12 x1=19
        .byte HMOVE_0  | HMOVE_L1 >> 4 ; 31 x0=12 x1=18
        .byte HMOVE_L1 | HMOVE_L4 >> 4 ; 32 x0=11 x1=14
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 33 x0=11 x1=14
        .byte HMOVE_L3 | HMOVE_L1 >> 4 ; 34 x0= 8 x1=13
        .byte HMOVE_L6 | HMOVE_0  >> 4 ; 35 x0= 2 x1=13
        .byte HMOVE_L1 | HMOVE_L2 >> 4 ; 36 x0= 1 x1=11
        .byte HMOVE_L1 | HMOVE_0  >> 4 ; 37 x0= 0 x1=11
        .byte HMOVE_0  | HMOVE_L2 >> 4 ; 38 x0= 0 x1= 9
        .byte HMOVE_R2 | HMOVE_0  >> 4 ; 39 x0= 2 x1= 9
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 40 x0= 2 x1= 9
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 41 x0= 2 x1= 9
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 42 x0= 2 x1= 9
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 43 x0= 2 x1= 9

Shift6RtoL
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  0
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  1
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  2
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  3
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  4
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  5
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  6
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  7
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  8
        .byte HMOVE_0  | HMOVE_0  >> 4 ;  9
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 10
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 11
        .byte HMOVE_L3 | HMOVE_0  >> 4 ; 12
        .byte HMOVE_L7 | HMOVE_0  >> 4 ; 13
        .byte HMOVE_L7 | HMOVE_L6 >> 4 ; 14
        .byte HMOVE_L7 | HMOVE_L6 >> 4 ; 15
        .byte HMOVE_L6 | HMOVE_L4 >> 4 ; 16
        .byte HMOVE_R2 | HMOVE_L3 >> 4 ; 17
        .byte HMOVE_L4 | HMOVE_R5 >> 4 ; 18
        .byte HMOVE_0  | HMOVE_L4 >> 4 ; 19
        .byte HMOVE_R2 | HMOVE_L2 >> 4 ; 20
        .byte HMOVE_0  | HMOVE_L3 >> 4 ; 21
        .byte HMOVE_R2 | HMOVE_R1 >> 4 ; 22
        .byte HMOVE_L1 | HMOVE_L2 >> 4 ; 23
        .byte HMOVE_R3 | HMOVE_R2 >> 4 ; 24
        .byte HMOVE_R2 | HMOVE_0  >> 4 ; 25
        .byte HMOVE_R2 | HMOVE_R2 >> 4 ; 26
        .byte HMOVE_R6 | HMOVE_L6 >> 4 ; 27
        .byte HMOVE_R2 | HMOVE_0  >> 4 ; 28
        .byte HMOVE_R1 | HMOVE_R7 >> 4 ; 29
        .byte HMOVE_R1 | HMOVE_0  >> 4 ; 30
        .byte HMOVE_0  | HMOVE_R1 >> 4 ; 31
        .byte HMOVE_R1 | HMOVE_R4 >> 4 ; 32
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 33
        .byte HMOVE_R3 | HMOVE_R1 >> 4 ; 34
        .byte HMOVE_R6 | HMOVE_0  >> 4 ; 35
        .byte HMOVE_R1 | HMOVE_R2 >> 4 ; 36
        .byte HMOVE_R1 | HMOVE_0  >> 4 ; 37
        .byte HMOVE_0  | HMOVE_R2 >> 4 ; 38
        .byte HMOVE_L2 | HMOVE_0  >> 4 ; 39
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 40
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 41
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 42
        .byte HMOVE_0  | HMOVE_0  >> 4 ; 43
;End 6

 

  • Like 5
  • Thanks 1
Link to comment
Share on other sites

  • 1 month later...
  • 4 months later...

Hi @lucienEn. Thank you for sharing the screen shots from debug mode. You said that the giraffe was made by using the sprite 1 and the ball (yellow and blue pixels respectively, I presume). Do you happen to know how they did manage to get the spacing for the ball so small? Please refer to my screenshot below for reference:

 

image.png.c742e89816edf63d41be24e4ac25303b.png

I have tried myself to do something similar but the gap is massive (9 color clocks as expected from doing 2 consecutive sta RESBL).

 

Are they using a 2x/4x ball and the sprite on top has "holes" that let the ball visible through? Like the following:

image.png.8423a9d6fe0bea11b128e34792804377.png

image.png.7729626c91190a06753c151a4605e276.png

image.png.bda7082cba1e751c31d0bcf059f3b364.png

 

  • Like 2
Link to comment
Share on other sites

  • 3 weeks later...

Yes they used overlap I believe but in Stella debugger fill to that scanline and observe the patterns.

Using my screen editor (which should also generate the ASM code for this), I can draw this pattern with ball size 4 and then leave holes in sprite 2:

 

image.png.86532b491570eef3a26d4a916a3f4fad.png

Edited by lucienEn
  • Like 2
Link to comment
Share on other sites

On 5/3/2023 at 8:16 AM, lentil_soup said:

Hi @lucienEn. Thank you for sharing the screen shots from debug mode. You said that the giraffe was made by using the sprite 1 and the ball (yellow and blue pixels respectively, I presume). Do you happen to know how they did manage to get the spacing for the ball so small? Please refer to my screenshot below for reference:

 

image.png.c742e89816edf63d41be24e4ac25303b.png

I have tried myself to do something similar but the gap is massive (9 color clocks as expected from doing 2 consecutive sta RESBL).

 

Are they using a 2x/4x ball and the sprite on top has "holes" that let the ball visible through? Like the following:

image.png.8423a9d6fe0bea11b128e34792804377.png

image.png.7729626c91190a06753c151a4605e276.png

image.png.bda7082cba1e751c31d0bcf059f3b364.png

 

Sprite priority would be the obvious choice as you said.  If the player sprite has priority over the ball and the two are overlaid then the ball only shows up in the empty pixels of the player sprite.  It's how I hope to make my games a bit more colorful assuming I ever get past the planning stage on one of them (see my avatar here for an example).  The big catch is that you can only make the ball 1, 2, 4, or 8 wide so you can only space the empty spots within those paramaters if you don't want the ball to spill over.

Edited by LatchKeyKid
Link to comment
Share on other sites

On 11/29/2022 at 1:46 PM, SpiceWare said:

 

Just 2x with line-by-line shifting. Manipulating the player's size and/or shifting the position line-by-line has been used to great effect for a long time, such as in Boxing and Dolphin:

 

229844456_Boxing(1980)(Activision).png.8

 

921793827_Dolphin(1983)(Activision).png.

 

I also use it for the largest asteroids in Space Rocks, and the space stations in Draconian

 

 

 

image.thumb.png.b8cc40905ff406cf50adbc35e4677570.png

 

image.thumb.png.2925121a36a8dcaf05c74d46cdc65257.png

 

Thanks for the examples!  I relatively recently discovered that Kung Fu also uses that technique for the leg during the kick animations and was curious about what other games did so as well during the original run of the console.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...