0

我这里有这个小动画,它以重复的无缝模式进行动画处理。

我在画布中间有文本,颜色为白色,环形形状经过。我想要解决的是当白条越过文本时它变成黑色。因此,当白色条的一半越过“文本”的 T 时,T 的一半将是黑色,而未覆盖的一半仍将是对角线上的白色。

这可以通过拆分字母来完成吗?通过掩蔽,或使用矢量图像?

这是我要实现的目标的图形示例。

http://imm.io/2Qsb

drawLine wob1;
drawLine wob2;
drawLine wob3;
drawLine wob4;
drawLine wob5;
PFont helv;
drawText title;

void setup() {

//frame.setResizable(true);
size(320, 480);
smooth();
frameRate(50);


wob1 = new drawLine(0);
wob2 = new drawLine(200);
wob3 = new drawLine(400);
wob4 = new drawLine(600);
wob5 = new drawLine(800);

title = new drawText();

}

void draw() {

background(#000000);

wob1.increment();
wob1.display(#ffffff);
wob1.pos();
wob1.boundary();

wob2.increment();
wob2.display(#ffffff);
wob2.boundary();

wob3.increment();
wob3.display(#ffffff);
wob3.boundary();

wob4.increment();
wob4.display(#ffffff);
wob4.boundary();

wob5.increment();
wob5.display(#ffffff);
wob5.boundary();

title.rendertitle(#ffffff;

}



class drawLine {

int x = -480;
int y = 0;
int count;

drawLine(int offset) {

this.x = this.x + offset;

}

void increment() {

this.x += 3;
this.y += 4;

}

void display(int col) {

//noStroke(); 
fill(col);
//translate(0,0);
rectMode(CENTER);
rotate(-PI/3.0);
rect(x,y,100,3000);
rotate(PI/3.0);

}

void pos() {

println(this.x);

//if(this.x >= -218 && this.x <= 207){ colr = #000000; } else { colr = #ffffff; }

}

void boundary() {

if(this.x > 520) {

this.x = -480; this.y = 0; 
}

}

}


class drawText {

drawText() {

helv = loadFont("Helvetica-Bold.vlw");

}

void rendertitle(int colr) {
fill(colr);
textFont(helv, 30);
text("Text goes here", width/2, height/2, 240, 50);
}

}
4

1 回答 1

0

我使用两个生成的图像制定了一个解决方案。第一个imgText仅包含黑色背景前的文本(白色)。第二个imgMask用作掩码,因此包含屏幕线图案。在setup()部件内只生成一次第一个(文本图像)就可以了;因为您的类型不会更改/移动或转换。如果要达到“扫描”线条的效果,则必须每帧更新遮罩图像。这会在每个draw()循环中通过offset参数的变化发生。

其余的非常基本;imgText在显示实际蒙版图像之前, 清除每一帧的背景并绘制反转版本。

    PImage imgText;
    PImage imgMask;
    PFont font;

    int barHeight = 20;
    float offset = 0;
    float offsetTick = 0.3;

    void setup () {
      size (320, 240);
      noStroke ();
      smooth ();
      font = createFont ("Helvetica-Bold.vlw", 18);

      // Create new image containing only 
      // the white text infront of an empty 
      // black sketch background
      background (0);
      fill (255);
      textFont (font);
      textAlign (CENTER);
      text ("Text goes here", width/2, height/2);
      imgText = createImage (width, height, ARGB);
      copySketchIntoImage (imgText);

      // Create empty mask image
      imgMask = createImage (width, height, ARGB);
    }

    void draw () {

      // Move the scan lines further down 
      // by increasing offset
      offset += offsetTick;
      if (offset > barHeight * 2) {
        offset = 0;
      }

      // Update the text mask image
      updateMask (offset);
      imgText.mask (imgMask);

      // Draw the inverted background+text
      background (255);
      fill (0);
      text ("Text goes here", width/2, height/2);
      // Display the masked version of the
      // text image above the inverted background
      image (imgText, 0, 0);
    }

    void updateMask (float theOffset) {
      background (0);
      fill (255);
      for (float i=theOffset - barHeight; i < height; i += barHeight * 2) {
        rect (0, i, width, barHeight);
      }
      copySketchIntoImage (imgMask);
    }

    // Method to copy all sketch pixels 
    // into an existing PImage.
    void copySketchIntoImage (PImage theDestImage) {
      loadPixels ();
      theDestImage.loadPixels ();
      for (int i=0; i < pixels.length; i++) {
        theDestImage.pixels[i] = pixels[i];
      }
      theDestImage.updatePixels ();
    }
于 2011-01-04T15:13:59.827 回答