processing 多个对象问题

想用processing做一个动态效果。就是用面向对象的方式做多个正方形,鼠标经过正方形区域正方形就开始旋转,离开正方形区域正方形就减速到停止。我现在可以做成一个正方形按照这种规律运动。但是做多个的时候就不行了。比较急按照我写的,始终只出现了一个对象。

阅读 5.6k
1 个回答

可参考官方网站数组对象的例子:ArrayObjects
描述:

  1. 生成3*4=12个方块

  2. 鼠标停留在任意方块上时,当前方块开始旋转(此处以固定速度旋转)

  3. 鼠标移开当前方块,当前方块减速旋转至停止(此处使用了旋转速度衰减来实现,但最终停止位置不一定与初始状态一致)

  4. 鼠标移至新方块时,重复2-3过程

大致思路如下:

  1. 创建RotateSquare类(包含坐标位置、长度、颜色、旋转角度、旋转速度、鼠标悬浮状态、旋转状态等属性,判断鼠标是否悬浮于方块上、旋转角度变化、绘图等方法)

  2. 创建数组<rotateSquares>,用来存储多个RotateSquare类

  3. draw()时,从rotateSquares依次提取每一个RotateSquare,调用display()方法进行绘图

  4. 绘图时,对当前RotateSquare判断鼠标是否悬浮于方块上,是则调用方块旋转的方法进行旋转,并更改旋转状态

  5. 当鼠标没有悬浮于方块上时,则判断状态是否为旋转,是则调用方块旋转(衰减率*旋转速度)进行减速

  6. 当旋转速度衰减到一定值时,判定停止

代码如下:

win10, processing 3.2.3

int squareNum=12; // 总方块数
RotateSquare[] rotateSquares= new RotateSquare[squareNum]; 

void setup(){
size(800,600);
background(0);
for(int i=0;i<4;i++){
  for(int j=0;j<3;j++){
    int x=80+width/4*i;
    int y=60+height/3*j;
    int l=80;
    color c=color(255);
    rotateSquares[4*j+i]=new RotateSquare(x,y,l,c);
  }
} // 生成3*4共12个边长为80的方块
}

void draw(){
  background(0);
  for(RotateSquare currentSquare:rotateSquares){
    currentSquare.display();
  } // 绘制12个正方形
} // 

//设定旋转正方形的class
class RotateSquare{
int x,y; // 正方形左上角坐标
int centerX,centerY; // 正方形中心坐标
int l; // 边长
color c; // 颜色
float rotateValue=0; // 旋转角度
float angularVelocity=0; // 旋转角度变化量(类似角速度)
boolean hoverState=false; // 鼠标悬浮状态
boolean rotateState=false; // 旋转状态
float a11,a12,a21,a22;// 坐标变换矩阵
RotateSquare(int x, int y, int l, color c){
  this.x=x;
  this.y=y;
  this.l=l;
  this.c=c;
  centerX=x+l/2;
  centerY=y+l/2;
}

boolean hoverChecked(int mX,int mY){
  a11=cos(rotateValue);a12=sin(rotateValue);
  a21=-sin(rotateValue);a22=cos(rotateValue);
  float nX,nY;
  nX=a11*(mX-centerX)+a12*(mY-centerY);
  nY=a21*(mX-centerX)+a22*(mY-centerY);
  if((nX>=(-l/2))&(nX<=l/2)&(nY>=(-l/2))&(nY<=l/2)){
  return(true);
  }else{
  return(false);
  }
  
} // 鼠标是否悬浮于方块上检测

float rotateChange(float a){
  angularVelocity=a;
  rotateValue=rotateValue+angularVelocity;
  while(rotateValue<0){
    rotateValue=rotateValue+2*PI;
  }
  while(rotateValue>2*PI){
    rotateValue=rotateValue-2*PI;
  }
  return(rotateValue);
} // 旋转调节

void display(){
  stroke(c);
  fill(c);
  hoverState=hoverChecked(mouseX,mouseY);
  pushMatrix();
  translate(centerX,centerY);
  if(hoverState){
    rotate(rotateChange(PI/5.0)); // 角度按每次增加Pi/5进行旋转
    rotateState=true;
  }else if(rotateState){
    rotate(rotateChange(0.95*angularVelocity));// 移开鼠标,旋转速度开始衰减,0.95为衰减速度
    if(angularVelocity<pow(10,-6)){rotateState=false;}
  }else{
    rotate(rotateValue);
  }
    rect(-l/2,-l/2,l,l); // 绘制正方形
    popMatrix();
}

}

结果示意图:
图片描述
图片描述
图片描述

供参考!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进