In questo primo esempio viene definito un AVO che ruota in senso antiorario, di 90 gradi al secondo, al centro della finestra del compositor. Quando l'utente clicca sull'oggetto, tramite un mouse, la direzione di rotazione si inverte. Questo effetto è ottenuto mediante il metodo handle: quando questo metodo riceve un evento, controlla se l'etichetta dell'evento corrisponde a quella dell'oggetto, se c'è corrispondenza, significa che l'evento di click riguarda quell'oggetto, e quindi la direzione di rotazione viene invertita. Il metodo render calcola il tempo locale, e l'angolo di rotazione dall'ultimo click, quindi ruota l'oggetto dell'angolo calcolato, ed effettua il rendering.
public class ReversibleVideoObject extends AVObject {
VideoObject videoObject = new VideoObject();
byte ident = 17;
double time, angle;
double timeAtLastClick = 0;
double angleAtLastClick = 0;
double degsPerSec = 90.0;
public void render(Compositor c) {
time = c.transform.localTime();
angle = (time-timeAtLastClick)*degsPerSec
+ angleAtLastClick;
c.pushTransform();
c.pushProperties();
c.transform.rotate(angle);
c.properties.label(ident);
c.render(videoObject);
c.popProperties();
c.popTransform();
}
public void handle(Event e) {
if (((PressEvent)e).label == ident) {
timeAtLastClick = time;
angleAtLastClick = angle;
degsPerSec *= -1;
}
}
public ReversibleVideoObject(int id){
ident = (byte)id;
}
public ReversibleVideoObject() { }
}
In questo altro esempio, un DoubleReversibleVideoObject è definito tramite due ReversibleVideoObject: uno dei quali ruota a
della velocità dell'altro. Il metodo handle passa gli eventi ricevuti, senza interpretarli, ai sotto-oggetti. I sotto-oggetti hanno etichette differenti, e quindi sono indipendenti l'uno dall'altro.
public class DoubleReversibleVideoObject extends AVObject {
AVObject obj1 = new ReversibleVideoObject(17);
AVObject obj2 = new ReversibleVideoObject(23);
public void render(Compositor c) {
c.pushTransform();
c.transform.translate(-80,0);
c.render(obj1);
c.transform.speed(0.25);
c.transform.translate(160,0);
c.render(obj2);
c.popTransform();
}
public void handle(mpeg4.Event e) {
obj1.handle(e);
obj2.handle(e);
}
}