This is the idea of Caitlin and I, a self-made Paint software, for ICM week_02’s homework, making something animated and designed an UI. At first, we were ambitious and made a ideal Paint with multiple function, and even a fancy UI. BUT, it’s just too hard to accomplish 😉 Process of bloody stumbling is as followed:
- made 3 floating cubes to choose colors from.
- frustrated to find out that the color of every cube’s rim changed when I choose different stroke color.
- same thing happened in stroke width.
- P A N I C .
- Struggling for hours.
- thought object-orientation program might be the answer of this puzzle, so started learning OOP from scratch.
- excited to have a workable class of drifting clouds.
- frustrated to find out that problem still existed.
- P A N I C .
- Struggling for hours.
- so desperate that I started googling my problem.
- found out the existence of pushStyle()/popStyle()!
- had a bitter(FXCK!)-yet-sweet(YAH!) moment for a while.
- added stroke width, eraser, and new paper function to finish my mini-Paint.
- L E A R N E D A L O T .
And here’s my bloody baby!(click me click me click me)
And below are my bloody baby’s organs(codes).
class DriftC{ float x, y, scaleC; color c; DriftC(float _x, float _y, float _scaleC, color _c) { x = _x; y = _y; c = _c; scaleC = random((_scaleC-0.05), (_scaleC+0.05)); } void drawCloud() { drifting(); render(); } void drifting() { x ++; y += random(-0.5,0.5); if(x > width + 90) { x = 0 - 90; } } void render() { cloud(x,y,scaleC,c); } void cloud(float x, float y, float sz, color c) { //cloud made by bezier curves //translate(120,145); //cloud's width=220, height=120 pushMatrix(); pushStyle(); translate(x,y); noStroke(); fill(c); scale(sz); float xA=30, yA=-40; bezier(30+xA,20+yA,90+xA,5+yA,110+xA,100+yA,30+xA,75+yA); bezier(30+xA,75+yA,50+xA,110+yA,-10+xA,120+yA,-5+xA,80+yA); bezier(-5+xA,80+yA,-10+xA,120+yA,-80+xA,110+yA,-60+xA,80+yA); bezier(-60+xA,80+yA,-70+xA,110+yA,-100+xA,90+yA,-80+xA,80+yA); bezier(-80+xA,80+yA,-140+xA,100+yA,-160+xA,20+yA,-110+xA,30+yA); bezier(-110+xA,30+yA,-120+xA,10+yA,-100+xA,0+yA,-90+xA,20+yA); bezier(-90+xA,20+yA,-95+xA,0+yA,-60+xA,-30+yA,-40+xA,5+yA); bezier(-40+xA,5+yA,-35+xA,-30+yA,60+xA,-10+yA,30+xA,20+yA); //fill cloud with color beginShape(); vertex(31+xA,19+yA); vertex(31+xA,76+yA); vertex(-5+xA,81+yA); vertex(-60+xA,81+yA); vertex(-80+xA,81+yA); vertex(-111+xA,29+yA); vertex(-91+xA,19+yA); vertex(-40+xA,4+yA); endShape(CLOSE); popStyle(); popMatrix(); } float getX() { return x; } float getY() { return y; } color getC() { return c; } float getS() { return scaleC; } } //variables for Drifting Colors color R = color(255,0,0); color G = color(0,255,0); color B = color(0,0,255); color Y = color(255,240,0); color GG = color(0,245,230); color PN = color(255,77,163); color PR = color(164,0,247); float xRectR, xRectG, xRectB, xRectY, xRectGG, xRectPN, xRectPR; float yRectR, yRectG, yRectB, yRectY, yRectGG, yRectPN, yRectPR; float sizeRect; //variables for StrokeWeight float sw1, sw3, sw6, sw10; float x1, x3, x6, x10, y, h; float penX, penY, ppenX, ppenY; //declare arrays for drifting colors DriftC[] driftingColor = new DriftC[7]; void setup() { size(640,320); smooth(); background(255); //for stroke sw1 = 1; sw3 = 3; sw6 = 6; sw10 = 10; x1 = 33; x3 = 43; x6 = 56; x10 = 73; y = 205; h = 70; pushStyle(); fill(0); noStroke(); rect(x1,y,sw1,h); rect(x3,y,sw3,h); rect(x6,y,sw6,h); rect(x10,y,sw10,h); popStyle(); //for color xRectR = 30; xRectG = 170; xRectB = 270; xRectY = 350; xRectGG = 470; xRectPN = 600; xRectPR = 700; yRectR = 50; yRectG = 60; yRectB = 90; yRectY = 60; yRectGG = 75; yRectPN = 85; yRectPR = 65; sizeRect = 0.5; driftingColor[0] = new DriftC(xRectR, yRectR, sizeRect, R); driftingColor[1] = new DriftC(xRectG, yRectG, sizeRect, G); driftingColor[2] = new DriftC(xRectB, yRectB, sizeRect, B); driftingColor[3] = new DriftC(xRectY, yRectY, sizeRect, Y); driftingColor[4] = new DriftC(xRectGG, yRectGG, sizeRect, GG); driftingColor[5] = new DriftC(xRectPN, yRectPN, sizeRect, PN); driftingColor[6] = new DriftC(xRectPR, yRectPR, sizeRect, PR); } void draw() { //stroke & newPaper pushStyle(); //BG noStroke(); fill(200); rect(0,160,120,160); rect(520,160,120,160); fill(255); rect(10,175,97,130); ellipse(580,250,70,70); //Bars fill(0); rect(x1,y,sw1,h); rect(x3,y,sw3,h); rect(x6,y,sw6,h); rect(x10,y,sw10,h); popStyle(); //color //BG pushStyle(); noStroke(); fill(200); rect(0,0,width,175); fill(255); rect(0,0,width,155); popStyle(); //Drifting Colors for(int i=0; i<driftingColor.length; i++) { driftingColor[i].drawCloud(); } } void mousePressed() { //choose color from cloud for(int i=0; i<driftingColor.length; i++) { if(mouseX>(driftingColor[i].getX()-driftingColor[i].getS()*115) && mouseX<(driftingColor[i].getX()+driftingColor[i].getS()*115) && mouseY>(driftingColor[i].getY()-driftingColor[i].getS()*65) && mouseY<(driftingColor[i].getY()+driftingColor[i].getS()*65)) { stroke(driftingColor[i].getC()); } } //choose stroke width if(mouseX>(x1-2) && mouseX<(x1+sw1+2) && mouseY>y && mouseY<(y+h)) { strokeWeight(1); } if(mouseX>(x3-2) && mouseX<(x3+sw3+2) && mouseY>y && mouseY<(y+h)) { strokeWeight(3); } if(mouseX>x6 && mouseX<(x6+sw6) && mouseY>y && mouseY<(y+h)) { strokeWeight(6); } if(mouseX>x10 && mouseX<(x10+sw10) && mouseY>y && mouseY<(y+h)) { strokeWeight(10); } //make new paper if(mouseX>545 && mouseX<615 && mouseY>215 && mouseY<285) { background(255); fill(0); noStroke(); rect(x1,y,sw1,h); rect(x3,y,sw3,h); rect(x6,y,sw6,h); rect(x10,y,sw10,h); } } void mouseDragged() { line(pmouseX, pmouseY, mouseX, mouseY); } void keyPressed() { stroke(255); }
1 Comments