News:

Printed Amstrad Addict magazine announced, check it out here!

Main Menu

Flicker with CPCTelera - how to avoid?

Started by Typhon, 22:12, 23 November 23

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Typhon

So me again, with another question.

I'm working on a remake of the old arcade game Nibbler for my first CPCTelera project. All well and good so far, and I'm using the CPC port from 1984 by Mosaik Software as a basis:



I'm using Rasters, all is fine, however, I notice the demo mode, where the snake moves around the screen by itself is, unlike the BASIC version (!), very flickery.

A video of this can be seen here.

Here is the main loop I run:

                            cpct_setBlendMode(CPCT_BLEND_XOR);
             _demo_draw_snake(&demo_snake);
             while (!kp) {
                ++count;
               
                // Alternate the Demo Text
                if (count == 15001)
                        _demo_draw_text(2);
                else if (count == 30001)
                        _demo_draw_text(1);
                // Animate the Snake
                if (count % 200 == 0) {
                        // Copy the old snake
                        util_copy_snake(&demo_snake, &demo_snake_buf);
                        // Update the snake
                        g_do_snake_move(demo_pf, &demo_snake, 26);
                        // Check for a keypress
                        cpct_scanKeyboard();
                        kp = cpct_isAnyKeyPressed();
                        cpct_waitVSYNC();
                        _demo_draw_snake(&demo_snake_buf);
                        _demo_draw_snake(&demo_snake);

                }

                if (count > 30002)
                        count = 0;             
}
   

And this is my draw code for the snake itself:

void _demo_draw_snake(snake_t *snake) {
        u8 *p_head_pos, *p_body_pos;
        u8 cx, cy, pf_x = 0, pf_y = 17;
        // Draw the Body
        for (u8 seg_idx = 1; seg_idx < snake->length; seg_idx++) {
               
                cx = (snake->body[seg_idx].x + pf_x) * VIDEO_CHAR_M1_BYTES_W;
                cy = (snake->body[seg_idx].y + pf_y) * VIDEO_CHAR_M1_BYTES_H;
                p_body_pos = v_screen_p(cx, cy);
                cpct_drawSpriteBlended(p_body_pos, VIDEO_CHAR_M1_BYTES_H,
                        VIDEO_CHAR_M1_BYTES_W, sprite_tileset[4]);
        }
        // And draw the Head
        cx = (snake->body[0].x + pf_x) * VIDEO_CHAR_M1_BYTES_W;
        cy = (snake->body[0].y + pf_y) * VIDEO_CHAR_M1_BYTES_H;
        p_head_pos = v_screen_p(cx, cy);
        cpct_drawSpriteBlended(p_head_pos, VIDEO_CHAR_M1_BYTES_H,
                VIDEO_CHAR_M1_BYTES_W, sprite_tileset[snake->direction]);
}


I have noticed that anything other than a couple of draws of sprites will flicker. Do I need to change my timings, or do I need to optimise my drawing code?

I have noted that this flicker occurs regardless of using raster interrupts or not.

Code will be available on github at some point soon as soon as I have something vaguely playable btw.

Best,
T.

Typhon

OK, so first response from the Discord confirms I'm a muppet. I was redrawing the whole snake everytime.

Which I don't need to do. I simply need to draw the new head and erase the old tail, when it moves. Or just draw the new head, and the first segment of the body, when it grows. 

Argh. That hopefully should help.

ervin

Yes that should certainly help.
It should make it a bit faster as well.

Typhon


Powered by SMFPacks Menu Editor Mod