我正在尝试为Java中的螺旋桨设置动画,并使用以下代码:
int x = 0;
int y = 230;
int h = 40;
int i = 0;
int center = 250;
void setup() {
size(500, 400);
}
void draw () {
if (i == 0) {
if(y>200) {
ellipse(x, y, 20, h);
y--;
h+=2;
x+=1;
} else { i = i + 1; }
}
if (i == 1) {
if(y<=230) {
ellipse(x, y, 20, h);
y++;
h-=2;
x+=1;
} else { i = i + 1; }
}
if (i == 2) {
if(h<70) {
ellipse(x, y, 20, h);
y++;
h+=1;
x+=1;
} else { i = i + 1; }
}
if (i == 3) {
if(h>=40) {
ellipse(x, y, 20, h);
y--;
h-=1;
x+=1;
} else { i = 0; }
}
}
有没有一种方法可以使它更短一些,因为我想有4个螺旋桨并且不想为这部分准备太多代码。
最佳答案
您正在以错误的方式进行操作。实际上,这是非常错误的。原因可能是您认为您正在“ Java ...在程序“处理”中”执行此操作
这种想法是错误的,是因为它等同于使用C ++的人说:“我正在使用程序'C ++'在C中创建类”。处理基于Java,但它是另一种编程语言。如果您不满意将Processing的思想扩展为“编程语言”的思想,那么至少可以将其视为一个框架...一个框架,该框架为您提供了自己对各种工具的实施,这些工具可以共同帮助您使用计算机创作艺术。
现在,您的想法似乎在您的特定情况下已对您产生很大影响。就像上面的Jose Gonzalez所建议的那样,您甚至都没有想到过rotate()
,它是Processing中内置的功能。 Tim B关于Objects的建议也很明确,但是如果您想在Processing中进行操作,请尝试以Processing方式进行处理。
这是我做的一个非常简单的草图,让您了解我的意思:
Prop myProp1;
Prop myProp2;
Prop myProp3;
Prop myProp4;
float angle;
void setup() {
size(500, 500);
background(255);
angle = 0;
fill(0);
ellipseMode(CENTER);
myProp1 = new Prop(50,50);
myProp2 = new Prop(75,75);
myProp3 = new Prop(100,100);
myProp4 = new Prop(125,125);
}
void draw() {
background(255);
angle = ((angle + 0.1) % 360);
myProp1.buildAndRotate(angle, width*3/4, height/4);
myProp2.buildAndRotate(angle, width/4, height/4);
myProp3.buildAndRotate(angle, width*3/4, height*3/4);
myProp4.buildAndRotate(angle, width/4, height*3/4);
}
class Prop {
int propX;
int propY;
int propW;
int propH;
Prop() {
propX = 0;
propY = 0;
propW = 50;
propH = 50;
}
Prop(int w, int h) {
propX = 0;
propY = 0;
propW = w;
propH = h;
}
void buildAndRotate(float angle, float moveToX, float moveToY) {
pushMatrix();
translate(moveToX, moveToY);
rotate(angle);
ellipse(propX, propY, propW, propH);
ellipse(propX+propW/2, propY+propH/2, propW, propH);
ellipse(propX-propW/2, propY+propH/2, propW, propH);
ellipse(propX+propW/2, propY-propH/2, propW, propH);
ellipse(propX-propW/2, propY-propH/2, propW, propH);
popMatrix();
}
}
现在,这决不是要在Processing中做事,而是要使用编程语言提供的各种工具来精确地完成您想做的事情。同样,可以用各种不同的方式来构建对象
Prop
,而我的实现也不应该是一流的。那么发生了什么?好了,运行草图,您将看到四个螺旋桨在各自的轴上旋转。我只在其中放置了四个,您可以删除它们,也可以根据需要添加更多。
道具是由什么制成的?它由五个椭圆组成。这个概念可能与您的不同,它基于吊扇(或与此相关的其他风扇,甚至是螺旋桨发动机)的想法。这些风扇的中央有一个圆形的东西,所有叶片都固定在上面。中心圆旋转,导致其周围的所有刀片随之旋转。最后得到的是旋转风扇。
这东西怎么旋转?类似于上面的风扇类比,中间有一个椭圆围绕其中心旋转。有四个“附加”到其上的椭圆围绕此中心椭圆旋转。这给了道具旋转的错觉。您需要了解的是,在处理
rotate()
中会绕原点旋转事物。这就是中心椭圆从(0,0)
开始的原因。然后在buildAndRotate()
中使用translate()
将其翻译。使用translate()
不会移动对象,而是会移动原点,导致对象随之移动,然后在执行rotate()
时,它将围绕对象的中心旋转。由于所有其他椭圆都是围绕该中心椭圆构建的,因此它们也都围绕该中心椭圆旋转(在实际实现中,它们只是围绕原点旋转,您可以通过删除中心椭圆来看到这一点)。使用pushMatrix()
和popMatrix()
以便所有translate()
和rotate()
命令不会影响草图中的其他所有内容,并且将应用于每个对象的所有运动和旋转保持在该对象上。还有什么事吗?其余的都非常简单(一旦掌握了这些,一切都非常简单)。背景不断被清除,这是一种常见的动画技术,可以给人以运动的感觉。您可以从
background()
删除draw()
的语句,但我不建议这样做,因为一段时间后它将留下一个大的黑色圆形圆圈,您将看不到道具。在draw()
方法中,角度不断变化,这就是为什么看到道具旋转的原因。如果需要,可以通过更改添加到+ 0.1
的angle
值来加快或减慢旋转速度。我还要做什么?通过使用Google或以下链接,例如http://www.processing.org/reference/rotate_.html,http://www.processing.org/reference/pushMatrix_.html,http://www.processing.org/reference/popMatrix_.html,http://www.processing.org/reference/translate_.html等阅读该参考(不是Java参考,Processing有其自己的参考)。
希望这对您有所帮助,并在注释中留下问题。
关于java - 用Java制作螺旋桨动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23367718/