Hola amigos, estoy intentando crear mi primer applet. He visto ya algunos ejemplos, y conozco Java por lo que mas o menos entiendo su funcionamiento. El tema es que con lo que sé creo que el applet que he creado debería funcionar, pero a la hora del pintado o repitando las imagenes no se actualizan bien, o no las coloca a su debido tiempo, exactamente no sé cual es el verdadero problema. Aquí os dejo el código para ver si me pueden echar una mano:
[Codigo Java]
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.util.Random;
/* Aquí tenemos las constantes */
interface Constantes{
final int MAXTABLERO=8;
final int MAXROBOTS=2;
final int MAXPIEDRAS=1;
final int MAXTIEMPOENTRE=10;
final int MAXTIEMPOROBOT=5;
final int posicionX[]={0,80,160,240,320,400,480,560,640,720};
final int posicionY[]={0,60,120,180,240,300,360,420,480,540};
}
class Robot extends Thread implements Constantes, Runnable{
private int[] posicion; /* Posición en el tablero */
private Monitor m;
private int[] movimiento; /* Movimiento a realizar */
private boolean piedra; /* Si hay piedra */
private Random r;
Thread t;
public Robot(Monitor monitor){
m=monitor;
r=new Random();
posicion=new int[2];
movimiento=new int[2];
movimiento[0]=0;
movimiento[1]=1;
piedra=false;
t=new Thread(this);
}
public void comienza(){
t.start();
}
public void run(){
/* Los robots entran en el espacio para ellos y cada cierto tiempo
* intentan moverse */
posicion=m.entrar();
while(true){
try{ sleep(1000*MAXTIEMPOROBOT); }
catch(Exception e){}
piedra=m.andar(posicion,movimiento,piedra);
}
}
}
class Monitor implements Constantes{
private String[][] mapa;
private int x;
private int y;
private Random r;
private Robots robots;
public Monitor(int _x,int _y, Robots robots){
this.robots=robots;
int numPiedras;
int numCortado;
x=_x+2; /* Porque luego añadimos bordes */
y=_y+2;
mapa=new String[x][y];
r=new Random();
numPiedras=1+Math.abs(r.nextInt()%MAXPIEDRAS);
numCortado=1+Math.abs(r.nextInt()%(((x-2)*(y-2)-numPiedras-MAXROBOTS)/4));
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
mapa[i][j]=" ";
}
}
/* Ponemos las barreras */
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
if(i==0 || i==x-1) mapa[i][j]="#";
if(j==0 || j==y-1) mapa[i][j]="#";
}
}
/* Ponemos las piedras */
for(int i=0;i<numPiedras;i++){
int a=0;
int b=0;
while(!mapa[a][b].equals(" ")){
a=Math.abs(r.nextInt()%x);
b=Math.abs(r.nextInt()%y);
}
mapa[a][b]=".";
}
/* Ponemos las paredes */
for(int i=0;i<numCortado;i++){
int a=0;
int b=0;
while(!mapa[a][b].equals(" ")){
a=Math.abs(r.nextInt()%x);
b=Math.abs(r.nextInt()%y);
}
mapa[a][b]="#";
}
}
public String[][] getMapa(){ return mapa; }
/* Buscamos un sitio donde puedan entrar */
public synchronized int[] entrar(){
int[] dev=new int[2];
int i=0;
int j=0;
while(!mapa[i][j].equals(" ")){
i=Math.abs(r.nextInt()%x);
j=Math.abs(r.nextInt()%y);
dev[0]=i;
dev[1]=j;
}
mapa[i][j]="R";
//robots.repaint();
return dev;
}
/* Determinamos si puede moverse a una posición dada */
public boolean puedeMoverse(int[] p){
if((mapa[p[0]+1][p[1]].equals("R") || mapa[p[0]+1][p[1]].equals("#")) &&
(mapa[p[0]-1][p[1]].equals("R") || mapa[p[0]-1][p[1]].equals("#")) &&
(mapa[p[0]][p[1]+1].equals("R") || mapa[p[0]][p[1]+1].equals("#")) &&
(mapa[p[0]][p[1]-1].equals("R") || mapa[p[0]][p[1]-1].equals("#")))
return false;
else return true;
}
/* Intentará andar */
public synchronized boolean andar(int[] posicion, int[] movimiento, boolean piedra){
boolean p=piedra;
boolean terminado=false;
boolean vaciar=true;
while(!terminado){
if(!puedeMoverse(posicion)) try{wait();}catch(Exception e){}
if(mapa[posicion[0]+movimiento[0]][posicion[1]+movimiento[1]].equals(" ")){
if(vaciar) mapa[posicion[0]][posicion[1]]=" ";
posicion[0]+=movimiento[0];
posicion[1]+=movimiento[1];
mapa[posicion[0]][posicion[1]]="R";
vaciar=true;
terminado=true;
}
else if(mapa[posicion[0]+movimiento[0]][posicion[1]+movimiento[1]].equals("#")){
if(piedra){
p=false;
mapa[posicion[0]][posicion[1]]=".";
vaciar=false;
}
girar(movimiento);
terminado=false;
}
else if(mapa[posicion[0]+movimiento[0]][posicion[1]+movimiento[1]].equals("R")){
try{wait();}catch(Exception e){}
girar(movimiento);
terminado=false;
}
else if(mapa[posicion[0]+movimiento[0]][posicion[1]+movimiento[1]].equals(".")){
if(vaciar) mapa[posicion[0]][posicion[1]]=" ";
posicion[0]+=movimiento[0];
posicion[1]+=movimiento[1];
mapa[posicion[0]][posicion[1]]="R";
terminado=true;
p=true;
vaciar=true;
}
//robots.repaint();
}
notifyAll();
return p;
}
/* Siempre giran a la derecha */
private void girar(int[] m){
if(m[0]==1){
m[0]=0;
m[1]=-1;
}
else{
if(m[0]==-1){
m[0]=0;
m[1]=1;
}
else{
if(m[1]==1){
m[1]=0;
m[0]=1;
}
else{
if(m[1]==-1){
m[1]=0;
m[0]=-1;
}
}
}
}
}
}
public class Robots extends Applet implements Constantes, Runnable{
private Robot [] robots;
Image [] img= new Image[4] ;
//private Button startButton;
private String [][] aux= new String[MAXTABLERO][MAXTABLERO];
private Monitor m;
Thread t;
public void init() {
t= new Thread(this);
t.start();
m=new Monitor(MAXTABLERO,MAXTABLERO,this);
robots=new Robot[MAXROBOTS];
/*setBackground(Color.black);
Button startButton = new Button("COMENZAR");
add(startButton);
startButton.addActionListener(this);*/
IniciarImagenes();
for(int i=0;i<robots.length;i++){
robots[i]=new Robot(m);
}
for(int i=0;i<robots.length;i++){
robots[i].comienza();
}
}
public void IniciarImagenes() {
img[0] = getImage(getDocumentBase(), "Robot.jpg");
img[1] = getImage(getDocumentBase(), "Muro.jpg");
img[2] = getImage(getDocumentBase(), "Piedra.jpg");
img[3] = getImage(getDocumentBase(), "Vacio.jpg");
}
/* Este metodo pinta todo */
public void paint(Graphics g) {
aux=m.getMapa();
for(int i=0;i<MAXTABLERO+2; i++){
for(int j=0; j<MAXTABLERO+2; j++){
if(aux[i][j]=="R") g.drawImage(img[0],posicionX[i],posicionY[j],80,60,this);
else if(aux[i][j]=="#") g.drawImage(img[1],posicionX[j],posicionY[i],80,60,this);
else if(aux[i][j]==".") g.drawImage(img[2],posicionX[j],posicionY[i],80,60,this);
else if(aux[i][j]==" ") g.drawImage(img[3],posicionX[j],posicionY[i],80,60,this);
}
}
}
public void run(){
while(true){
try{
repaint();
Thread.sleep(900);
}catch(Exception e){}
}
}
/* Metodo que se ejecuta al pulsar el boton
public void actionPerformed(ActionEvent e){
empezar();
}
Simulacion
public void empezar(){
for(int i=0;i<robots.length;i++){
robots[i].comienza();
}
}*/
//public void update(){}
}