Paper.js 不绘制多个形状
Paper.js doesn't draw multiple shapes
我是 JavaScript 的新手,所以我正在寻求帮助。我正在尝试创建一个简单的太阳系模拟,它表示为围绕一个大圆圈(太阳)移动的几个小圆圈(行星)。我使用 Paper.js 创建动画。
我创建了两个 classes:Star 和 Planet。 Star class 具有绘制星星的 draw() 方法,而 Planet class 具有使行星移动的 motion() 方法。
问题是,当我创建多个对象并调用它们的 draw()/motion() 方法,然后尝试 运行 脚本时,我创建的最后一个对象是唯一的 drawn/animated.
例如,在这段代码中:
var sun = new Star("Sun", 400, 400, 50, '#fff250');
sun.draw();
var earth = new Planet("Earth", sun, 100, 10, 1.5, '#b6f7ff');
earth.motion();
var mars = new Planet("Mars", sun, 200, 10, 0.5, '#ff9485');
mars.motion();
mars.motion() 会工作得很好,但其他两种方法会被忽略。如果我去掉这个方法,地球就会出现等等。
完整代码如下:
function Star(name, xCoordinate, yCoordinate, radius, color) {
this.name = name;
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
this.radius = radius;
this.color = color;
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
this.draw = function () {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
}
}
function Planet(name, parentStar, distanceFromStar, radius, period, color) {
this.name = name;
this.parentStar = parentStar;
this.distanceFromStar = distanceFromStar;
this.radius = radius;
this.period = period;
this.color = color;
var xCoordinate = parentStar.xCoordinate + distanceFromStar;
var yCoordinate = parentStar.yCoordinate + distanceFromStar;
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
this.motion = function () {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
paper.view.onFrame = function (event) {
circle.position.x = parentStar.xCoordinate - distanceFromStar * Math.cos(period * event.time);
circle.position.y = parentStar.yCoordinate - distanceFromStar * Math.sin(period * event.time);
}
}
}
window.onload = function() {
var sun = new Star("Sun", 400, 400, 50, '#fff250');
sun.draw();
var earth = new Planet("Earth", sun, 100, 10, 1.5, '#b6f7ff');
earth.motion();
var mars = new Planet("Mars", sun, 200, 10, 0.5, '#ff9485');
mars.motion();
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="paper-core.js"></script>
<script src="solar-system.js"></script>
</head>
<body>
<canvas id="canvas1" resize="" style="user-select: none; touch-action: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);" width="800" height="800" ></canvas>
</body>
</html>
我认为可能的原因是我这样做
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
每次创建新对象时,我都不确定。请帮忙。提前谢谢你。
你对问题的假设是正确的。
每次绘制元素时,您都在设置整个 canvas。
您只需设置一次(只需从绘图方法中删除设置并将其添加到 window.onload
)。
另一个问题是您将每个行星 更新 代码分配为 paper.view.onFrame
。但它只能包含一个函数。为此,我创建了一个列表,其中包含每个行星的 update 函数,然后在 paper.view.onFrame
中我遍历数组并执行每个行星函数。
这是经过更改的代码
var planetList = [];
function Star(name, xCoordinate, yCoordinate, radius, color, canvas) {
this.name = name;
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
this.radius = radius;
this.color = color;
this.draw = function() {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
}
}
function Planet(name, parentStar, distanceFromStar, radius, period, color, canvas) {
this.name = name;
this.parentStar = parentStar;
this.distanceFromStar = distanceFromStar;
this.radius = radius;
this.period = period;
this.color = color;
var xCoordinate = parentStar.xCoordinate + distanceFromStar;
var yCoordinate = parentStar.yCoordinate + distanceFromStar;
this.motion = function() {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
planetList.push( function(event) {
circle.position.x = parentStar.xCoordinate - distanceFromStar * Math.cos(period * event.time);
circle.position.y = parentStar.yCoordinate - distanceFromStar * Math.sin(period * event.time);
});
}
}
window.onload = function() {
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
var sun = new Star("Sun", 400, 400, 50, '#fff250', );
sun.draw();
var earth = new Planet("Earth", sun, 100, 10, 1.5, '#b6f7ff');
earth.motion();
var mars = new Planet("Mars", sun, 200, 10, 0.5, '#ff9485');
mars.motion();
paper.view.onFrame = function(event){
var pLen = planetList.length,
p;
for (p=0;p<pLen;p++){
planetList[p](event);
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.10.3/paper-full.min.js"></script>
</head>
<body>
<canvas id="canvas1" resize="" style="user-select: none; touch-action: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);" width="800" height="800"></canvas>
</body>
</html>
我是 JavaScript 的新手,所以我正在寻求帮助。我正在尝试创建一个简单的太阳系模拟,它表示为围绕一个大圆圈(太阳)移动的几个小圆圈(行星)。我使用 Paper.js 创建动画。
我创建了两个 classes:Star 和 Planet。 Star class 具有绘制星星的 draw() 方法,而 Planet class 具有使行星移动的 motion() 方法。
问题是,当我创建多个对象并调用它们的 draw()/motion() 方法,然后尝试 运行 脚本时,我创建的最后一个对象是唯一的 drawn/animated.
例如,在这段代码中:
var sun = new Star("Sun", 400, 400, 50, '#fff250');
sun.draw();
var earth = new Planet("Earth", sun, 100, 10, 1.5, '#b6f7ff');
earth.motion();
var mars = new Planet("Mars", sun, 200, 10, 0.5, '#ff9485');
mars.motion();
mars.motion() 会工作得很好,但其他两种方法会被忽略。如果我去掉这个方法,地球就会出现等等。
完整代码如下:
function Star(name, xCoordinate, yCoordinate, radius, color) {
this.name = name;
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
this.radius = radius;
this.color = color;
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
this.draw = function () {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
}
}
function Planet(name, parentStar, distanceFromStar, radius, period, color) {
this.name = name;
this.parentStar = parentStar;
this.distanceFromStar = distanceFromStar;
this.radius = radius;
this.period = period;
this.color = color;
var xCoordinate = parentStar.xCoordinate + distanceFromStar;
var yCoordinate = parentStar.yCoordinate + distanceFromStar;
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
this.motion = function () {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
paper.view.onFrame = function (event) {
circle.position.x = parentStar.xCoordinate - distanceFromStar * Math.cos(period * event.time);
circle.position.y = parentStar.yCoordinate - distanceFromStar * Math.sin(period * event.time);
}
}
}
window.onload = function() {
var sun = new Star("Sun", 400, 400, 50, '#fff250');
sun.draw();
var earth = new Planet("Earth", sun, 100, 10, 1.5, '#b6f7ff');
earth.motion();
var mars = new Planet("Mars", sun, 200, 10, 0.5, '#ff9485');
mars.motion();
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="paper-core.js"></script>
<script src="solar-system.js"></script>
</head>
<body>
<canvas id="canvas1" resize="" style="user-select: none; touch-action: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);" width="800" height="800" ></canvas>
</body>
</html>
我认为可能的原因是我这样做
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
每次创建新对象时,我都不确定。请帮忙。提前谢谢你。
你对问题的假设是正确的。
每次绘制元素时,您都在设置整个 canvas。
您只需设置一次(只需从绘图方法中删除设置并将其添加到 window.onload
)。
另一个问题是您将每个行星 更新 代码分配为 paper.view.onFrame
。但它只能包含一个函数。为此,我创建了一个列表,其中包含每个行星的 update 函数,然后在 paper.view.onFrame
中我遍历数组并执行每个行星函数。
这是经过更改的代码
var planetList = [];
function Star(name, xCoordinate, yCoordinate, radius, color, canvas) {
this.name = name;
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
this.radius = radius;
this.color = color;
this.draw = function() {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
}
}
function Planet(name, parentStar, distanceFromStar, radius, period, color, canvas) {
this.name = name;
this.parentStar = parentStar;
this.distanceFromStar = distanceFromStar;
this.radius = radius;
this.period = period;
this.color = color;
var xCoordinate = parentStar.xCoordinate + distanceFromStar;
var yCoordinate = parentStar.yCoordinate + distanceFromStar;
this.motion = function() {
var circle = new paper.Path.Circle(new paper.Point(xCoordinate, yCoordinate), radius);
circle.fillColor = color;
planetList.push( function(event) {
circle.position.x = parentStar.xCoordinate - distanceFromStar * Math.cos(period * event.time);
circle.position.y = parentStar.yCoordinate - distanceFromStar * Math.sin(period * event.time);
});
}
}
window.onload = function() {
var canvas = document.getElementById("canvas1");
paper.setup(canvas);
var sun = new Star("Sun", 400, 400, 50, '#fff250', );
sun.draw();
var earth = new Planet("Earth", sun, 100, 10, 1.5, '#b6f7ff');
earth.motion();
var mars = new Planet("Mars", sun, 200, 10, 0.5, '#ff9485');
mars.motion();
paper.view.onFrame = function(event){
var pLen = planetList.length,
p;
for (p=0;p<pLen;p++){
planetList[p](event);
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.10.3/paper-full.min.js"></script>
</head>
<body>
<canvas id="canvas1" resize="" style="user-select: none; touch-action: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);" width="800" height="800"></canvas>
</body>
</html>