gpt4 book ai didi

javascript - Canvas 和物体

转载 作者:行者123 更新时间:2023-11-28 09:15:06 24 4
gpt4 key购买 nike

我正在尝试使用 Canvas 和 JavaScript,想知道是否有一种方法可以将对象分组在一起,以便可以将它们视为一个 Canvas 中的单个对象。因此,作为一个非常简单的例子,假设我有一个实心圆,周围环绕着一个更大的未实心圆。现在,假设我有 10 个。我想单独移动每个集合,那么有没有办法将每个集合组合在一起作为一个对象?我不想调用来单独移动每个对象。

上面的示例有点简单,因为实际上每个集群中有 10 或 11 个对象分组在一起。单独移动集群中的每个对象是一件痛苦的事情,因此我希望能够将它们组合在一起并进行一次调用来移动它们。

如有任何建议,我们将不胜感激!

最佳答案

您可以使用 Canvas 的“平移”功能来绘制圆组而无需重新计算!

当您使用“翻译”时,团体的位置会变得更简单。

翻译只是将整个组拖到 Canvas 上的新位置的“幕后”数学运算。

您不必为每个圈子进行单独的计算。相反,您只需进行平移,然后绘制圆圈,就像它们处于起始位置一样。

这是如何实现翻译:

      // do a translate to mouseX,mouseY
// all draws will be now be done RELATIVE to mouseX,mouseY
// so if we ctx.translate(100,100)
// then a ctx.rect(0,0,10,10) will actually be drawn at 100,100

ctx.translate(mouseX,mouseY);

// draw the ball group
// notice we didn't have to calculate ANY new positions!!

drawBallGroup();

// translate back after we're done

ctx.translate(-mouseX,-mouseY);

这是代码和 fiddle :http://jsfiddle.net/m1erickson/4rJgw/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
body{ background-color: ivory; padding:10px; }
canvas{border:1px solid red;}
</style>

<script>
$(function(){

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var canvasOffset=$("#canvas").offset();
var offsetX=canvasOffset.left;
var offsetY=canvasOffset.top;

drawBallGroup();

function drawBallGroup(){
drawBall(8,10,5,"red");
drawBall(20,15,10,"green");
drawBall(25,25,8,"blue");
drawBall(5,22,10,"orange");
drawBall(18,30,10,"black");
}

function drawBall(x,y,radius,color){
ctx.beginPath();
ctx.fillStyle=color;
ctx.arc(x,y,radius, 0, 2 * Math.PI, false);
ctx.fill();
}


function handleMouseDown(e){
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);

// clear the canvas
ctx.clearRect(0,0,canvas.width,canvas.height);

// do a translate to mouseX,mouseY
// all draws will be now be done RELATIVE to mouseX,mouseY
// so if we ctx.translate(100,100)
// then ctx.rect(0,0,10,10) will actually be drawn at 100,100
ctx.translate(mouseX,mouseY);

// draw the ball group
// notice we didn't have to calculate ANY new positions!!
drawBallGroup();

// translate back after we're done
ctx.translate(-mouseX,-mouseY);
}

$("#canvas").mousedown(function(e){handleMouseDown(e);});

}); // end $(function(){});
</script>

</head>

<body>
<p>Click to move the ball group to a new location</p>
<p>WITHOUT recalculating each new ball position!</p><br/>
<canvas id="canvas" width=400 height=500></canvas>
</body>
</html>

关于javascript - Canvas 和物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15747636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com