I made a simple tile game in 2 in two dimensions and it works well (even if you have suggestions for the optimization are well accepted), but when I tried to render it in three dimensions the coordinates of the cubes are wrong, looking on the forum I don’t have found solutions, suggestions?
sorry for the english provided by gooogle!
*******************main program *******************
import processing.video.*;
Capture video;
PImage immagine ;
PImage immaginebk;
float velocita=.1;
int righe=9;
int colonne=9;
int rigaVuota=int(random(0, righe));
int colonnaVuota=int(random(0, colonne));
int mattonellaVuota=(rigaVuota*colonnaVuota );
int mattonelladamuovere;
float passoW;
float passoH;
mattonella arraymatonelle[] =new mattonella[righe*colonne];
boolean finito=true;
boolean sceglinuova=true;
boolean trovatovuoto=true;
PVector cordinatevuoto;
PVector codinatemuovi;
PVector codinatetemp;
////////////////////////////////////////
void setup() {
// size(900, 600, P2D );
fullScreen( P2D);
passoW=width/righe;
passoH=height/colonne;
cordinatevuoto= new PVector();
codinatemuovi= new PVector();
immaginebk = createImage(width, height, RGB);
immagine = createImage(640, 480, RGB);
video = new Capture(this, 640, 480);
video.start();
int a=0;
for (int c = 0; c <colonne; c++) {
for (int r = 0; r <righe; r++) {
arraymatonelle[a] =new mattonella();
arraymatonelle[a].crea(r, c, (a==(mattonellaVuota)), a);
a++;
}
}
}
void draw() {
//background(0);
video.read();
video.loadPixels();
immagine=video;
video.loadPixels();
immagine.updatePixels();
immaginebk.copy(immagine, 0, 0, 640, 480, 0, 0, width, height);
immaginebk.updatePixels();
if (video.available()) {
{
background(0);
int a=-1;
for (int c = 0; c <colonne; c++) {
for (int r = 0; r <righe; r++)
{
a++;
arraymatonelle[a].disegna();
if (( arraymatonelle[a].update()==true)&&(trovatovuoto==true ))
{
trovatovuoto=false;
cordinatevuoto=arraymatonelle[a].returnCordinate();
mattonellaVuota=a;
codinatemuovi=sceglimuovi(cordinatevuoto);
}
if ((sceglinuova==true)&&(trovatovuoto==false )) {
codinatetemp=arraymatonelle[a].returnCordinate();
if ((codinatetemp.x==codinatemuovi.x)&&(codinatetemp.y==codinatemuovi.y))
{
sceglinuova=false;
mattonelladamuovere=a;
}
}
if ((sceglinuova==false)&&(trovatovuoto==false))
{
finito=false;
finito= arraymatonelle[mattonelladamuovere].muovi(cordinatevuoto);
if (finito) {
arraymatonelle[mattonellaVuota].muoviVuoto(codinatemuovi);
arraymatonelle[mattonellaVuota].disegna();
arraymatonelle[mattonelladamuovere].disegna();
arraymatonelle[mattonelladamuovere].updateCordinate();
arraymatonelle[mattonellaVuota].updateCordinate();
trovatovuoto=true;
sceglinuova=true;
} else {
arraymatonelle[mattonelladamuovere].disegna();
}
}
}
}
}
}
}
the 2d titles:
class mattonella {
//////////////////////// Dati
int numero;
boolean vuoto;
PImage img ;
PVector cordinateFoto = new PVector();
PVector Rigaecolonna = new PVector();
PVector cordinate = new PVector();
PVector cordinatecopia = new PVector();
/////////////////////////////////costrutore
mattonella() {
img = createImage(width/ righe, height/ colonne, RGB);
}
///////////////////////////////////////////////////////////////////////////////////////
void crea(int r, int c, boolean sevuoto,int a) {
numero=a;
Rigaecolonna.set(r, c);
img = createImage(width/ righe, height/ colonne, RGB);
cordinateFoto.set( Rigaecolonna.x*img.width, Rigaecolonna.y*img.height);
cordinate.set( Rigaecolonna.x*img.width, Rigaecolonna.y*img.height);
cordinatecopia.set( Rigaecolonna.x*img.width, Rigaecolonna.y*img.height);
vuoto=sevuoto;
}
/////////////////////////////////////////////////////
void disegna() {
image(img, cordinate.x, cordinate.y);
}
///////////////////////////////////////////////////////////
boolean update() {
immaginebk.loadPixels();
img.loadPixels();
if (vuoto==false) {
img.copy(immaginebk, int( cordinateFoto.x), int ( cordinateFoto.y), img.width, img.height, 0, 0, img.width, img.height);
img.updatePixels();
} else {
for (int i=0; i<img.pixels.length; i++) {
img .pixels[i] = color(255, 0, 0);
}
}
img.updatePixels();
return vuoto;
}
//////////////////////////////////////////////////////////////
boolean muovi (PVector destistanazione) {
PVector dest= new PVector() ;
dest=destistanazione.copy();
if ((abs(dest.y-cordinate.y)<=velocita)&&
(abs(cordinate.x-dest.x))<=velocita )
{
cordinate=dest.copy();
return true;
}else{
if (dest.x>cordinate.x)
{
cordinate.add(+velocita,0);
}
else
{
cordinate.add(-velocita,0);
}
if (dest.y>cordinate.y)
{
cordinate.add(0,+velocita);
}
else
{
cordinate.add(0,-velocita);
}
return false;
}
}
////////////////////////////////////////////////////////////
PVector returnCordinate() {
return cordinatecopia;
}
////////////////////////////////////////////////////
void updateCordinate() {
cordinatecopia=cordinate.copy();
}
/////////////////////////////////////////////////////
void muoviVuoto (PVector dest) {
PVector fine= new PVector() ;
fine=dest.copy();
cordinate= fine.copy();
}
}
the 3d title:
class cubo {
//////////////////////// Dati
int numero;
PShape cubo;
PShape lato1;
PShape lato2;
PShape lato3;
PShape lato4;
PShape lato5;
PShape lato6;
boolean vuoto;
PImage img ;
PImage img2 ;
PVector cordinateFoto = new PVector();
PVector Rigaecolonna = new PVector();
PVector cordinate = new PVector();
PVector cordinatecopia = new PVector();
PVector lati = new PVector();
/////////////////////////////////costrutore
cubo() {
img = createImage(width/ righe, height/ colonne, RGB);
img2 = createImage(width/ righe, height/ colonne, RGB);
for (int i = 0; i < img2.pixels.length; i++) {
img2.pixels[i] = color(255*(int(random(0, 2))), 255*(int(random(0, 2))), 255*(int(random(0, 2))));
}
}
///////////////////////////////////////////////////////////////////////////////////////
void crea(int r, int c, boolean sevuoto, int a) {
cubo=createShape(GROUP);
lato1=createShape();
lato2=createShape();
lato3=createShape();
lato4=createShape();
lato5=createShape();
lato6=createShape();
numero=a;
Rigaecolonna.set(r, c);
cordinateFoto.set( Rigaecolonna.x*img.width, Rigaecolonna.y*img.height, 0);
cordinate.set (Rigaecolonna.x*img.width, Rigaecolonna.y*img.height, 0);
println(cordinate.x,cordinate.y,cordinate.z);
cordinatecopia.set( Rigaecolonna.x*img.width, Rigaecolonna.y*img.height, 0);
lati.set(cordinate.x+img.width,cordinate.y+img.height,-50);
println(lati.x,lati.y,lati.z+"l");
vuoto=sevuoto;
lato1.beginShape();/////////////////////////////////davanti
lato1.texture(img);
lato1.textureMode(NORMAL);
lato1.vertex(cordinate.x,cordinate.y, cordinate.z, 0, 0);
lato1.vertex(lati.x, cordinate.y, cordinate.z, 1, 0);
lato1.vertex(lati.x, lati.y, cordinate.z, 1, 1);
lato1.vertex(cordinate.x,lati.y, cordinate.z, 0, 1);
lato1.endShape();////////////////////////////////////////
lato2.beginShape();/////////////////////////////////dietro
lato2.texture(img2);
lato2.textureMode(NORMAL);
lato2.vertex(lati.x, cordinate.y, lati.z, 0, 0);
lato2.vertex(cordinate.x,cordinate.y, lati.z, 1, 0);
lato2.vertex(cordinate.x,lati.y, lati.z, 1, 1);
lato2.vertex(lati.x, lati.y, lati.z, 0, 1);
lato2.endShape();//////////////////////////////////////////////
lato3.beginShape();//////////////////////////////////////sotto
lato3.texture(img2);
lato3.textureMode(NORMAL);
lato3.vertex(cordinate.x,lati.y, lati.z, 0, 0);
lato3.vertex(lati.x, lati.y, lati.z, 1, 0);
lato3.vertex(lati.x, lati.y, cordinate.z, 1, 1);
lato3.vertex(cordinate.x,lati.y, cordinate.z, 0, 1);
lato3.endShape();///////////////////////////////////////////////
lato4.beginShape();////////////////////////////////////sopra
lato4.texture(img2);
lato4.textureMode(NORMAL);
lato4.vertex(cordinate.x,cordinate.y, cordinate.z, 0, 0);
lato4.vertex(lati.x, cordinate.y, cordinate.z, 1, 0);
lato4.vertex(lati.x, cordinate.y, lati.z, 1, 1);
lato4.vertex(cordinate.x,cordinate.y, lati.z, 0, 1);
lato4.endShape();//////////////////////////////////////////////////
lato5.beginShape();///////////////////////////////////////////////dx
lato5.texture(img2);
lato5.textureMode(NORMAL);
lato5.vertex(lati.x, cordinate.y, lati.z, 0, 0);
lato5.vertex(lati.x, cordinate.y, cordinate.z, 1, 0);
lato5.vertex(lati.x, lati.y, cordinate.z, 1, 1);
lato5.vertex(lati.x, lati.y, lati.z, 0, 1);
lato5.endShape();///////////////////////////////////////////////////
lato6.beginShape();////////////////////////////////////////////sx
lato6.texture(img2);
lato6.textureMode(NORMAL);
lato6.vertex(cordinate.x, cordinate.y, cordinate.z, 0, 0);
lato6.vertex(cordinate.x, cordinate.y, lati.z, 1, 0);
lato6.vertex(cordinate.x, lati.y, lati.z, 1, 1);
lato6.vertex(cordinate.x, lati.y, cordinate.z, 0, 1);
lato6.endShape();////////////////////////////////////////////////
cubo.addChild(lato1);
cubo.addChild(lato2);
cubo.addChild(lato3);
cubo.addChild(lato4);
cubo.addChild(lato5);
cubo.addChild(lato6);
}
/////////////////////////////////////////////////////
void disegna() {
// shape(cubo,screenX(cordinate.x,cordinate.y),screenY(cordinate.x,cordinate.y) );
shape(cubo,cordinate.x,cordinate.y);
}
///////////////////////////////////////////////////////////
boolean update() {
immaginebk.loadPixels();
img.loadPixels();
if (vuoto==false) {
img.copy(immaginebk, int( cordinateFoto.x), int ( cordinateFoto.y), img.width, img.height, 0, 0, img.width, img.height);
img.updatePixels();
} else {
//img.copy(immaginebk, int( cordinateFoto.x), int ( cordinateFoto.y), img.width, img.height, 0, 0, img.width, img.height);
//img.updatePixels();
// scale(zoom);
}
img.updatePixels();
return vuoto;
}
//////////////////////////////////////////////////////////////
boolean muovi (PVector destistanazione) {
PVector dest= new PVector() ;
dest=destistanazione.copy();
if ((abs(dest.y-cordinate.y)<=1)&&
(abs(cordinate.x-dest.x))<=1 )
{
return true;
}
if (dest.x>cordinate.x)
{
cordinate.add(+velocita, 0);
} else
{
cordinate.add(-velocita, 0);
}
if (dest.y>cordinate.y)
{
cordinate.add(0, +velocita);
} else
{
cordinate.add(0, -velocita);
}
return false;
}
////////////////////////////////////////////////////////////
PVector returnCordinate() {
return cordinatecopia;
}
////////////////////////////////////////////////////
void updateCordinate() {
cordinatecopia=cordinate.copy();
}
/////////////////////////////////////////////////////
void muoviVuoto (PVector dest) {
PVector fine= new PVector() ;
fine=dest.copy();
cordinate= fine.copy();
}
}
the subrutines that chooses which tile to move:
Vector sceglimuovi(PVector cordinate )
{
int caso;
PVector ctemp = new PVector();
ctemp=cordinate.copy();
caso=int(random(0, 4));
switch(caso) {
case 0:
if (cordinate.x==0) {
ctemp.add(+passoW, 0);
} else {
ctemp.add(-passoW, 0);
}
break;
case 1:
if (cordinate.x==(righe-1)*passoW)
{
ctemp.add(-passoW, 0);
} else {
ctemp.add(+passoW, 0);
}
break;
case 2:
if (cordinate.y==0) {
ctemp.add(0, +passoH);
} else {
ctemp.add(0, -passoH);
}
break;
case 3:
if (cordinate.y==(colonne-1)*passoH) {
ctemp.add(0, -passoH);
} else {
ctemp.add(0, +passoH);
}
break;
}
return ctemp;
}
obviously the various prints are for debugging and also the tile that turns red has that purpose,
in the 3d version the tiles are spaced and I can’t understand why, as already said by newbie I also accept suggestions, thanks!
obviously the 2d or 3d tiles are usable one at a time!