ewpratten / raylib-ffi

"No frills" Rust bindings to raylib
https://crates.io/crates/raylib-ffi
GNU General Public License v3.0
31 stars 4 forks source link

Sprites flickering on the screen, when ClearBackground() IS used #11

Open GabrieleC07 opened 2 weeks ago

GabrieleC07 commented 2 weeks ago

I encountered an issue where if you use ClearBackground() and try to draw a sprite some sprites, they will flicker on the screen. This is the code

unsafe {
        raylib_ffi::InitWindow(width_height.0,
            width_height.1,
            rl_str!(title)
        );
        while !raylib_ffi::WindowShouldClose() {
            raylib_ffi::draw!({
                raylib_ffi::ClearBackground(raylib_ffi::colors::GREEN);
                context.food.clone().draw();
                context.snake.clone().draw();
            });
        };
        raylib_ffi::CloseWindow();
}

Where food.draw() is this

unsafe {
             raylib_ffi::draw!(
                raylib_ffi::DrawRectangle(
                    self.pos.0 as i32,
                    self.pos.1 as i32,
                    GRID_CELL_SIZE.0 as i32,
                    GRID_CELL_SIZE.1 as i32,
                    raylib_ffi::colors::BLUE)
            );
}

and snake.draw() is this

unsafe {
            raylib_ffi::draw!(
                raylib_ffi::DrawRectangle(
                    self.body[0].pos.0,
                    self.body[0].pos.1,
                    GRID_CELL_SIZE.0 as i32,
                    GRID_CELL_SIZE.1 as i32,
                    raylib_ffi::colors::DARKGREEN)
            );
}

While looking at similiar issues it seems this happens if we DONT use ClearBackground so I just cant understand why

if I comment the ClearBackground everything works.

DISCLAIMER: I am a complete newbie on Raylib, this could very well not be the wrapper's fault, but having found the exact opposite results in the C Raylib version it seems weird

ewpratten commented 2 weeks ago

Probably not the wrappers fault. I think you are seeing flickering because you haven't set a target framerate (or enabled V-sync)

Try calling SetTargetFPS(60); after the window has been initialized

GabrieleC07 commented 2 weeks ago

Tried setting it in

unsafe {
 raylib_ffi::InitWindow(width_height.0, width_height.1, rl_str!(title) ); 
SetTargetFps(60);
while !raylib_ffi::WindowShouldClose() { 
     raylib_ffi::draw!({   raylib_ffi::ClearBackground(raylib_ffi::colors::GREEN); 
context.food.clone().draw(); context.snake.clone().draw(); 
}); 
}; 
raylib_ffi::CloseWindow(); 
}

But it still flickers

(This isnt the actual code and might be formatted differently)