java - 用Java制作螺旋桨动画

标签 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个螺旋桨并且不想为这部分准备太多代码。

最佳答案

您正在以错误的方式进行操作。实际上,这是非常错误的。原因可能是您认为您正在“ 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.1angle值来加快或减慢旋转速度。

我还要做什么?通过使用Google或以下链接,例如http://www.processing.org/reference/rotate_.htmlhttp://www.processing.org/reference/pushMatrix_.htmlhttp://www.processing.org/reference/popMatrix_.htmlhttp://www.processing.org/reference/translate_.html等阅读该参考(不是Java参考,Processing有其自己的参考)。

希望这对您有所帮助,并在注释中留下问题。

关于java - 用Java制作螺旋桨动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23367718/

相关文章:

java - 如何在java中使用SetWindowsHookEx函数?

java - xslt 转换后为什么在 Tomcat/bin 文件夹中生成文件?如何将此目录更改为 webapps/myApp?

java - 每次批量调用从 SQS 接收的消息数量是否限制为 10 条

java - 在 android 中使用字符串的数字选择器显示完整的文本值

java - 如何使用特定值填充 3d 数组

javascript - 无法使用 Javascript 为 div #box 设置动画

ios - 使用父 View 的框架更改调整 subview 的大小

javascript - 制作一个幽灵填充的动画按钮并且边界半径有问题

javascript - 是否可以在 ml5.js 中隐藏视频但保留手部姿势点?

javascript - p5.j​​s |语法问题