// port of raylib example https://github.com/raysan5/raylib/blob/master/examples/core/core_2d_camera_mouse_zoom.c const rl = @import("raylib"); pub fn main() anyerror!void { // Initialization //-------------------------------------------------------------------------------------- const screenWidth = 800; const screenHeight = 450; rl.initWindow(screenWidth, screenHeight, "raylib-zig [core] example - 2d camera mouse zoom"); defer rl.closeWindow(); // Close window and OpenGL context var camera = rl.Camera2D{ .target = .{ .x = 0, .y = 0 }, .offset = .{ .x = 0, .y = 0 }, .zoom = 1.0, .rotation = 0, }; var zoomMode: i32 = 0; // 0-Mouse Wheel, 1-Mouse Move rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop while (!rl.windowShouldClose()) { // Detect window close button or ESC key // Update //---------------------------------------------------------------------------------- if (rl.isKeyPressed(.key_one)) { zoomMode = 0; } else if (rl.isKeyPressed(.key_two)) { zoomMode = 1; } // Translate based on mouse right click if (rl.isMouseButtonDown(.mouse_button_right)) { var delta = rl.getMouseDelta(); delta = rl.math.vector2Scale(delta, -1.0 / camera.zoom); camera.target = rl.math.vector2Add(camera.target, delta); } if (zoomMode == 0) { // Zoom based on mouse wheel const wheel = rl.getMouseWheelMove(); if (wheel != 0) { // Get the world point that is under the mouse const mouseWorldPos = rl.getScreenToWorld2D(rl.getMousePosition(), camera); // Set the offset to where the mouse is camera.offset = rl.getMousePosition(); // Set the target to match, so that the camera maps the world space point // under the cursor to the screen space point under the cursor at any zoom camera.target = mouseWorldPos; // Zoom increment var scaleFactor = 1.0 + (0.25 * @abs(wheel)); if (wheel < 0) { scaleFactor = 1.0 / scaleFactor; } camera.zoom = rl.math.clamp(camera.zoom * scaleFactor, 0.125, 64.0); } } else { // Zoom based on left click if (rl.isMouseButtonPressed(.mouse_button_left)) { // Get the world point that is under the mouse const mouseWorldPos = rl.getScreenToWorld2D(rl.getMousePosition(), camera); // Set the offset to where the mouse is camera.offset = rl.getMousePosition(); // Set the target to match, so that the camera maps the world space point // under the cursor to the screen space point under the cursor at any zoom camera.target = mouseWorldPos; } if (rl.isMouseButtonDown(.mouse_button_left)) { // Zoom increment const deltaX = rl.getMouseDelta().x; var scaleFactor = 1.0 + (0.01 * @abs(deltaX)); if (deltaX < 0) { scaleFactor = 1.0 / scaleFactor; } camera.zoom = rl.math.clamp(camera.zoom * scaleFactor, 0.125, 64.0); } } //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- rl.beginDrawing(); defer rl.endDrawing(); rl.clearBackground(rl.Color.ray_white); { camera.begin(); defer camera.end(); rl.gl.rlPushMatrix(); rl.gl.rlTranslatef(0, 25 * 50, 0); rl.gl.rlRotatef(90, 1, 0, 0); rl.drawGrid(100, 50); rl.gl.rlPopMatrix(); rl.drawCircle(screenWidth / 2, screenHeight / 2, 50, rl.Color.maroon); } rl.drawText("[1][2] Select mouse zoom mode (Wheel or Move)", 20, 20, 20, rl.Color.dark_gray); if (zoomMode == 0) { rl.drawText("Mouse right button drag to move, mouse wheel to zoom", 20, 50, 20, rl.Color.dark_gray); } else { rl.drawText("Mouse right button drag to move, mouse press and move to zoom", 20, 50, 20, rl.Color.dark_gray); } //---------------------------------------------------------------------------------- } }