【问题标题】:closePath() Moving PolygonclosePath() 移动多边形
【发布时间】:2022-01-09 20:53:29
【问题描述】:

下面的代码是制作一个简单的三角形所需要的。我想将三角形​​保持在那个确切的位置并将其添加到我的画布中。

can = document.getElementById("gameCanvas");
var ctx = can.getContext("2d");
ctx.beginPath();
ctx.moveTo(1, 20);
ctx.lineTo(20, 100);
ctx.lineTo(70, 100);
ctx.closePath();
ctx.stroke();

如果您运行下面的代码,三角形会出现一瞬间然后消失。我需要它和三个方程一起呆在那里。我创建了函数 path();努力保持三角形位于左上角。我不确定如何将三角形保留在那里并完成所有这些操作。

<html>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" src="//code.createjs.com/createjs-2013.09.25.combined.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
#gameCanvas {
  background-color: lightyellow;
}
</style>
<div class="canvasHolder1">
  <div id="eqn1"> 3+3=<input type="text" id="q1" />
    </div>
  <div id="eqn2"> 3+2=<input type="text" id="q2" />
    </div>
  <div id="eqn3"> 5+2=<input type="text" id="q3" />
    </div>
  <canvas id="gameCanvas" width="600" height="600">Not supported</canvas>
<script type="text/javascript">

var m=1;

  var stage = new createjs.Stage("gameCanvas");
  var obj=[];
 
can = document.getElementById("gameCanvas");
var ctx = can.getContext("2d");
ctx.beginPath();
ctx.moveTo(1, 20);
ctx.lineTo(20, 100);
ctx.lineTo(70, 100);
ctx.closePath();
ctx.stroke();
function startGame() {
   
    obj[1] = new createjs.DOMElement(document.getElementById(`eqn${1}`));
    obj[2] = new createjs.DOMElement(document.getElementById(`eqn${2}`));
    stage.addChild(obj[1]);
    stage.addChild(obj[2]);
    createjs.Ticker.addEventListener("tick", handleTick);
    createjs.Ticker.setFPS(60);
    function handleTick(event){
    drop(1);
    drop(2);
    path();
    stage.update();
    }
}
 function drop(i){
      obj[1].x =40;
      obj[1].y =50;
      obj[2].x =300;
      obj[2].y =50;
 }
function path(){
ctx.x=1;
ctx.y=1;
}
</script>
<body onload="startGame();">
    <div >
  <canvas>This browser or document mode doesn't support canvas object.</canvas>
    </div>
</body>
</html>

【问题讨论】:

  • 您的文档中有两个canvas 元素。 gameCanvas 位于您的 &lt;body&gt; 标记之外,这会导致错误。将canvasHolder1 div 和&lt;script&gt; 移动到&lt;body&gt; 标记。最后订购&lt;script&gt;。原因是浏览器从上到下读取(并执行)文档。
  • @EmielZuurbier 你是说把&lt;div class="canvasHolder1"&gt; &lt;div id="eqn1"&gt; 3+3=&lt;input type="text" id="q1" /&gt; &lt;/div&gt; &lt;div id="eqn2"&gt; 3+2=&lt;input type="text" id="q2" /&gt; &lt;/div&gt; &lt;div id="eqn3"&gt; 5+2=&lt;input type="text" id="q3" /&gt; &lt;/div&gt; &lt;canvas id="gameCanvas" width="600" height="600"&gt;Not supported&lt;/canvas&gt; &lt;script type="text/javascript"&gt;的所有东西都移到标签吗?我也不确定你所说的 body 标签是什么意思。什么是身体标签?你是说开始游戏功能吗?
  • 我不太清楚你的意思
  • &lt;body&gt;...&lt;/body&gt; 元素代表页面上的所有内容。所以你的画布和内容元素应该在那里。 See here for more info 但是,这似乎不是您的错误的原因。当我浏览您的代码时,我注意到只要我删除 stage.update(); 行,画布似乎就可以正确呈现。那条线是做什么的?
  • 我认为这就是重申 startGame 功能的原因。它用于ticker元素

标签: javascript html css canvas jsfiddle


【解决方案1】:

看看这个:

<!DOCTYPE html>
<html lang="en">

<head>
  <title>Math Game</title>
  <script src="//code.createjs.com/createjs-2013.09.25.combined.js"></script>
</head>

<body onload="startGame();">
  <div class="canvasHolder1">
    <div id="eqn1"> 3+3=<input type="text" id="q1" /></div>
    <div id="eqn2"> 3+2=<input type="text" id="q2" /></div>
    <div id="eqn3"> 5+2=<input type="text" id="q3" /></div>
    <canvas id="gameCanvas" width="600" height="200">Not supported</canvas>
  </div>

  <script>
    var stage = new createjs.Stage("gameCanvas");
    var can = document.getElementById("gameCanvas");
    var ctx = can.getContext("2d");
    var obj = [];

    function drawTriangle() {
      ctx.beginPath();
      ctx.moveTo(1, 20);
      ctx.lineTo(20, 100);
      ctx.lineTo(70, 100);
      ctx.closePath();
      ctx.stroke();
    }

    function startGame() {
      obj[1] = new createjs.DOMElement(document.getElementById("eqn1"));
      obj[1].x = 40;
      obj[1].y = 50;
      stage.addChild(obj[1]);

      obj[2] = new createjs.DOMElement(document.getElementById("eqn2"));
      obj[2].x = 300;
      obj[2].y = 50;
      stage.addChild(obj[2]);

      stage.update();
      drawTriangle();
    }
  </script>
</body>

</html>

您可以看到我创建了一个新函数 drawTriangle,它将在您的 startGame 末尾调用,这样三角形是画布中绘制的最后一个项目。

我不确定你为什么需要Ticker,所以我删除了它,与其他功能一样,它们对我来说没有多大意义,不需要你目前正在尝试完成的事情。


现在解决您的问题...在我的实现中,我将 drawTriangle 作为 startGame 中的最后一个动作,但如果我们更改顺序,则如下所示:

      drawTriangle();
      stage.update();

三角形消失了!

我有根据的猜测是stage.update() 清除了整个画布并绘制了它“知道”在舞台外进行的三角形绘制,因此我们需要始终在之后绘制它。

查看update的代码文档:
https://www.createjs.com/docs/easeljs/files/easeljs_display_Stage.js.html#l349
有一个 if 语句 if (this.autoClear) { 与我们在您的示例中看到的完全一样,并且 autoClear 的默认值为 true:
https://www.createjs.com/docs/easeljs/classes/Stage.html#property_autoClear


另外值得指出...有一种原生的createjs方式来画线:

您的方法没有问题,您同时使用 createjs 并通过 getContext("2d") 在画布中直接绘图,您只需要相应地计划,但我的建议是,如果有本地方法,我会坚持使用,在这里是一个示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Math Game</title>
  <script src="//code.createjs.com/createjs-2013.09.25.combined.js"></script>
</head>

<body onload="startGame();">
  <div class="canvasHolder1">
    <div id="eqn1"> 3+3=<input type="text" id="q1" /></div>
    <canvas id="gameCanvas" width="600" height="160">Not supported</canvas>
  </div>

  <script>
    function startGame() {
      var stage = new createjs.Stage("gameCanvas");
      var eqn1 = new createjs.DOMElement(document.getElementById("eqn1"));
      eqn1.x = eqn1.y = 50;
      stage.addChild(eqn1);
      
      var triangle = new createjs.Shape();
      triangle.graphics.beginStroke("black")
      triangle.graphics.moveTo(1, 20);
      triangle.graphics.lineTo(20, 100);
      triangle.graphics.lineTo(70, 100);
      triangle.graphics.lineTo(1, 20);
      stage.addChild(triangle);

      stage.update();
    }
  </script>
</body>
</html>

【讨论】:

  • 是的,非常感谢您的详尽回答!这很有帮助。
  • @WilliamGarske 很高兴它有帮助......是的,我花了一些时间研究createjs,在你自己的答案中记住你不仅仅是在回答问题,而是在未来给任何人这可能是一个类似的问题提示如何解决它......
  • @WilliamGarske 你更喜欢哪种方法?原生三角形看起来很简单
  • 两个我都喜欢!第一种方式看起来更干净。我喜欢你提到 stage.update();事情与订单如何进行有关。话虽如此,我认为我更喜欢第二种方式,因为我喜欢将 var 三角形添加到舞台的方式,并且确切地知道它叫什么
猜你喜欢
  • 2016-06-01
  • 2022-12-01
  • 2016-09-02
  • 2023-03-09
  • 1970-01-01
  • 2021-04-11
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多