SCAnimationView user-definable view that animates

Inherits from: Object : SCView : SCUserView

SCAnimationView is a SCUserView that refreshes itself at a constant rate.

With thisProcess.setDeferredTaskInterval(1/fps) you can set the global framerate. The default is 60fps.

See also: GUI-Overview, SCWindow, Pen, Color, and String

Accessing Instance and Class Variables

drawFunc_(arg1)

drawFunc

This works the same as for SCUserView, except that it also sends an endless frame counter (Integer)

as the second argument to the arg1 function.

showInfo_(bool)

showInfo

Enable/disable the average frame rate calculations in the upper left corner.

Examples

//--

(

var width = 400, height = 400, mx = 0, my = 0;

var win = Window("drag mouse test", Rect(100, 200, width, height));

u = AnimationView(win, Rect(0, 0, width, height));

u.background = Color.black;

u.showInfo = true;

u.drawFunc = {|view, i|

Pen.color = Color.white;

Pen.moveTo(Point(my, mx));

100.do{|j|

var x = sin(i*0.04.neg+j)*(5*j)+mx;

var y = cos(i*0.05+j)*(5*j)+my;

Pen.lineTo(Point(y, x));

Pen.addOval(Rect(x, y, j, j));

};

Pen.fillStroke;

};

u.mouseDownAction = {|v, x, y|

mx = x;

my = y;

};

u.mouseMoveAction = u.mouseDownAction;

win.front;

)

u.showInfo = false

u.showInfo = true

//close the window to stop

//--

(

var width = 400, height = 400, xspeed = 3, yspeed = 2, x = width*0.5, y = height*0.5;

var win = Window("ball", Rect(100, 200, width, height));

u = AnimationView(win, Rect(0, 0, width, height));

u.background = Color.black;

u.showInfo = true;

u.drawFunc = {|view, i|

if(x<0 or:{x>width}, {xspeed = 0-xspeed});

if(y<0 or:{y>height}, {yspeed = 0-yspeed});

x = x+xspeed;

y = y+yspeed;

Pen.fillColor = Color.white;

Pen.fillOval(Rect.aboutPoint(Point(x, y), 8, 8));

};

//u.clearOnRefresh = false;

win.front;

)

( //replace the drawFunc above while running

u.drawFunc = {|view, i|

Pen.fillColor = Color.red;

Pen.fillOval(Rect(200, 200, sin(i*0.031)*200, sin(i*0.044)*200));

Pen.fillOval(Rect(200, 200, sin(i*0.052)*200, sin(i*0.065)*200));

Pen.fillOval(Rect(200, 200, sin(i*0.073)*200, sin(i*0.086)*200));

}

)

//close the window to stop

//--

(

var ani, cnt = 0, n = 30;

w = Window("circ", Rect(100, 200, 700, 400), false, false); //not resizable, no border

ani = AnimationView(w, Rect(0, 0, 700, 400));

ani.background= Color.black;

ani.drawFunc = {

Pen.fillColor = Color.blue;

Pen.strokeColor = Color.white;

n.do{|i|

//Pen.addOval(Rect(cnt*(i+1)%700, cnt/(i+1)%400, 50, 50));

//Pen.addOval(Rect(sin(cnt+i/5)*300+325, cnt/(i+1)%400, 50, 50));

Pen.addOval(Rect(sin(cnt+i/5)*150+350, cos(cnt-i/10)*150+200, 50, 50));

};

Pen.draw(3);

cnt = cnt+0.3;

};

w.front;

)

w.close; //to stop

//--

(

s.latency= 0.05;

s.waitForBoot{

var width = 400, height = 400, xspeed = 10, yspeed = 12, x = width*0.5, y = height*0.5, index;

var win = Window("ball", Rect(100, 200, width, height));

var syn = SynthDef(\ping, {|t_trig = 0, freq = 500|

var env = EnvGen.kr(Env.perc, t_trig);

var src = SinOsc.ar([freq, freq+10], 0, env);

Out.ar(0, src);

}).play(s);

s.sync;

index = 0;

u = AnimationView(win, Rect(0, 0, width, height));

u.background = Color.black;

u.showInfo = true;

//draw function that simply renders (stateless)...

u.drawFunc = {|view, i|

Pen.fillColor = Color.white;

Pen.fillOval(Rect.aboutPoint(Point(x, y), 8, 8));

Pen.stringAtPoint("framecounter "+i, Point(250, 30));

Pen.stringAtPoint("routinecounter"+index, Point(250, 40));

};

//independent routine for the control...

r = Routine {

var stretch;

stretch = Pseg(Pseq([0,1],inf), 10).linexp(0,1, 10, 0.5).asStream; // let's fiddle with the rate

inf.do { | i |

index = i;

if(x<0 or:{x>width}, {xspeed = 0-xspeed; syn.set(\t_trig, 1, \freq, 800)});

if(y<0 or:{y>height}, {yspeed = 0-yspeed; syn.set(\t_trig, 1, \freq, 500)});

x = x+xspeed;

y = y+yspeed;

(1/60 * stretch.next).wait

}

};

r.play(SystemClock);

win.onClose_({ r.stop; syn.free; });

win.front;

};

)