我正在尝试在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个螺旋桨,并且不希望这部分有这么多代码。
答案 0 :(得分:0)
您需要根据对象和迭代进行思考,而不是明确地写出所有内容。你是对的,你上面的代码包含很多不需要的重复,这是一件坏事。
对于更复杂的情况,您可以将螺旋桨的每个部分定义为对象。在Propeller对象中有一系列零件。每次进行绘制时,都会遍历对象列表并将每个对象渲染出来。
在这种情况下,它可以更简单,只需使用for循环。
在程序的顶部定义:
private static final int NUM_BLADES = 4;
然后你想要一个看起来像这样的循环:
for (int i=0;i<360;i+=360/NUM_BLADES) {
// Draw elipse at current rotation position + the angle for this blade
}
现在您只需更改静态定义即可更改刀片数量。
答案 1 :(得分:0)
你这是错误的方式。事实上非常错误。原因可能是你认为你在“Java ......在程序'处理'中做了这个”
这种想法错误的原因是因为它等同于使用C ++的人说,“我正在使用程序'C ++'在C中创建类。处理基于Java,但它是一种不同的编程语言。如果你对Processing的想法扩展到“编程语言”感到不舒服,那么至少把它想象成一个框架......一个框架,它为你提供各种工具的自己实现,这些工具被放在一起以帮助使用计算机创作艺术品。
现在你的想法似乎在你的特定情况下影响了你很多。就像上面提到的Jose Gonzalez一样,你甚至没有想过rotate()
,这是一个内置于Processing中的函数。蒂姆B关于对象的建议也很明显,但是如果你想在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();
}
}
现在,这绝不意味着 在处理中执行操作的方式,但它使用编程语言提供的各种工具来完成您想要做的事情。此外,对象Prop
可以以各种不同的方式构建,我的实现根本不应该是一流的。
那是怎么回事?好吧,运行草图,你会看到四个螺旋桨在自己的轴上旋转。我只把它们中的四个放在那里,你可以删除它们或者随意添加更多。
支柱是由什么制成的?它由五个椭圆组成。这个概念可能与您的概念不同,它基于吊扇(或其他风扇或甚至是引擎)的想法。这些风扇的中间有一个圆形的东西,所有的叶片都连在上面。中心圆旋转,导致其周围的所有叶片随之旋转。你到底得到的是旋转风扇。
这个东西怎么旋转?类似于上面的风扇类比,中间有一个围绕其中心旋转的椭圆。有四个“附着”的椭圆围绕这个中心椭圆旋转。这给出了旋转螺旋桨的错觉。您需要了解的是,在处理rotate()
中,旋转原点周围的东西。这就是中心椭圆从(0,0)
开始的原因。然后在buildAndRotate()
中使用translate()
进行翻译。使用translate()
不会移动对象,而是移动原点导致对象随之移动,然后当您执行rotate()
时,它会围绕其中心旋转对象。由于所有其他椭圆都是围绕这个中心椭圆构建的,它们也围绕它旋转(在实际实现中,它们只是围绕原点旋转,你可以看到通过去除中心椭圆)。 pushMatrix()
和popMatrix()
被使用,因此所有translate()
和rotate()
命令都不会影响草图中的所有其他命令,并将所有移动和旋转应用于每个对象对象
还有什么呢?其余的很简单(一旦掌握了它,这一切都非常简单)。背景正在不断被清除,这是一种常见的动画技术,可以产生运动的错觉。您可以从background()
删除draw()
的语句,但我不推荐它,因为它会在一段时间后留下一个大的黑色圆圈,您将无法看到道具。角度在draw()
方法中不断变化,这就是你看到道具旋转的原因。如果需要,可以通过更改+ 0.1
添加到angle
的值来加快或减慢轮播速度。
我还能做什么?使用Google或以下链接阅读参考(不是Java参考,处理有自己的参考):http://www.processing.org/reference/rotate_.html,{{3} },http://www.processing.org/reference/pushMatrix_.html,http://www.processing.org/reference/popMatrix_.html等等。
如果您需要澄清某些内容,希望这会有所帮助并在评论中留下问题。