基於EasyX和Raylib的鼠標操作

EasyX 提供的鼠標操作需要結合 Windows API 使用, 比較簡陋。官方示例用法是在 // https://codebus.cn/yangw/mouse-operation。
Raylib 可以提供強大的多的鼠標操作。不過爲了程序遷移的無痛感, 這裏用 Raylib 重新實現了 "鼠標操作“ 這個例子程序。主要不同點是, Raylib 直接在背景上繪製會出現頻繁的閃爍, 需要改爲創建 texture 作爲 canvas(鑲嵌在窗口上), 然後每一幀在 canvas 上繪製。

基於 EasyX

// 程序名稱:鼠標操作演示
// 編譯環境:Visual C++ 6.0~2022,EasyX_20220901
// https://easyx.cn
//
#include <graphics.h>

int main()
{
    // 初始化圖形窗口
    initgraph(640, 480);

    ExMessage m;		// 定義消息變量

    while(true)
    {
        // 獲取一條鼠標或按鍵消息
        m = getmessage(EX_MOUSE | EX_KEY);

        switch(m.message)
        {
            case WM_MOUSEMOVE:
                // 鼠標移動的時候畫紅色的小點
                putpixel(m.x, m.y, RED);
                break;

            case WM_LBUTTONDOWN:
                // 如果點左鍵的同時按下了 Ctrl 鍵
                if (m.ctrl)
                    // 畫一個大方塊
                    rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
                else
                    // 畫一個小方塊
                    rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);
                break;

            case WM_KEYDOWN:
                if (m.vkcode == VK_ESCAPE)
                    return 0;	// 按 ESC 鍵退出程序
        }
    }

    // 關閉圖形窗口
    closegraph();
    return 0;
}

基於 Raylib

// https://codebus.cn/yangw/mouse-operation
#include "raylib.h"
#include "raylib_helper.hpp"
#include <stdio.h>

#define WIDTH 640
#define HEIGHT 480

class Action
{
public:
    Vector2 d; // mouse delta
    Vector2 m; // mouse position
    bool is_control_pressed;
    bool is_mouse_left_button_pressed;

    void init()
    {
        d = GetMouseDelta();
        m = GetMousePosition();
        is_mouse_left_button_pressed = IsMouseButtonPressed(MOUSE_BUTTON_LEFT);
        is_control_pressed = IsKeyDown(KEY_LEFT_CONTROL);
    }

    void draw(RenderTexture2D target)
    {
        BeginTextureMode(target);
        if (d.x != 0 || d.y != 0)
        {
            DrawPixel(m.x, m.y, RED);
        }
        else if (is_mouse_left_button_pressed)
        {
            if (is_control_pressed) // big rect
            {
                DrawRectangleLines(m.x - 10, m.y - 10, 20, 20, WHITE);
            }
            else // small rect
            {
                DrawRectangleLines(m.x - 5, m.y - 5, 10, 10, WHITE);
            }
        }
        EndTextureMode();
    }
};

int main()
{
    InitWindow(WIDTH, HEIGHT, "Mouse Operation");

    // Create a RenderTexture2D to use as a canvas
    RenderTexture2D target = LoadRenderTexture(WIDTH, HEIGHT);

    // Clear render texture before entering the game loop
    BeginTextureMode(target);
    ClearBackground(BLACK);
    EndTextureMode();

    SetTargetFPS(120);

    int cnt = 0;
    while (!WindowShouldClose())
    {
        cnt++;
        Action act;
        act.init();

        BeginDrawing();
        {
            ClearBackground(BLACK);

            DrawTextureRec(target.texture, make_rectangle(0, 0, (float)target.texture.width, (float)-target.texture.height), 
                make_vector(0, 0), 
                WHITE
            );

            act.draw(target);
        }
        EndDrawing();
    }

    UnloadRenderTexture(target);    // Unload render texture
    CloseWindow();

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章