Es ist toll, du bist schon spalten, was Sie in Schritten erreichen wollen:
-
Teilen Sie den Bildschirm in vier Quadranten (als ob es Feed von Sicherheitskameras anzeigt, aber ich Videos mit zum größten Teil )
-
haben Videos Last zufällig (von insgesamt 8 Videos zu diesen Quadranten d sein) und die Videos Änderung haben nach eine bestimmte Anzahl von Sekunden (sie alle nicht auf einmal haben, zu ändern, aber was auch immer ist am einfachsten)
-
Haben Sie eine Webcam sendet seinen Zufuhr in einen des Quadranten, als ob es ein weiteres Video
war
Es sieht aus wie Sie bereits den ersten Abschnitt in Angriff genommen haben.
I würde spalten den zweiten Abschnitt weiter:
- Trigger eine Änderung nach einer bestimmten Anzahl von Sekunden (Zeit)
- holt einen Zufall Quadranten/Video
Auslöser, der als Aktion nach einer bestimmten Verzögerung kann mit millis() und bedingt erreicht werden. Sie können here
In Bezug auf die Kommissionierung Zufalls Quadranten/Video ein Beispiel und weitere Details sehen, sind Sie ganz in der Nähe: random()
sollte es tun. Der schwierigste Teil ist, wie Sie Ihre Daten organisieren. Eine Möglichkeit wäre, den Überblick über zwei Arrays zu halten:
- eine Liste (Array) von Videos
- eine Liste der Quadranten auf eine Teilmenge der oben genannten Liste der Videos
zeigen anzuzeigen Die Videos sind immer zugänglich, aber nur eine Auswahl wird angezeigt. Speichern Sie einfach die Indizes der Videos aus der ersten Liste (der geladenen Videos) in eine zweite Liste (die Videoauswahl)
Ich würde auch empfehlen, sich die Angewohnheit zu machen, eine Reihe von Anweisungen zu gruppieren, die eine Aufgabe in eine Funktion ausführen . Auf diese Weise wird der Code leichter zu lesen/zu folgen, zu verwenden und vor allem zu verwenden.
Ich bin mir nicht sicher, ob Sie mit den Funktionen vertraut sind bereits, wie in sie von Grund auf neu zu schreiben, aber man habe sie ziemlich viel so weit mit :)
Wenn du sie nicht verwendet haben Sie sind nicht so schwer aufzuheben. Hier ist ein Versuch, die Idee zu vereinfachen, um sofort eine zu verwenden. Sie haben zum Beispiel smooth()
aufgerufen und Sie haben void setup(){}
geschrieben und eine Gruppe von Anweisungen darin platziert.
Ebenso können Sie Ihre eigene Funktion mit definieren, was Namen Sie wollen:
void myFunction(){
println("myFunction is working!");
}
die Sie dann rufen Sie einfach:
myFunction();
z.B.
Ich gebe zu, es ist nicht das aufregendste Beispiel, aber es sollte beweisen, wie einfach es ist, eine Funktion zu definieren und zu verwenden. Es gibt andere Details wie die Rückgabetypen und Argumente der Funktion, aber Sie können noch in diese kommen.
Lassen Sie sich dieses Wissen anwenden, um eine Funktion wählt zufällige Videos zu machen, die leicht aufgerufen werden können, wenn die ‚r‘ Taste gedrückt wird:
import processing.video.*;
Capture cam;
int maxmyMovies = 8;
int myMoviesIndex = 0;
Movie[] myMovies = new Movie[maxmyMovies];
int[] selection = {0,1,2,3};
void setup() {
size(640, 480);
cam = new Capture(this, 640, 480, 12);
cam.start();
smooth();
for (int i = 0; i < myMovies.length; i ++) {
myMovies[i] = new Movie(this, i + ".mov");
}
selectRandomVideos();
}
void selectRandomVideos(){
//select random movie for each quadrant
for(int i = 0 ; i < selection.length; i++){
//random() returns a float and the index in an int, therefore we cast to (int)
//this also has the side effect to rounding down (similar to floor()) which is convenient as we need 7 as the highest index
selection[i] = (int)random(0,maxmyMovies);
myMovies[selection[i]].loop();
myMovies[selection[i]].volume(0);
}
}
void draw() {
//top left
image(myMovies[selection[0]], 0, 0);
//top right
image(myMovies[selection[1]], 640, 0);
//bottom left
image(myMovies[selection[2]], 0, 480);
//bottom right
image(myMovies[selection[3]], 640, 480);
}
void keyPressed(){
if(key == 'r') selectRandomVideos();
}
void movieEvent(Movie myMovies) {
myMovies.read();
}
Hinweis: Der obige Code ist nicht getestet und die Videogröße ist nicht festgelegt (also entweder haben Sie die Videos in der richtigen Auflösung oder setzen Sie die Breite/Höhe beim Aufruf image()
wie Sie zuvor getan haben).Der Code wird möglicherweise nicht so ausgeführt, wie er ist, sollte aber hoffentlich einen Lösungsansatz für die oben genannten Probleme darstellen.
Das ist also eine sehr einfache Möglichkeit, Videos per Randomisierung zu machen, und zwar für alle gleichzeitig. Diese Funktion ist ein ein einzelnes Video zu einem Zeitpunkt, zu handhaben sein gezwickt:
void selectRandomVideo(){
//select random movie for one quadrant
//pick a quadrant
int randomQuadrant = (int)random(4);
//pick a video
int randomVideo = (int)random(maxmyMovies);
//store the random video index in the random quadrant
selection[randomQuadrant] = randomVideo;
//loop the random quadant's video and mute
myMovies[selection[randomQuadrant]].loop();
myMovies[selection[randomQuadrant]].volume(0);
}
und integriert:
import processing.video.*;
Capture cam;
int maxmyMovies = 8;
int myMoviesIndex = 0;
Movie[] myMovies = new Movie[maxmyMovies];
int[] selection = {0,1,2,3};
void setup() {
size(640, 480);
cam = new Capture(this, 640, 480, 12);
cam.start();
smooth();
for (int i = 0; i < myMovies.length; i ++) {
myMovies[i] = new Movie(this, i + ".mov");
}
selectRandomVideos();
}
void selectRandomVideos(){
//select random movie for each quadrant
for(int i = 0 ; i < selection.length; i++){
//random() returns a float and the index in an int, therefore we cast to (int)
//this also has the side effect to rounding down (similar to floor()) which is convenient as we need 7 as the highest index
selection[i] = (int)random(0,maxmyMovies);
myMovies[selection[i]].loop();
myMovies[selection[i]].volume(0);
}
}
void selectRandomVideo(){
//select random movie for one quadrant
//pick a quadrant
int randomQuadrant = (int)random(4);
//pick a video
int randomVideo = (int)random(maxmyMovies);
//store the random video index in the random quadrant
selection[randomQuadrant] = randomVideo;
//loop the random quadant's video and mute
myMovies[selection[randomQuadrant]].loop();
myMovies[selection[randomQuadrant]].volume(0);
}
void draw() {
//top left
image(myMovies[selection[0]], 0, 0);
//top right
image(myMovies[selection[1]], 640, 0);
//bottom left
image(myMovies[selection[2]], 0, 480);
//bottom right
image(myMovies[selection[3]], 640, 480);
}
void keyPressed(){
if(key == 'r') selectRandomVideo();
}
void movieEvent(Movie myMovies) {
myMovies.read();
}
so etwas wie diese Verwendung und der millis()
Basis-Timer den zweiten Abschnitt lösen.
Für die dritte Abschnitt können Sie den gleichen Trick verwenden. Es kann hilfreich sein, wenn Sie eine For-Schleife verwenden, um die Videos in Quadranten anzuzeigen, anstatt wiederholte image()
Aufrufe zu verwenden. Innerhalb der Schleife können Sie anhand einer Bedingung entscheiden, ob ein Quadrant ein Video oder den Kamera-Feed anzeigen muss.
Wir können eine separate Variable verwenden, um zu verfolgen, welche Quadranten sollte die Kamera angezeigt in werden, dann zusammen, um eine Grundfunktion, die diesen Wert unter Verwendung von Zufallssätze:
void selectRandomCameraQuadrant(){
//selects a valid index (0-3) or an invalid one (4) which means disable the camera
cameraIndex = (int)random(5);
}
Es gibt einen kleinen Hack oben, wo random(5)
wird anstelle von random(4)
verwendet. Dies würde gelegentlich die Chance geben, einen Index zu erhalten, der kein gültiger Quadrant ist, und daher den Kamera-Feed nicht ständig anzeigen.
Hier ist eine Version des Codes dieser Funktion und die ‚c‘ Taste mit einem zufälligen Kamerabild Quadranten auszuwählen:
import processing.video.*;
Capture cam;
int maxmyMovies = 8;
int myMoviesIndex = 0;
Movie[] myMovies = new Movie[maxmyMovies];
int[] selection = {0,1,2,3};
int cameraIndex = -1;
void setup() {
size(640, 480);
cam = new Capture(this, 640, 480, 12);
cam.start();
smooth();
for (int i = 0; i < myMovies.length; i ++) {
myMovies[i] = new Movie(this, i + ".mov");
}
selectRandomVideos();
}
void selectRandomVideos(){
//select random movie for each quadrant
for(int i = 0 ; i < selection.length; i++){
//random() returns a float and the index in an int, therefore we cast to (int)
//this also has the side effect to rounding down (similar to floor()) which is convenient as we need 7 as the highest index
selection[0] = (int)random(0,maxmyMovies);
myMovies[selection[0]].loop();
myMovies[selection[0]].volume(0);
}
}
void selectRandomVideo(){
//select random movie for one quadrant
//pick a quadrant
int randomQuadrant = (int)random(4);
//pick a video
int randomVideo = (int)random(maxmyMovies);
//store the random video index in the random quadrant
selection[randomQuadrant] = randomVideo;
//loop the random quadant's video and mute
myMovies[selection[randomQuadrant]].loop();
myMovies[selection[randomQuadrant]].volume(0);
}
void selectRandomCameraQuadrant(){
//selects a valid index (0-3) or an invalid one (4) which means disable the camera
cameraIndex = (int)random(5);
}
void draw() {
//movie quadrant index
int movieIndex = 0;
//loop through y
for(int yIndex = 0; yIndex < 2; yIndex++){
//loop through x
for(int xIndex = 0; xIndex < 2; xIndex++){
//calculate x position based on index
int x = xIndex * 640;
int y = yIndex * 480;
//check if the camera index matches any of the quadrants (if so display camera, otherwise display movie)
if(movieIndex == cameraIndex){
image(cam, x, y);
}else{
image(myMovies[selection[movieIndex]], x, y);
}
//increment movie quadrant index
movieIndex++;
}
}
}
void keyPressed(){
if(key == 'r') selectRandomVideo();
if(key == 'c') selectRandomCameraQuadrant();
}
void movieEvent(Movie myMovies) {
myMovies.read();
}
Schlussnoten Dies ist nicht die beste/sauberste Weg, das zu lösen Problem, aber eine Idee. Es gibt mehrere Möglichkeiten, die dasselbe erreicht werden können.