I resolved by myself: Because the screen is updated only at the end of draw()
Hello,
I’m newbie on processung:
I start my processing job from a fine working example that is this:
Gauge second, minute, hour;
int secold, minold, hourold;
void setup(){
size(790, 210);
second = new Gauge(250, 0, 59, 5, "second"); //(width, begin, end, quotation scale, name gauge)
minute = new Gauge(250, 0, 59, 5, "minute");
hour = new Gauge(250, 0, 11, 3, "hour");
secold = 100; //val can never be 100, first run will always draw
minold = 100;
hourold = 100;
}
void draw(){
drw3gauge();
}
void drw3gauge(){
//to save resource, only redraw when time has changed
if (second() != secold){
second.update(second());
pushMatrix();
translate(530, 10);
second.display();
popMatrix();
secold = second();
}
if (minute() != minold){
minute.update(minute());
pushMatrix();
translate(270, 10);
minute.display();
popMatrix();
minold = minute();
}
if (hour() != hourold){
//time received is 24 hour notation, gauge has scale of 12
if (hour() <= 11){
hour.update(hour());
} else {
hour.update(hour()-12);
}
pushMatrix();
translate(10, 10);
hour.display();
popMatrix();
hourold = hour();
}
}
class Gauge{
PVector gsize; //width & height gauge
PVector gscale; //start & end value scale
PVector gneedle; //length & angle needle
int gsteps;
float gline;
String gname;
Gauge(float tempx, float templow, float temphigh, float templine, String tempname){
float gwidth = tempx;
float gheight = 26*tempx/35;
float glow = templow;
float ghigh = temphigh;
gline = templine;
gname = tempname;
gsteps = int(temphigh - templow) + 1;
gsize = new PVector(gwidth, gheight);
gscale = new PVector(glow, ghigh);
gneedle = new PVector(5*gsize.y/8, map(second(), 0, 59, radians(35), radians(145)));
}
void display(){
noStroke();
//backcover
fill(50);
rect(0, 0, gsize.x, gsize.y);
fill(255);
textAlign(CENTER);
textSize(14);
text(gname, gsize.x/2, 15);
//scale
stroke(255, 200);
strokeWeight(2);
for (int i = 0; i < gsteps; i++){
pushMatrix();
translate(gsize.x/2, 11*gsize.y/12);
rotate(PI + map(i, gscale.x, gscale.y, radians(35), radians(145)));
if (i%gline == 0){
line(gneedle.x-5, 0, gneedle.x+5, 0);
translate(gneedle.x+10, 0);
rotate(HALF_PI);
textSize(9);
text(i, 0, 0);
} else {
point(gneedle.x, 0);
}
popMatrix();
}
noStroke();
//needle
stroke(255, 0, 0);
strokeWeight(3);
pushMatrix();
translate(gsize.x/2, 11*gsize.y/12);
rotate(PI + gneedle.y);
line(0, 0, gneedle.x, 0);
popMatrix();
noStroke();
//frontcover
fill(150, 180);
rect(0, 4.5*gsize.y/6, gsize.x, 1.5*gsize.y/6);
fill(255, 0, 0);
ellipseMode(CENTER);
ellipse(gsize.x/2, 11*gsize.y/12, 10, 10);
}
void update(float tempgval){
float gvalue = tempgval;
gneedle.y = map(gvalue, gscale.x, gscale.y, radians(35), radians(145));
}
}
So, I’ve modified the sketch to try to visualize the value of “test” variable, on third Gauge, and this doesn’t fork… gauge is blocket on 59 value.
Gauge test, minute, hour;
int testold, minold, hourold;
int test_cnt = 0;
void setup(){
size(790, 210);
test = new Gauge(250, 0, 59, 5, "test"); //(width, begin, end, quotation scale, name gauge)
minute = new Gauge(250, 0, 59, 5, "minute");
hour = new Gauge(250, 0, 11, 3, "hour");
testold = 100; //val can never be 100, first run will always draw
minold = 100;
hourold = 100;
}
void draw(){
for (test_cnt = 1; test_cnt<59; test_cnt++){
drw3gauge();
}
}
void drw3gauge(){
//to save resource, only redraw when time has changed
if (test_cnt != testold){
test.update(test_cnt);
pushMatrix();
translate(530, 10);
test.display();
popMatrix();
testold = test_cnt;
}
if (minute() != minold){
minute.update(minute());
pushMatrix();
translate(270, 10);
minute.display();
popMatrix();
minold = minute();
}
if (hour() != hourold){
//time received is 24 hour notation, gauge has scale of 12
if (hour() <= 11){
hour.update(hour());
} else {
hour.update(hour()-12);
}
pushMatrix();
translate(10, 10);
hour.display();
popMatrix();
hourold = hour();
}
}
class Gauge{
PVector gsize; //width & height gauge
PVector gscale; //start & end value scale
PVector gneedle; //length & angle needle
int gsteps;
float gline;
String gname;
Gauge(float tempx, float templow, float temphigh, float templine, String tempname){
float gwidth = tempx;
float gheight = 26*tempx/35;
float glow = templow;
float ghigh = temphigh;
gline = templine;
gname = tempname;
gsteps = int(temphigh - templow) + 1;
gsize = new PVector(gwidth, gheight);
gscale = new PVector(glow, ghigh);
gneedle = new PVector(5*gsize.y/8, map(second(), 0, 59, radians(35), radians(145)));
}
void display(){
noStroke();
//backcover
fill(50);
rect(0, 0, gsize.x, gsize.y);
fill(255);
textAlign(CENTER);
textSize(14);
text(gname, gsize.x/2, 15);
//scale
stroke(255, 200);
strokeWeight(2);
for (int i = 0; i < gsteps; i++){
pushMatrix();
translate(gsize.x/2, 11*gsize.y/12);
rotate(PI + map(i, gscale.x, gscale.y, radians(35), radians(145)));
if (i%gline == 0){
line(gneedle.x-5, 0, gneedle.x+5, 0);
translate(gneedle.x+10, 0);
rotate(HALF_PI);
textSize(9);
text(i, 0, 0);
} else {
point(gneedle.x, 0);
}
popMatrix();
}
noStroke();
//needle
stroke(255, 0, 0);
strokeWeight(3);
pushMatrix();
translate(gsize.x/2, 11*gsize.y/12);
rotate(PI + gneedle.y);
line(0, 0, gneedle.x, 0);
popMatrix();
noStroke();
//frontcover
fill(150, 180);
rect(0, 4.5*gsize.y/6, gsize.x, 1.5*gsize.y/6);
fill(255, 0, 0);
ellipseMode(CENTER);
ellipse(gsize.x/2, 11*gsize.y/12, 10, 10);
}
void update(float tempgval){
float gvalue = tempgval;
gneedle.y = map(gvalue, gscale.x, gscale.y, radians(35), radians(145));
}
}
Please, can you helpme? Regards