亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在具有雙重上下文的畫布上獲取真實的鼠標位置

在具有雙重上下文的畫布上獲取真實的鼠標位置

一只名叫tom的貓 2022-07-08 17:40:14
我被要求在使用畫布的 html5 制作的游戲中獲取鼠標坐標。作為第一個測試,嘗試使用以下函數讀取鼠標位置。但是這個函數只在考慮畫布尺寸的情況下讀取鼠標位置。發生的情況是游戲的舞臺比畫布更大,并且此功能無法顯示角色在舞臺上的真實位置。我正在搜索并注意到畫布“后面”存在于已建立像素尺寸的地圖(.png)上。畫布像相機一樣工作,可以看到地圖的一部分。是否可以調整我的函數來讀取地圖的尺寸,然后定位玩家的實際坐標?        var canvas = document.querySelector('canvas');        var ctx = canvas.getContext("2d");        canvas.addEventListener("click", function(e) {             var cRect = canvas.getBoundingClientRect();            var scaleX = canvas.width / cRect.width;            var scaleY = canvas.height / cRect.height;            var canvasX = Math.round((e.clientX - cRect.left) * scaleX);            var canvasY = Math.round((e.clientY - cRect.top) * scaleY);            console.log("X: "+canvasX+", Y: "+canvasY);        });  這個函數只會根據畫布的大小給我鼠標的位置,但地圖更大,我在這里留下一個解釋性的圖像。
查看完整描述

1 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

世界 <=> 視圖

為了建立白話,使用的術語是

  • World:世界/運動場/(紅框)的坐標系(以像素為單位)。

  • View:畫布/相機/(藍框)的坐標系(以畫布像素為單位)。

正如評論中指出的那樣。您需要視圖原點。那是世界空間中畫布左上角的坐標。

您還需要知道視圖比例。那是畫布與世界的關系。

需要的信息

const world = {width: 2048, height: 1024}; // Red box in pixels

const view = {  // blue box

    origin: {x: 500, y: 20},      // in world scale (pixels on world)

    scale: {width: 1, height: 1}, // scale of pixels (from view to world)

}

如果沒有此信息,您將無法進行轉換。它必須存在,因為它需要將世界內容呈現到畫布。


請注意,如果比例是,1它們可能只能在畫布渲染系統中推斷出來。如果找不到秤,請使用1.


注意此答案假定視圖沒有旋轉。


查看 => 世界

以下函數將從視圖坐標轉換為世界坐標。


function viewToWorld(x, y) { // x,y pixel coordinates on canvas

    return {

        x: x * view.scale.width + view.origin.x,

        y: y * view.scale.height + view.origin.y

    };     // return x,y pixel coordinates in world

}

在客戶端是畫布的鼠標事件中使用


function mouseEvent(event) {

    // get world (red box) coords 

    const worldCoord = viewToWorld(event.clientX, event.clientY);


    // normalize

    worldCoord.x /= world.width;

    worldCoord.y /= world.height;

}

世界 => 視圖

您可以反轉轉換。即使用以下函數從世界坐標移動到視圖坐標。


function normalWorldToView(x, y) { // x,y normalized world coordinates

    return {

        x: (x * world.width - view.origin.x) / view.scale.width,

        y: (y * world.height - view.origin.y) / view.scale.height

    };     // return x,y pixel on canvas (view)

}

并以像素為單位


function worldToView(x, y) { // x,y world coordinates in pixels

    return {

        x: (x - view.origin.x) / view.scale.width,

        y: (y - view.origin.y) / view.scale.height

    };     // return x,y pixel on canvas (view)

}


查看完整回答
反對 回復 2022-07-08
  • 1 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號