Basic mouse hover support and sprite auto work more properly

This commit is contained in:
JJ Bliss
2026-04-26 11:15:19 -04:00
parent b18dd94a06
commit fc5f41910e
3 changed files with 134 additions and 87 deletions
+60 -36
View File
@@ -12,28 +12,22 @@ def WIDTH = 640;
def HEIGHT = 480;
export fn main() void = {
sdl3::Init(sdl3::InitFlags::VIDEO)!;
sdl3::Init(sdl3::InitFlags::VIDEO | sdl3::InitFlags::EVENTS)!;
defer sdl3::Quit();
const win = sdl3::CreateWindow(
c::nulstr("Meadow\0"),
WIDTH, HEIGHT, sdl3::WindowFlags::RESIZABLE)!;
WIDTH, HEIGHT, sdl3::WindowFlags::RESIZABLE |
sdl3::WindowFlags::MOUSE_CAPTURE |
sdl3::WindowFlags::INPUT_FOCUS |
sdl3::WindowFlags::MOUSE_FOCUS
)!;
defer sdl3::DestroyWindow(win);
const render = sdl3::CreateRenderer(win, null)!;
defer sdl3::DestroyRenderer(render);
sdl3::SetRenderDrawColor(render, 0, 0, 128, 255)!;
sdl3::SetRenderVSync(render,1)!;
// const img = image::LoadTexture(render, c::nulstr("./assets/mascot.jpg\0"))!;
// defer sdl3::DestroyTexture(img);
// let w = 0.0f32, h = 0.0f32;
// sdl3::GetTextureSize(img, &w, &h)!;
// sdl3::get_error()!;
// const w = w: int, h = h: int;
// let x = 0, y = 0;
// let xd = 1, yd = 1;
const screen_w = WIDTH;
@@ -124,6 +118,7 @@ export fn main() void = {
next_refresh = now + frame_interval;
if(state.screen_vector != 0){
fmt::println("Executing screen vector")!;
uxn::uxn_eval(state.screen_vector, state)!;
};
};
@@ -178,34 +173,62 @@ export fn main() void = {
//Render stuff
for (sdl3::PollEvent(&ev)) {
if (ev.event_type == sdl3::EventType::QUIT) {
run = false;
}else if(ev.event_type == sdl3::EventType::WINDOW_RESIZED){
let dims = uxn::get_window_size(state);
let w = ev.window.data1;
let h = ev.window.data2;
if((dims.width != w: u16) || (dims.height != h: u16)){
// fmt::println("Dimensions not allowed!")!;
//TODO handle this maybe
uxn::set_window_size(w: u16,h: u16,state);
sdl3::DestroyTexture(meadow_texture);
free(pixeldata);
pixeldata = alloc([0...])!; //TODO figure out actual size
let old_w: int = dims.width: int;
let old_h: int = dims.height: int;
// fmt::println("Handling event")!;
switch (ev.event_type) {
case sdl3::EventType::QUIT =>
run = false;
case sdl3::EventType::WINDOW_RESIZED =>
let dims = uxn::get_window_size(state);
let w = ev.window.data1;
let h = ev.window.data2;
if((dims.width != w: u16) || (dims.height != h: u16)){
// fmt::println("Dimensions not allowed!")!;
//TODO handle this maybe
uxn::set_window_size(w: u16,h: u16,state);
sdl3::DestroyTexture(meadow_texture);
free(pixeldata);
pixeldata = alloc([0...])!; //TODO figure out actual size
let old_w: int = dims.width: int;
let old_h: int = dims.height: int;
fmt::printfln("User setting window to width: {} height: {}", w, h)!;
sdl3::SetWindowSize(win,w,h)!;
fmt::printfln("User setting window to width: {} height: {}", w, h)!;
sdl3::SetWindowSize(win,w,h)!;
meadow_texture = sdl3::CreateTexture(render,
sdl3::PixelFormat::XRGB4444,
sdl3::TextureAccess::STATIC,
w,
h)!;
meadow_texture = sdl3::CreateTexture(render,
sdl3::PixelFormat::XRGB4444,
sdl3::TextureAccess::STATIC,
w,
h)!;
state.screen_update = true;
};
state.screen_update = true;
};
case sdl3::EventType::MOUSE_MOTION =>
// fmt::printfln("Mouse Event x: {} y: {}", ev.motion.x, ev.motion.y)!;
uxn::set_mouse_motion(ev.motion.x: u16,ev.motion.y: u16,state);
uxn::uxn_eval(state.mouse_vector,state)!;
case sdl3::EventType::WINDOW_EXPOSED =>
sdl3::RenderClear(render)!;
sdl3::RenderTexture(render, meadow_texture, null, null)!;
sdl3::RenderPresent(render)!;
case sdl3::EventType::WINDOW_SHOWN =>
sdl3::RenderClear(render)!;
sdl3::RenderTexture(render, meadow_texture, null, null)!;
sdl3::RenderPresent(render)!;
case sdl3::EventType::WINDOW_PIXEL_SIZE_CHANGED =>
sdl3::RenderClear(render)!;
sdl3::RenderTexture(render, meadow_texture, null, null)!;
sdl3::RenderPresent(render)!;
case sdl3::EventType::WINDOW_MOUSE_ENTER =>
sdl3::RenderClear(render)!;
sdl3::RenderTexture(render, meadow_texture, null, null)!;
sdl3::HideCursor()!;
case sdl3::EventType::WINDOW_MOUSE_LEAVE =>
sdl3::RenderClear(render)!;
sdl3::RenderTexture(render, meadow_texture, null, null)!;
sdl3::ShowCursor()!;
case =>
fmt::printfln("Unhandled SDL event: 0x{:x} , {}", ev.event_type, ev.event_type )!;
};
};
@@ -220,3 +243,4 @@ export fn main() void = {
sdl3::get_error()!;
};
};