javascript - 如何测试 2 个画布图像在 JS 画布上是否小于 x 个像素?
问题描述
我正在制作一个NPC无处不在的游戏,我想与他们互动。所以在他们的头上放一个感叹号的图像,数学计算出来的位置是好的。但是测试玩家和NPC之间的距离是我的麻烦。我会缩短代码,因为除了这个之外还有更多的东西,也不包括运动。如果玩家 X 或 Y 在比方说 20 画布像素的范围内,则显示标记。否则,不要。
const canvas = document.querySelector("canvas")
const context = canvas.getContext("2d")
NPCs = [
{
"name": "tim",
"sprite": {
"up": null, // too lazy for that art
"down": null, // down too
"left": "images/tim-left.svg",
"right": "images/tim-right.svg"
},
"x": 50,
"y" 50,
"onInteract": function(){}, // i dont wanna recreate it
}
]
function gameLoop() {
// once again, no movement code shown
NPCs.forEach(npc=>{
const NPCimg = new Image()
NPCimg = npc.sprite.right
context.drawImage(NPCimg,npc.x,npc.y,canvas.width/10,canvas.width/10) // small, i know
if (true/*weird cody statement*/) {
context.drawImage(/*no one cares*/)
}
})
}
setInerval(gameLoop,1000/60) // 60 is a fixed number for now
/*Not really any CSS but margin auto*/
<canvas width="100" height="75"></canvas>
解决方案
您可以使用标准的矩形碰撞公式并在此处添加所需的任何距离 (20)。
function collision(player, obj) {
if (
player.x + player.w + 20 < obj.x ||
player.x > obj.x + obj.w + 20 ||
player.y + player.h + 20 < obj.y ||
player.y > obj.y + obj.h + 20
) {
return;
}
//do something or return true
}
您也可以使用勾股定理来计算距离。
function distance(player, npc) {
//center of rectangle
let pX = player.x + player.w/2
let pY = player.y + player.h/2
let npcX = npc.x + npc.w/2
let npcY = npc.y + npc.h/2
return Math.hypot(pX - npcX, pY - npcY)
}
然后在需要的地方调用它
if (distance(player, npc) <= (player.w + npc.w + 20) || distance(player, npc) <= (player.h + npc.h + 20)) {
//do something
}
推荐阅读
- android - iOS 和 Android 上的背景颜色不一致
- r - R:没有参数且没有返回值的函数?
- python - 如何在 keras 中实现利润函数作为度量?
- java - WebSecurity 忽略不适用于 AbstractAuthenticationProcessingFilter
- linux - sched_setscheduler() /sched_getscheduler() 是否只影响指定进程及其子进程的调度策略?
- config - Symfony 4.2 自定义循环引用处理程序不适用
- java - “包裹:无法编组”具有多个未决意图
- function - 如何使用指针值从 Golang 中的本地函数中获取变量?
- javascript - d3.js 修复了一些有效节点的 x,y 坐标
- python - 准确度指标的目的