Snake in Processing
Posted by IsaMetallo on 27-05-2009 18:32
ciao a tutti... per smanettare un pò oggi mi sono messo ad implementare una versione semplice di snake (famoso gioco per cellulari) nella sua prima versione (quella cioè in cui si perdeva anche se si toccava il muro)...
sono ancora ad uno stadio iniziale, sto ancora lavorando sul movimento... ma la cosa stranissima è che solo le prime due parti del corpo del serpente si muovono correttamente, mentre le altre rimangono ferme, e non riesco a capire il perchè... se qualcuno mi dà una mano mi farebbe piacere...

SNAKEGAME
code:
Snake snake; int rate=1; int bodySize=20; //grandezza del corpo del serpente PVector direction=new PVector(0,bodySize); //direzione iniziale verso il basso (scelta a caso) static boolean running=true; //la variabile booleana fa vedere se il gioco è in corso o menp void setup(){ size(600,600); snake=new Snake(bodySize); frameRate(rate); smooth(); } void draw(){ if (running){ //il gioco in corso disegna il primo sfondo e fa muovere il serpente, il resto sarà gestito a parte background(loadImage("back.jpg")); snake.move(direction); } else //se no viene disegnata la schermata di perdita { background(loadImage("nelson.jpg")); textFont(loadFont("Arial-Black-48.vlw") , 40); fill(255); text("You Lose!",width-275,200); textFont(loadFont("Arial-Black-48.vlw"),20); text("Press n",width-200,height-100); text("for a new game", width-200,height-70); } } void keyPressed(){ //cambia direzione al serpente if (keyCode==UP) direction.set(0,-bodySize,0); if (keyCode==DOWN) direction.set(0,bodySize,0); if (keyCode==LEFT) direction.set(-bodySize,0,0); if (keyCode==RIGHT) direction.set(bodySize,0,0); if (key=='n') newGame(); } static void gameFinished(){ //se invocato ferma il gioco running=false; } void newGame(){ //ripristina lo stato iniziale snake=new Snake(bodySize); running=true; direction=new PVector(0,bodySize); }


SNAKE
code:
class Snake{ ArrayList snakeBody=new ArrayList(); Snake(int bodySize){ //crea un serpente con 5 pezzi int scala=0; for (int i=0; i<5; i++){ snakeBody.add(new SnakeBodyPart(new PVector(300-scala,10),bodySize)); scala+=bodySize; } } void move(PVector direction){ //la direzione influisce solo sul movimento della testa SnakeBodyPart head=(SnakeBodyPart)snakeBody.get(0); head.move(direction); head.display(); //il resto viene fatto in modo che un pezzo successivo prenda il posto del pezzo precedente int count=1; while(count<snakeBody.size()){ SnakeBodyPart part=(SnakeBodyPart)snakeBody.get(count); SnakeBodyPart previous=(SnakeBodyPart)snakeBody.get(count-1); part.setNewPos(previous.getOldPos()); part.display(); count=count+1; } } }


SNAKEBODYPART
code:
class SnakeBodyPart{ PVector pos,oldPos; int bodySize; float scala; SnakeBodyPart(PVector pos,int bodySize){ this.pos=pos.get(); this.oldPos=pos.get(); this.bodySize=bodySize; this.scala=bodySize/2; } void display(){ //disegna un rettangolo il cui centro viene letto dal vettore posizione rectMode(CENTER); fill(0,255,0); rect(pos.x,pos.y,bodySize,bodySize); } PVector getOldPos(){ return oldPos.get(); } PVector getPos(){ return pos.get(); } void setNewPos(PVector newPos){ pos.set(newPos.get()); } void move(PVector direction){ oldPos=pos.get(); pos.add(direction); //se la posizione esce dalla finestra si perde if (((pos.x-scala<0)||(pos.x+scala>width)) || ((pos.y-scala/2<0)||(pos.y+scala/2>height))) SnakeGame.gameFinished(); } }

Powered by: vbHome (lite) v3.8 and vBulletin v2.3.1
Copyright © 2000 - 2002 Jelsoft Enterprises Limited