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.

266 lines
7.0 KiB

PImage backgroundImage;
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=true;
// chargement du scoreboard ou génération du scoreboard vide
Scoreboard = new Scoreboard();
positionTable = loadTable("data/positionTable.csv", "header");
quicksandFont = loadFont("Quicksand-Bold-40.vlw");
backgroundImage = loadImage("backgroundImage.jpg");
// 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();
}
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
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;
}
}
}
}
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) {
// activation de l'état survolé
p.hoverStart();
if (distEquipe<=threshold && distPion>threshold) {
p.lazored = true;
}
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;
}
}
}
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();
}
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;
}
}
}
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;
}
}
}
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();
}
}
}
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
int radius = p.radius + event.getCount()*-5;
// si la souris est sous le seuil de collision
if (distEquipe<=threshold && radius>20 && radius<120) {
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;
}
boolean fileExists(String filename) {
File f = dataFile(filename);
return f.isFile();
}
void draw() {
image(backgroundImage, 0, 0, displayWidth, displayHeight);
for (int i = 0 ; i < equipes.length; i++) {
equipes[i].update();
}
if (millis() > timer + 2000) {
Scoreboard.reloadFromDisk();
timer = millis();
}
Scoreboard.draw();
if (!EDITING) return;
for (int i = 0 ; i < positions.length; i++) {
positions[i].draw();
}
}