You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

341 lines
9.7 KiB

PImage backgroundImage, titleImage;
Equipe[] equipes;
Position[] positions;
Scoreboard Scoreboard;
int nombreEquipes = 42;
int timer;
PFont quicksandFont;
boolean EDITING=false;
Table positionTable;
void setup() {
size(displayWidth, displayHeight);
fullScreen(1);
//randomSeed(3);
//frameRate(60);
colorMode(RGB, 255);
rectMode(CENTER);
noStroke();
timer = millis();
// modifier les positions des cases du plateau
EDITING=false;
// initialisation du scoreboard
Scoreboard = new Scoreboard();
positionTable = loadTable("data/positionTable.csv", "header");
quicksandFont = loadFont("Quicksand-Bold-40.vlw");
backgroundImage = loadImage("backgroundImage.jpg");
titleImage = loadImage("title.png");
// génération des équipes
equipes = new Equipe[nombreEquipes];
for (int i=0; i<equipes.length; i++) {
Equipe e = new Equipe(i);
equipes[i] = e;
}
// génération des emplacements
positions = new Position[positionTable.getRowCount()];
for (int i=0; i<positionTable.getRowCount(); i++) {
positions[i] = new Position(positionTable.getInt(i, "id"));
positions[i].radius = (i==0 || i==positionTable.getRowCount()-1)? 145: 60;
positions[i].posX = positionTable.getFloat(i, "posx");
positions[i].posY = positionTable.getFloat(i, "posy");
}
Scoreboard.applyScores();
}
// positionnement des pions sur une case, répartis en cercle si ils sont plusieurs
void drawAround(int score) {
//println("draw around", score);
for (int i=0; i<positionTable.getRowCount(); i++) {
if (score>0 && score!=i) continue;
// récupération des pions par score
IntList pions = new IntList();
for (TableRow row : Scoreboard.findRows(str(i+1), "score")) {
pions.append(row.getInt("equipe")-1);
}
// positionnement des pions dont le score n'est pas nul
if (pions.size()>0) {
float angle = PI;
// ce bloc est incompréhensible... mais il fait son taf de répartition des pions selon leur nombre
for(int j=0; j<pions.size(); j++) {
angle += TWO_PI / pions.size();
equipes[pions.get(j)].pion.posX = pions.size() * 5.5 * cos(angle) + positions[i].posX;
equipes[pions.get(j)].pion.posY = pions.size() * 5.5 * sin(angle) + positions[i].posY;
}
}
}
}
// fonction appellée à chaque mouvement de souris
void mouseMoved() {
for (int i = 0 ; i < equipes.length; i++) {
Equipe e = equipes[i];
Pion p = e.pion;
// calcul de distance entre la souris et le pion
float distPion = dist(p.posX, p.posY, mouseX, mouseY);
// calcul de distance entre la souris et l'emplacement d'équipe
float distEquipe = dist(e.posX, e.posY, mouseX, mouseY);
// seuil de collision
float threshold = p.radius/2;
// si la souris est au delà du seuil de collision et que le pion est dans un état actif
if (distPion>threshold && distEquipe>threshold && (p.hovered || p.dragged)) {
// cloture des deux états
p.dragStop();
p.hoverStop();
break;
// si la souris est sous le seuil de collision du pion et qu'il n'est pas déjà dans l'état survolé
} else if ((distPion<=threshold || distEquipe<=threshold) && !p.hovered) {
if (distEquipe<=threshold && distPion>threshold) p.lazored = true;
// activation de l'état survolé
p.hoverStart();
break;
}
}
if (!EDITING) return;
for (int i = 0 ; i < positions.length; i++) {
Position p = positions[i];
float distPosition = dist(p.posX, p.posY, mouseX, mouseY);
float threshold = p.radius/2;
if (distPosition>threshold && (p.hovered || p.dragged)) {
p.dragStop();
p.hoverStop();
break;
} else if (distPosition<=threshold && !p.hovered) {
p.hoverStart();
break;
}
}
}
// fonction appellée à chaque appui du clic
void mousePressed() {
for (int i = 0 ; i < equipes.length; i++) {
Pion p = equipes[i].pion;
float d = dist(p.posX, p.posY, mouseX, mouseY);
if (d<p.radius/2) {
//println(p.id+1);
p.dragStart();
break;
}
}
//if (Scoreboard.mouseHover()) {
// Scoreboard.toggleDisplay();
//}
Equipe clicked = findClosestEquipeFromMouse();
float eD = dist(clicked.posX, clicked.posY, mouseX, mouseY);
if (eD<=clicked.radius/2) {
// désactiver l'incrémentation si le pion était encore à son emplacement d'origine
//if (!clicked.pion.dragged) {
if (mouseButton == LEFT) {
clicked.incTour();
} else if (mouseButton == RIGHT) {
clicked.decTour();
}
Scoreboard.save();
println("Clicked on Equipe", clicked.id+1, "set tour to", clicked.tour);
//}
}
if (!EDITING) return;
for (int i = 0 ; i < positions.length; i++) {
Position p = positions[i];
float d = dist(p.posX, p.posY, mouseX, mouseY);
if (d<p.radius/2) {
//println(p.id+1);
p.dragStart();
break;
}
}
}
// fonction appellée à chaque déplacement appuyé (drag)
void mouseDragged() {
for (int i = 0 ; i < equipes.length; i++) {
Pion p = equipes[i].pion;
if (p.dragged) {
p.posX = mouseX+p.offset.x;
p.posY = mouseY+p.offset.y;
// cloture de la boucle for, pour ne pas cibler plusieurs pions si c'était possible
break;
}
}
if (!EDITING) return;
for (int i = 0 ; i < positions.length; i++) {
Position p = positions[i];
if (p.dragged) {
p.posX = mouseX+p.offset.x;
p.posY = mouseY+p.offset.y;
break;
}
}
}
// fonction appellée à chaque relâchement du clic
void mouseReleased() {
for (int i = 0 ; i < equipes.length; i++) {
Pion p = equipes[i].pion;
if (p.dragged) {
p.dragStop();
equipes[i].setScore(findClosestPositionFrom(p).getScore());
Scoreboard.save();
}
}
if (!EDITING) return;
for (int i = 0 ; i < positions.length; i++) {
Position p = positions[i];
if (p.dragged) {
p.dragStop();
savePositionTable();
}
}
}
// fonction appellée à chaque mouvement de molette
void mouseWheel(MouseEvent event) {
for (int i = 0 ; i < equipes.length; i++) {
Equipe e = equipes[i];
Pion p = e.pion;
// calcul de distance entre la souris et l'emplacement d'équipe
float distEquipe = dist(e.posX, e.posY, mouseX, mouseY);
// seuil de collision
float threshold = p.radius/2;
// nouveau rayon
float radius = p.radius + event.getCount()*-5;
/**
* SI la souris est sous le seuil de collision
* ET le nouveau rayon est acceptable
* ET le pion n'est pas en cours d'animation
**/
if (distEquipe<=threshold && radius>20 && radius<120 && !p.animated) p.radius = radius;
}
}
// écrit la position des cases dans un .csv
void savePositionTable() {
positionTable = new Table();
positionTable.addColumn("id");
positionTable.addColumn("posx");
positionTable.addColumn("posy");
for (int i = 0 ; i < positions.length; i++) {
Position p = positions[i];
TableRow position = positionTable.addRow();
position.setInt("id", p.id);
position.setFloat("posx", p.posX);
position.setFloat("posy", p.posY);
}
saveTable(positionTable, "data/positionTable.csv", "csv");
}
// renvoie la Position la plus proche du Pion fourni en paramètre
Position findClosestPositionFrom(Pion pion) {
Position closest = positions[0];
for (int i = 0 ; i < positions.length; i++) {
Position position = positions[i];
float distPion = dist(pion.posX, pion.posY, position.posX, position.posY);
float distClosest = dist(pion.posX, pion.posY, closest.posX, closest.posY);
if (distPion<=distClosest) closest = positions[i];
}
return closest;
}
// renvoie l'emplacement d'équipe le plus proche de la souris
Equipe findClosestEquipeFromMouse() {
Equipe closest = equipes[0];
for (int i = 0 ; i < equipes.length; i++) {
Equipe equipe = equipes[i];
float distPion = dist(mouseX, mouseY, equipe.posX, equipe.posY);
float distClosest = dist(mouseX, mouseY, closest.posX, closest.posY);
if (distPion<=distClosest) closest = equipes[i];
}
return closest;
}
// test de présence du fichier en paramètre
boolean fileExists(String filename) {
File f = dataFile(filename);
return f.isFile();
}
// LAZOR !!!
void LAZOR(PVector source, PVector target, int noiseLevel) {
stroke(random(0, 255), random(0, 100), random(0, 100));
strokeWeight(random(0,3));
line(source.x, source.y, target.x, target.y);
}
void LAZOR(PVector source, PVector target) {
LAZOR(source, target, 0);
}
// RECTANGULAR LAZOR !!!
void LAZORECT(float posX, float posY, float width, float height) {
stroke(random(0, 255), random(0, 100), random(0, 100));
strokeWeight(random(0,3));
rect(posX, posY, width, height);
//LAZOR(new PVector(posX, posY), new PVector(posX+width, posY));
//LAZOR(new PVector(posX+width, posY), new PVector(posX+width, posY+height));
//LAZOR(new PVector(posX+width, posY+height), new PVector(posX, posY+height));
//LAZOR(new PVector(posX, posY+height), new PVector(posX, posY));
}
// boucle d'affichage appellée plusieurs fois par seconde (~60)
void draw() {
println(frameRate);
// afficher l'image de fond
image(backgroundImage, 0, 0, displayWidth, displayHeight);
// afficher le titre si le scoreboard est masqué
// if (!Scoreboard.display)
image(titleImage, 0, 0, displayWidth, displayHeight);
// afficher le scoreboard
Scoreboard.draw();
// mettre à jour les équipes
for (int i = 0 ; i < equipes.length; i++) {
equipes[i].update();
}
// recharger les scores depuis le fichier csv
if (millis() > timer + 2000) {
Scoreboard.reloadFromDisk();
timer = millis();
}
// si on est pas en mode édition, arrêter là
if (!EDITING) return;
// afficher les positions à éditer
for (int i = 0 ; i < positions.length; i++) {
positions[i].draw();
}
}