在java中为螺旋桨设置动画

时间:2014-04-29 14:34:17

标签: java animation processing

我正在尝试在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个螺旋桨,并且不希望这部分有这么多代码。

2 个答案:

答案 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_.htmlhttp://www.processing.org/reference/popMatrix_.html等等。

如果您需要澄清某些内容,希望这会有所帮助并在评论中留下问题。