我正在使用while循环,旋转和翻译以获得我想要的程序效果。我希望能够在草图的边界内包含循环。任何人都可以向我解释如何做到这一点,拜托?
以下是代码:
DP
答案 0 :(得分:1)
您的问题仍然很广泛,而且尝试调试的代码仍然很多。但是我很欣赏你经历了缩小范围的麻烦,所以我会试着提供一般的帮助。
你的代码涉及很多我不太了解的东西,所以我将从一个更简单的例子开始。老实说,你可能会更好地做同样的事情 - 从更基本的东西开始,并从头开始添加边界逻辑 。在你已经写完所有内容之后,这比试图添加它要容易得多。
因此,在Processing中有两种主要的方法可以做这种类型的动画。我将覆盖两者。
选项1:依靠translate()
和rotate()
为您定位内容。
这就是您的代码所做的事情。这是一个更简单的示例,显示围绕鼠标位置旋转的椭圆:
float angle = 0;
void setup() {
size(500, 500);
}
void draw() {
angle+=.1;
background(0);
translate(mouseX, mouseY);
rotate(angle);
translate(100, 0);
ellipse(0, 0, 50, 50);
}
现在,如果要将椭圆限制在窗口内,首先需要确定椭圆在屏幕上的位置。这可能很复杂,因为我们使用translate()
和rotate()
函数,这有点像移动相机而不是移动椭圆 - 椭圆&# 34;认为"它仍处于0,0
位置。所以我们需要在移动相机后获得椭圆的位置。幸运的是,处理为我们提供了screenX()
和screenY()
函数:
float screenX = screenX(0, 0);
float screenY = screenY(0, 0);
这将告诉我们在屏幕上将绘制椭圆的位置(或更准确地说,在应用变换后位置0,0
将在何处)。我们可以使用它来检查它们是否超出了窗口的范围,然后做你想要的任何边界。
你做什么类型的边界取决于你想要发生什么。您可以将动画包裹在屏幕周围,这样当它从右侧移开时,它会重新出现在左侧。你可以限制位置,使它们只到窗口的边界而不是移过它。这是:
float angle = 0;
void setup() {
size(500, 500);
}
void draw() {
angle+=.1;
background(0);
translate(mouseX, mouseY);
rotate(angle);
translate(100, 0);
float screenX = screenX(0, 0);
float screenY = screenY(0, 0);
if (screenX < 25) {
rotate(-angle);
translate(25-screenX, 0);
rotate(angle);
} else if (screenX > 475) {
rotate(-angle);
translate(475-screenX, 0);
rotate(angle);
}
if (screenY < 25) {
rotate(-angle);
translate(0, 25-screenY);
rotate(angle);
} else if (screenY > 475) {
rotate(-angle);
translate(0, 475-screenY);
rotate(angle);
}
ellipse(0, 0, 50, 50);
}
此代码与上述代码相同,只是现在使用screenX()
和screenY()
来确定椭圆何时离开屏幕,然后使用translate()
将其移回内部屏幕的界限。
选项2:自己跟踪位置。
您可以使用一些基本的代数和触发来自行定位,而不是依靠translate()
和rotate()
进行定位。
这是一个简单的程序,没有限制:
float angle = 0;
void setup() {
size(500, 500);
}
void draw() {
angle+=.1;
background(0);
float circleX = mouseX + cos(angle)*100;
float circleY = mouseY + sin(angle)*100;
ellipse(circleX, circleY, 50, 50);
}
请注意,我自己计算椭圆的位置,而不是依靠translate()
和rotate()
。现在可能更容易考虑圆圈的确切位置,所以我可以做边界:
float angle = 0;
void setup() {
size(500, 500);
}
void draw() {
angle+=.1;
background(0);
float circleX = mouseX + cos(angle)*100;
float circleY = mouseY + sin(angle)*100;
if (circleX < 25) {
circleX = 25;
} else if (circleX > 475) {
circleX = 475;
}
if (circleY < 25) {
circleY = 25;
} else if (circleY > 475) {
circleY = 475;
}
ellipse(circleX, circleY, 50, 50);
}
这可能更容易思考,因为您可以直接使用屏幕坐标。两种选择都做同样的事情,它们只是不同的思考方式。
从这里开始,只需确定你的边界应该如何运作。我给你举了一个例子,但你可以做任何你想做的事。
您可能还想限制输入变量(在我的情况下,mouseX
和mouseY
),以便动画永远不会离开窗口。在顶部添加此项上述任一选项的draw()
功能将阻止动画离开屏幕:
if (mouseX < 150) {
mouseX = 150;
} else if (mouseX > 350) {
mouseX = 350;
}
if (mouseY < 150) {
mouseY = 150;
} else if (mouseY > 350) {
mouseY = 350;
}
同样,你如何做到这一点取决于你和你想要发生的事情。如果你重新使用像我这样的基本程序,然后一次添加一个小东西,而不是试图将它添加到你现有的大草图中,这可能会更容易。祝你好运。