elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Problemas con Thread - Graphics
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con Thread - Graphics  (Leído 1,589 veces)
S_Code

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Problemas con Thread - Graphics
« en: 5 Enero 2016, 12:12 pm »

Buenos días a tod@!

Me presento, soy estudiante de un FP de informática y tengo que realizar una "copia" lo más parecida a esta versión de Asteroid: http://www.juegomaniac.com/jugar.php?id=51&ancho=740&alto=510

A base de manuales y explicaciones he conseguido ir haciendo poco a poco. El problema es que tengo algunos problemas y no consigo solucionar por más pruebas que realizo. Hay parte de código desactivada porque al quitar el funcionamiento del Thread, funciona.

Aquí os expongo una explicación de uno de los problemas que tengo. Gracias de antemano por molestarse en el leer el post.

Los thread de Asteroid, Disparo y Enemigo:

- Con el Asteroid el problema que tengo es cuando disparo a uno de ellos a la hora de dividirse se queda parado, entiendo que es porque esos nuevos asteroides creados no se ponen en marcha, pero he intentado todas las formas que he creído que deberían de funcionar para que funcionen, pero algo hago mal. Y además en ocasiones no detectan las colisiones. Esta puesto en start porque en el método de Acciones, no funcionaba.

- Con el de Enemigo, el problema es que no detecta las colisiones al poner el Thread, sin él, funciona correctamente. Esta puesto en el método de acciones porque en start no funcionaba.

- El disparo, directamente no funciona, se muestra el disparo, y ya esta, no se mueve.

Os pongo todo el código para que entendáis como lo tengo a ver si alguien sabe dónde esta el fallo.

EspacioFrame - Arranca el juego

Código
  1. package asteroides;
  2.  
  3. //Importamos las librerias necesarias
  4. import java.awt.BorderLayout;
  5. import javax.swing.JFrame;
  6.  
  7. /**
  8.  * Clase del juego que contiene Jframe con la parte del Canvas y se inicia el juego
  9.  */
  10.  
  11. public class EspacioFrame extends JFrame {
  12.    public EspacioFrame() {
  13.        //Iniciamos un espacio que contiene el canvas
  14.        EspacioCanvas jc = new EspacioCanvas ();
  15.        //Lo añadimos
  16.        this.add(jc, BorderLayout.CENTER);
  17.        //Le damos el tamaño que tiene
  18.        this.setSize((int)jc.ancho, (int)jc.alto);
  19.        //Le decimos como debe cerrarse
  20.        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21.        //Centramos la ventana
  22.        this.setLocationRelativeTo(null);
  23.        //Le ponemos un titulo a la ventana
  24.        this.setTitle("Asteroid by Sandra Ibañez");  
  25.        //Lo hacemos visible
  26.        this. setVisible (true);
  27.        //Creamos dos bufferstrategy para el paint
  28.        jc.createBufferStrategy(2);
  29.        //Iniciamos el juego que conriene el canvas
  30.        jc.start();
  31.    }
  32.  
  33.    public static void main(String[] args) {
  34.        //Iniciamos el juego
  35.        EspacioFrame j1 = new EspacioFrame();  
  36.        j1.repaint();
  37.    }
  38. }

EspacioCanvas: Parte gráfica del juego y acciones del juego

Código
  1. package asteroides;
  2.  
  3. //Importamos librerias
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import java.awt.geom.Point2D;
  7. import java.awt.image.BufferStrategy;
  8. import java.util.ArrayList;
  9. import javax.swing.JOptionPane;
  10.  
  11. /**
  12.  * Clase del juego que contiene el canvas, y keylistener para las teclas del teclado
  13.  * OBJETIVO; Copiar la versión del juego Asteroid: http://www.juegomaniac.com/jugar.php?id=51&ancho=740&alto=510
  14.  * ESPACIO: DISPARA
  15.  * ARRIBA: ACELERA
  16.  * IRQUIERDA: GIRA IRQUIERDA
  17.  * DERECHA: GIRA DERECHA
  18.  * SHIFT: DESAPARECE DE LA POSICIÓN Y APARECE EN OTRA POSICIÓN ALEATORIA
  19.  */
  20. public class EspacioCanvas extends Canvas implements KeyListener, Runnable {
  21.    //Tamaño de la ventana del juego
  22.    double ancho;
  23.    double alto;
  24.    //Variables de tiempo
  25.    long refrescar;
  26.    long inicio;
  27.    long fin;
  28.    //Variables de jugador
  29.    int vidas;
  30.    long puntos;
  31.    String nombre;
  32.    //Nave
  33.    Nave nave;
  34.    //Booleans para saber si hay colisión
  35.    boolean colisionNave;
  36.    //ArrayList de disparos
  37.    ArrayList<Disparo> disparos;
  38.    //Variables del disparo
  39.    final double tiempoDisparo = 10;
  40.    double tiempoFinalDisparo;
  41.    //ArrayList de los asteroid
  42.    ArrayList <Asteroid> asteroides;
  43.    //Número de asteroides con los que se inicia el juego
  44.    int numeroAsteroides = 4;
  45.    //ArrayList de asteroides eliminados
  46.    ArrayList<Asteroid> asteroidEliminado;
  47.    ArrayList<Enemigo> ovni;
  48.    //Threads para arranque (tiempo para iniciar), espera (tiempo para actualizar), naveFuera (tiempo que la nave desaparece, cuando choca o se mueve a otro sitio)
  49.    Thread arranque;
  50.    Thread espera;
  51.    //Dimension de la ventana
  52.    Dimension dim;
  53.    //Booleans para el paint, y mostrar nave o no (por colisión)
  54.    boolean repintar = false;
  55.    boolean mostrarNave = false;
  56.    boolean ovn = false;
  57.    int contador;
  58.    int vidaOvni = 1;
  59.    long contSalirOvni;
  60.    /**
  61.      * Constructor de la clase.
  62.      */
  63.    public EspacioCanvas () {
  64.        //Configuraciones de la ventana
  65.        setIgnoreRepaint (false);
  66.        resize (740, 510);
  67.        dim = getSize ();
  68.        ancho = dim.width;
  69.        alto = dim.height;
  70.        //Tiempo de actualización
  71.        refrescar = 25;
  72.        //Cogemos las acciones del teclado
  73.        addKeyListener(this);
  74.        setFocusable(true);
  75.        //Creamos una nave nueva en el centro
  76.        nave = new Nave(ancho/2, alto/2, 30, 0.10, 0.5, 0.90);
  77.        //Boolean relacionado con la nave, falsos
  78.        colisionNave = false;
  79.        //Número de vidas
  80.        vidas = 3;
  81.        //Declaramos los arrayList
  82.        asteroides = new ArrayList<Asteroid>();
  83.        asteroidEliminado = new ArrayList <Asteroid>();
  84.        disparos = new ArrayList<Disparo>();
  85.        ovni = new ArrayList <Enemigo>();
  86.    }
  87.    /**
  88.      * Get de las vidas de la nave - jugador
  89.      * @return
  90.      */
  91.    public int getVidas() {
  92.        return vidas;
  93.    }
  94.    /**
  95.      * Método de dibujar, mediante bufferstrategy se guardan los elementos y se van actualizando según las acciones
  96.      * @param g
  97.      */
  98.    @Override
  99.    public void paint (Graphics g) {
  100.        //Si el boolean es cierto, sigue
  101.        if (repintar)
  102.            return;
  103.        repintar = true;
  104.        //Creamos una dimensión nueva con la anterior
  105.        Dimension dNueva = dim;
  106.        dNueva = getSize();
  107.        //Cogemos el bufferstrategy
  108.        BufferStrategy buffer = getBufferStrategy();
  109.        //Le pasamos al graphics el dibujo
  110.        Graphics imagen = buffer.getDrawGraphics();
  111.        //Y la clase le pasamos el resultado
  112.        super.paint(imagen);
  113.        Graphics2D g2d = (Graphics2D) imagen;
  114.        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  115.        //Le ponemos fondo negro
  116.        setBackground(Color.BLACK);
  117.        //Pinta relleno de todo el juego
  118.        g2d.fillRect(0, 0, (int) ancho, (int) alto);
  119.        //Cogemos el color blanco
  120.        g2d.setColor(Color.WHITE);
  121.        //Dibujamos un string dónde se muestra la puntuación
  122.        g2d.drawString(""+puntos, 30, 30);
  123.        //Recorremos el array de los asteroides y los pintamos
  124.        for (int cont = 0; cont < asteroides.size(); cont ++) {
  125.            asteroides.get(cont).pintar(g2d);
  126.        }
  127.        //Recorremos el array de los asteroides eliminados, cuando son disparados
  128.        for (int cont = 0; cont < asteroidEliminado.size() ; cont ++) {
  129.            asteroidEliminado.get(cont).pintarExplosion(g2d);
  130.        }
  131.        //Pintamos disparos cuando se realizan
  132.        for (int cont = 0; cont < disparos.size(); cont ++) {
  133.            disparos.get(cont).pintar(g2d);
  134.        }
  135.        //Si se debe mostrar el ovni, se muestra
  136.        if (ovn) {
  137.            for (int cont = 0; cont < ovni.size(); cont ++) {
  138.                ovni.get(cont).pintar(g2d);
  139.            }
  140.        }
  141.        //Si el boolean de mostrar la nave esta activado, la dibujamos
  142.        if (mostrarNave) {
  143.            nave.pintar(g2d);
  144.        }
  145.        //Si la nave ha chocado
  146.        while (colisionNave) {
  147.            colocarNave();
  148.        }
  149.        //Posición
  150.        g2d.translate(40, 45);
  151.        //Tamaño
  152.        g2d.scale(0.50, 0.50);
  153.        //Recorremos las vidas
  154.        for (int cont = 0; cont < this.getVidas(); cont ++) {
  155.            //Mostramos los dibujos en pequeño de la nave para las vidas
  156.            g2d.setColor(Color.white);
  157.            int [] posicionInicialHorizontal = {-8, 0, -6, 6, 8, 0};
  158.            int [] posicionInicialVertical = {10, -10, 6, 6, 10, -10};
  159.            g2d.drawPolygon(posicionInicialHorizontal, posicionInicialVertical, posicionInicialHorizontal.length);
  160.            g2d.translate(30, 0);
  161.        }
  162.        //Si graphics es diferentre de null
  163.        if (imagen != null) {
  164.            imagen.dispose();
  165.        }
  166.        //Cerramos el buffer
  167.        buffer.show();
  168.        Toolkit.getDefaultToolkit().sync();
  169.        //False el repintar
  170.        repintar = false;
  171.    }
  172.    @Override
  173.    public void update (Graphics g) {
  174.        paint(g);
  175.    }
  176.  
  177.    public void colocarNave () {
  178.        //Restamos vidas
  179.        vidas--;
  180.        //Colocamos la nave al centro
  181.        nave.setHorizontal(ancho / 2);
  182.        nave.setVertical(alto / 2);
  183.        //Volvemos a mostrar la nave
  184.        mostrarNave = true;
  185.        colisionNave = false;
  186.    }
  187.    @Override
  188.    public void keyTyped(KeyEvent e) {}
  189.    /**
  190.      * Método que para cuando se pulsan las teclas
  191.      * @param e
  192.      */
  193.    @Override
  194.    public void keyPressed(KeyEvent e) {
  195.        //Cogemos el código de la tecla presionada para saber que acción hace
  196.        int tecla = e.getKeyCode();
  197.        //Si la tecla es el espacio, dispara
  198.        if (tecla == KeyEvent.VK_SPACE) {
  199.            nave.disparo = true;
  200.            if (tiempoFinalDisparo <= 0) {
  201.                disparos.add(nave.disparo());
  202.                tiempoFinalDisparo = tiempoDisparo;
  203.            }
  204.        }
  205.        //Si la tecla es la de arriba, aumenta velocidad
  206.        if (tecla == KeyEvent.VK_UP) {
  207.            nave.acelerador = true;
  208.        }
  209.        //Si es la de derecha, va a la derecha
  210.        if (tecla == KeyEvent.VK_RIGHT) {
  211.            nave.derecha = true;
  212.        }
  213.        //Si es la de la irquierda, va a la irquierda
  214.        if (tecla == KeyEvent.VK_LEFT) {
  215.            nave.irzquierda = true;
  216.        }
  217.        //Si se pulsa la tecla shift, la nave desaparece de donde esta y aparece en otra posición
  218.        if (tecla == KeyEvent.VK_SHIFT) {
  219.            mostrarNave = false;
  220.            double h = (Math.random() * ancho) + 1;
  221.            double v = (Math.random() * alto) + 1;
  222.            nave.setHorizontal(h);
  223.            nave.setVertical(v);
  224.            mostrarNave = true;
  225.        }
  226.    }
  227.    /**
  228.      * Método que se activa cuando las teclas se sueltam
  229.      * @param e
  230.      */
  231.    @Override
  232.    public void keyReleased(KeyEvent e) {
  233.        //Cogemos el código
  234.        int tecla = e.getKeyCode();
  235.        //Y desactivamos la opción de cada tecla
  236.        if (tecla == KeyEvent.VK_SPACE) {
  237.            nave.disparo = false;
  238.        }
  239.        if (tecla == KeyEvent.VK_UP) {
  240.            nave.acelerador = false;
  241.        }
  242.        if (tecla == KeyEvent.VK_RIGHT) {
  243.            nave.derecha = false;
  244.        }
  245.        if (tecla == KeyEvent.VK_LEFT) {
  246.            nave.irzquierda = false;
  247.        }
  248.    }
  249.    /**
  250.      * Método para añadir más asteroides al juego según se van pasando pantallas.
  251.      */
  252.    public synchronized void masAsteroides() {
  253.        //Damos el valor del numero de asteroides
  254.        int numAsteroides = numeroAsteroides;
  255.        //Tamaño del asteroide
  256.        int tamaño;
  257.        //Recorremos hasta encotrar el número de asteorides necesarios, según el nivel
  258.        for (int cont = 0; cont < numeroAsteroides; cont ++) {
  259.            //Escogemos posiciones aleatorias
  260.            double asteroidHorizontal = (Math.random() * ancho) + 1;
  261.            double asteroidVertical = (Math.random() * alto) + 1;
  262.            //Escogemos una velocidad aleatoria de cada posición
  263.            double velocidadHorizontal = Math.random() + 1;
  264.            double velocidadVertical = Math.random() + 1;
  265.            //Escogemos la dirección
  266.            double direccionHorizontal = (Math.random() * 2);
  267.            double direccionVertical =  (Math.random() * 2);
  268.            //Si la dirección es igual a 1
  269.            if (direccionHorizontal == 1) {
  270.                //A la velocidad le damos la vuelta
  271.                velocidadHorizontal *= (-1);
  272.            }  
  273.            if (direccionVertical == 1) {
  274.                velocidadVertical *= (-1);
  275.            }
  276.            tamaño = 2;
  277.            //Añadimos el nuevo asteroide con los datos obtenidos
  278.            Asteroid ast = new Asteroid(asteroidHorizontal, asteroidVertical, 0, .1, velocidadHorizontal, velocidadVertical, tamaño);
  279.            asteroides.add(ast);
  280.            //Restamos el número por poner
  281.            numAsteroides --;
  282.            //Cogemos el centro del asteroide y la nave
  283.            Point2D asteroidCenter = asteroides.get(cont).getCentro();
  284.            Point2D naveCenter = nave.getCentro();
  285.            //Calculamos la distancia
  286.            double distancia = asteroidCenter.distance(naveCenter);
  287.            ///Si la distancia entre el asteroide y la nave es menor de 80, no se crea
  288.            if (distancia <= 80) {
  289.                asteroides.remove(cont);
  290.                cont --;
  291.                numAsteroides ++;
  292.            }
  293.        }
  294.    }
  295.    /**
  296.      * Método que comprueba las acciones y colisiones relacionadas con los Asteroid y el ovni.
  297.      */
  298.    public synchronized void compruebaAccionesColisiones() {
  299.       accionesAsteroid ();
  300.       accionesOvni ();
  301.    }
  302.    /**
  303.      * Método que determina las acciones del asteroid en función de su movimiento y choques
  304.      * COLISIÓN CON LA NAVE
  305.      * COLISIÓN CON LOS DISPAROS DE LA NAVE
  306.      * COLISIÓN CON LOS DISPAROS DEL OVNI.
  307.      */
  308.    public synchronized void accionesAsteroid(){
  309.        //Recorremos los asteroides y los ponemos en movimiento
  310.        for (int contA = 0; contA < asteroides.size(); contA ++) {
  311. //            asteroides.get(contA).start();
  312. //            asteroides.get(contA).mover(ancho, alto);
  313.            try {
  314.                //Comprueba si chocan con la nave
  315.                if (asteroides.get(contA).colisionNave(nave)) {
  316.                    //Los añadimos a los eliminados y explotamos
  317.                    asteroidEliminado.add(asteroides.get(contA).explota());
  318.                    //Los dividimos
  319.                    divisionAsteroides(contA);
  320.                    //si a la nave se le acaban las vidas
  321.                    if (vidas <= 0 && !colisionNave) {
  322.                        colisionNave = true;
  323.                        mostrarNave = false;
  324.                    }
  325.                    //Si aún le quedan vidas
  326.                    if (vidas > 0) {
  327.                        colisionNave = true;
  328.                        mostrarNave = false;
  329.                        nave.setHorizontal(ancho/2);
  330.                        nave.setVertical(alto/2);
  331.                        nave.getRotAngulo();
  332.                    }
  333.                    //Restamos vida a la nave
  334.                    vidas --;
  335.                }
  336.                //Comprueban si chocan con un disparo de la nave
  337.                for (int contD = 0; contD < disparos.size(); contD ++) {
  338.                    if (asteroides.get(contA).colisionDisparo(disparos.get(contD))) {
  339.                        disparos.get(contD).limite = 0;
  340.                        //Se le quita tiempo de vida
  341.                        asteroides.get(contA).vidaAsteroide --;
  342.                        if (asteroides.get(contA).vidaAsteroide > 0) {
  343.                            Asteroid a = asteroides.get(contA);
  344.                            //Según el radio del asteroid se da una puntuación o otra
  345.                            if (a.getRadioAsteroid() >= 60) {
  346.                                //Añadiomos los asteroides en el array
  347.                                for (int contAE = 0; contAE < 3; contAE++) {
  348.                                    asteroidEliminado.add(a.explota());
  349.                                }
  350.                                //Los dividimos el dos
  351.                                divisionAsteroides(contA);
  352.                                //Sumamos los puntos correspondientes
  353.                                puntos += 20;
  354.                            }
  355.                            else if (a.getRadioAsteroid() >= 30) {
  356.                                for (int contAE = 0; contAE < 3; contAE++) {
  357.                                    asteroidEliminado.add(a.explota());
  358.                                }
  359.                                divisionAsteroides(contA);
  360.                                puntos += 50;
  361.                            }
  362.                            else {
  363.                                for (int contAE = 0; contAE < 3; contAE++) {
  364.                                    asteroidEliminado.add(a.explota());
  365.                                }
  366.                                //Llegado a este punto, se eliminan
  367.                                asteroides.remove(contA);
  368.                                puntos += 100;
  369.                            }
  370.                        }
  371.                        //Vamos eliminando los disparos
  372.                        disparos.remove(contD);
  373.                    }
  374.                }
  375.                //Comprueba si choca con los disparos del ovni, recorre los arraylist de ovni y el de disparos
  376.                for (int contO = 0; contO < ovni.size(); contO ++) {
  377.                    for (int contD = 0; contD <  ovni.get(contO).disparosOvni.size(); contD++ ) {
  378.                        if (asteroides.get(contA).colisionDisparo(ovni.get(contO).disparosOvni.get(contD))) {
  379.                            asteroides.get(contA).vidaAsteroide --;
  380.                            ovni.get(contO).disparosOvni.get(contD).limite = 0;
  381.                            if (asteroides.get(contA).vidaAsteroide > 0) {
  382.                                Asteroid a = asteroides.get(contA);
  383.                                asteroidEliminado.add(a.explota());
  384.                                divisionAsteroides(contA);
  385.                                asteroides.remove(contA);
  386.                            }
  387.                            if (asteroides.get(contA).vidaAsteroide <= 0) {
  388.                                asteroides.remove(contA);
  389.                            }
  390.                        }
  391.                    }
  392.                    ovni.get(contO).disparosOvni.remove(this);
  393.                }
  394.            }
  395.            catch (NullPointerException e) {}
  396.        }
  397.    }
  398.    /**
  399.      * Acciones que se realizan en función del movimiento y choques del ovni
  400.      * COLISIÓN CON LOS DISPAROS DE LA NAVE
  401.      * COLISIÓN CON LOS ASTEROID
  402.      * COLISIÓN CON LA NAVE
  403.      * COLISIÓN DE LA NAVE CON LOS DISPAROS DEL OVNI.
  404.      */
  405.    public synchronized void accionesOvni() {
  406.        //Determinamos de forma aleatoria, cuando sale
  407.        int aleatorio = (int) (Math.random() * 1000);
  408.        if (contSalirOvni > 700) {
  409.            //Si el número aleatorio es menor que el número de asteroides, sale
  410.            if (aleatorio < asteroides.size()) {
  411.                ovn = true;
  412.            }
  413.            //Le añadimos un ovni, si no hay ninguno
  414.            if (ovn && ovni.size() < 1) {
  415.                ovni.add(new Enemigo(-10, Math.random() * alto));
  416.            }
  417.        }
  418.        try {
  419.            //Recorremos y los vamos moviendo
  420.            for (int contO = 0; contO < ovni.size(); contO ++) {
  421.                ovni.get(contO).start();
  422. //                ovni.get(contO).mover(ancho, alto);
  423.                //Si el ovni se queda si vida, no sale
  424.                if (vidaOvni == 0) {
  425.                    ovn = false;
  426.                }
  427.                //Busca otro numero aleatorio, si es menor a número de asteroides, se le da vida.
  428.                if (aleatorio < asteroides.size()) {
  429.                    vidaOvni = 1;
  430.                }
  431.                //Comrpueba si le da un disparo de la nave
  432.                for (int contD = 0; contD < disparos.size(); contD ++) {
  433.                    if (ovni.get(contO).colisionDisparo(disparos.get(contD))) {
  434.                        //Se le quita la vida al ovni
  435.                        ovni.get(contO).vida --;
  436.                        vidaOvni --;
  437.                        disparos.get(contD).limite = 0;
  438.                        //Y puntuación
  439.                        puntos += 120;
  440.                    }
  441.                }
  442.                //Recorremos los asteroides para comprobar si se choca con alguno
  443.                for (int contA = 0; contA < asteroides.size(); contA ++) {
  444.                    if (ovni.get(contO).colisionAsteroid(asteroides.get(contA))) {
  445.                        ovni.get(contO).vida --;
  446.                        vidaOvni --;
  447.                        asteroidEliminado.add(asteroides.get(contA).explota());
  448.                        divisionAsteroides(contA);
  449.                        asteroides.remove(contA);
  450.                    }
  451.                }
  452.                //Comprueba si colisiona con la nave
  453.                if (ovni.get(contO).colisionNave(nave)) {
  454.                    //Si la nave aún tiene vida
  455.                    if(vidas > 0 && !colisionNave){
  456.                        nave.setHorizontal(ancho/2);
  457.                        nave.setVertical(alto/2);
  458.                        colisionNave = true;
  459.                        mostrarNave = false;
  460.                    }
  461.                    ovni.get(contO).vida --;
  462.                    vidaOvni --;
  463.                    //Si no tiene vidas
  464.                    if (vidas <= 0) {
  465.                        mostrarNave = false;
  466.                        colisionNave = true;
  467.                    }
  468.                    vidas --;
  469.                }
  470.                //Comprueba si la nave es colisionada con un disparo del ovni
  471.                if (nave.colisionDisparo(ovni.get(contO).disparosOvni) && !colisionNave) { //pregunta si lan ave colisiona con los disparos del ovni
  472.                    //Si la nave no tiene vidas
  473.                    if (nave.vida <= 0) {
  474.                        mostrarNave = false;
  475.                        colisionNave = true;
  476.                    }
  477.                    //Si le quedan
  478.                    if (nave.vida > 0) {
  479.                        mostrarNave = false;
  480.                        nave.setHorizontal(ancho/2);
  481.                        nave.setVertical(alto/2);
  482.                        nave.getRotAngulo();
  483.                        colisionNave = true;
  484.                    }
  485.                    vidas --;
  486.                }
  487.                ovni.get(contO).disparosOvni.remove(this);
  488.            }
  489.        }
  490.        catch (Exception e) {}
  491.        //Recorremos el array list y si no tiene vidas ni el ovni o la nave, se eliminan.
  492.        for (int cont = 0; cont < ovni.size(); cont ++) {
  493.            if (ovni.get(cont).vida <= 0 || nave.vida <= 0) {
  494.                ovni.remove(cont);
  495.            }
  496.        }
  497.    }
  498.    /**
  499.      * Método de la division de los asteroides.
  500.      * @param num
  501.      */
  502.    public synchronized void divisionAsteroides (int num) {
  503.        //Seleccionamos el asteroide que se ha disparado
  504.        Asteroid a = asteroides.get(num);
  505.        //Cogemos las posiciones
  506.        double asteroideHorizontal = a.getHorizontal();
  507.        double asteroideVertical = a.getVertical();
  508.        //Y dividimos el tamaño original en dos
  509.        int tamaño = (a.getTamaño() / 2);
  510.        //Recorremos los dos asteorides nuevos para determinar velocidad y dirección
  511.        for (int cont = 0; cont < 2; cont++) {
  512.            double velocidadHorizontal = Math.random() + 1;
  513.            double velocidadVertical = Math.random() + 1;
  514.            double direccionHorizontal = (Math.random() * 2);
  515.            double direccionVertical =  (Math.random() * 2);
  516.            //Si la dirección es igual 1, giramos la velocidad
  517.            if (direccionHorizontal == 1) {
  518.                velocidadHorizontal *= (-1);
  519.            }
  520.            if (direccionVertical == 1) {
  521.                velocidadVertical *= (-1);
  522.            }
  523.            //Añadimos los nuevos asteroides
  524.            asteroides.add(new Asteroid(asteroideHorizontal, asteroideVertical, 0, .1, velocidadHorizontal, velocidadVertical, tamaño));
  525.        }
  526.        //Eliminamos el asteoride del array
  527.        asteroides.remove(num);
  528.    }
  529.    /**
  530.      * Método de inicio - FALLAN LOS THREAD.
  531.      */
  532.    public void start () {
  533.        if (arranque == null) {
  534.            arranque = new Thread(this);
  535.            arranque.start();
  536.        }
  537.        while (true) {
  538.            for (int contO = 0; contO < asteroides.size(); contO ++) {
  539.                asteroides.get(contO).start();
  540.  
  541.            }
  542.            for (int contO = 0; contO < disparos.size(); contO ++) {
  543.                disparos.get(contO).start();
  544.            }
  545.        }
  546.    }
  547.    /**
  548.      * Método de arranque.
  549.      */
  550.    @Override
  551.    public void run() {
  552.        //Esperamos tres segundos antes de mostrar los elementos
  553.        try {
  554.            arranque.sleep(3000);
  555.        }
  556.        catch (InterruptedException ex) { }
  557.        //Mientras sea cierto
  558.        while (true) {
  559.            //Mostramos la nave
  560.            mostrarNave = true;
  561.            //Ponemos los asteroides
  562.            masAsteroides();
  563.            //Mientras las vidas sean mayores que cero
  564.            while (vidas >= 0) {
  565.                //Iniciamos un contador de tiempo
  566.                inicio = System.currentTimeMillis();
  567.                //Damos movimiento a nave, asteroides y disparos
  568.                nave.mover(ancho, alto);
  569.                for (int cont = 0; cont < asteroidEliminado.size(); cont ++) {
  570.                    asteroidEliminado.get(cont).moverExplosion();
  571.                    if (asteroidEliminado.get(cont).getVidaAsteroide() <= 0) {
  572.                        asteroidEliminado.remove(cont);
  573.                    }
  574.                }
  575.                for (int cont = 0; cont < disparos.size(); cont++) {
  576.                    disparos.get(cont).mover(ancho, alto);
  577.                    if (!disparos.get(cont).getActivado()) {
  578.                        disparos.remove(cont);
  579.                    }
  580.                }
  581.                //Restamos tiempo de disparo
  582.                tiempoFinalDisparo --;
  583.                //Comprobamos las colisones
  584.                compruebaAccionesColisiones();
  585.                //Repintamos
  586.                repaint();
  587.                //Si terminamos los asteroides y con el ovni aumentamos los asteroides.
  588.                if (asteroides.isEmpty() && !ovn) {
  589.                    //Aumentamos el número de asteroides
  590.                    numeroAsteroides ++;
  591.                    //Añadimos asteroides
  592.                    masAsteroides();
  593.                    //Damos true a que puede salir
  594.                    ovn = true;
  595.                    contSalirOvni = 0;
  596.                }
  597.                //Hacer
  598.                try {
  599.                    //Asignamos un nuevo contador de tiempo al final
  600.                    fin = System.currentTimeMillis();
  601.                    //Si la diferencia de refrescar entre la diferencia de fin e inicio es mayor a 0
  602.                    if (refrescar - (fin - inicio) > 0) {
  603.                        //Tiempo de espera es refrescar menos la diferencia
  604.                        Thread.sleep(refrescar - (fin - inicio));
  605.                    }
  606.                }
  607.                catch (InterruptedException e) {}
  608.                contSalirOvni ++;
  609.            }
  610.            stop();
  611.        }
  612.    }
  613.    /**
  614.      * Método de finalización del juego.
  615.      */
  616.    public void stop () {
  617.        if (arranque != null) {
  618.            arranque = null;
  619.            System.exit(0);  
  620.        }
  621.    }
  622. }
  623.  

Primera parte del código.


« Última modificación: 5 Enero 2016, 12:44 pm por S_Code » En línea

S_Code

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Problemas con Thread - Graphics
« Respuesta #1 en: 5 Enero 2016, 12:43 pm »

Segundo mensaje, que en el primero no entraba todo el código.

Clase Asteroid - Dibuja y mueve los asteroid, además de método para comprobar coliones.

Código
  1. package asteroides;
  2.  
  3. //Importamos bibliotecas necesarias
  4. import java.awt.*;
  5. import java.awt.geom.Point2D;
  6.  
  7. /**
  8.  * Clase Asteroid - FALLA THREAD
  9.  */
  10.  
  11. public class Asteroid extends Thread {
  12.    EspacioCanvas j1;
  13.    //Tamaño del asteroide
  14.    int tamaño;
  15.    //Posiciones de asteroide
  16.    double horizontal;
  17.    double vertical;
  18.    //Rotación de asteroide
  19.    double angulo;
  20.    double rotAngulo;
  21.    //Direcciones del asteroide (velocidad)
  22.    double dirHorizontal;
  23.    double dirVertical;
  24.    //Saber si esta activado
  25.    boolean activado;
  26.    //Poligono del asteroid con las posiciones
  27.    Polygon asteroid;
  28.    //Posiciones iniciales de los puntos del asteroide
  29.    double [] posicionInicialHorizontal;
  30.    double [] posicionInicialVertical;
  31.    //Posiciones del asteroide explotado
  32.    final double posicionHorizontalExplosion[] = {-2, 2};
  33.    final double posicionVerticalExplosion[] = {-2, 2};
  34.    //Radio del asteroide
  35.    double radioAsteroid = 30;
  36.    //Vida (la explosión)
  37.    double vidaAsteroide;
  38.    //Array para colocar los puntos de los movimientos
  39.    int [] horizontalPts;
  40.    int [] verticalPts;
  41.    int [] horizontalExplosion;
  42.    int [] verticalExplosion;
  43.    /**
  44.      * Constructor del asteroid
  45.      * @param horizontal
  46.      * @param vertical
  47.      * @param angulo
  48.      * @param rotAngulo
  49.      * @param dirHorizontal
  50.      * @param dirVertical
  51.      * @param tamaño
  52.      */
  53.    public Asteroid(double horizontal, double vertical, double angulo, double rotAngulo, double dirHorizontal, double dirVertical, int tamaño) {
  54.        this.horizontal = horizontal;
  55.        this.vertical = vertical;
  56.        this.angulo = angulo;
  57.        this.rotAngulo = rotAngulo;
  58.        this.dirHorizontal = dirHorizontal;
  59.        this.dirVertical = dirVertical;
  60.        this.tamaño = tamaño;
  61.        activado = true;
  62.        vidaAsteroide = 70;
  63.        j1 = new EspacioCanvas ();
  64.        //Determinamos el tipo de asteroide;
  65.        int numTipo = ((int) (Math.random() * 4) + 1);
  66.        tipoAsteroid(numTipo);
  67.        /**
  68.          * Le damos tres tamaños al asteroide, según estos, tendran un radio, una velocidad y una rotación diferente.
  69.          */
  70.        if (tamaño == 2) {
  71.            for (int cont = 0; cont < posicionInicialHorizontal.length; cont ++) {
  72.                posicionInicialHorizontal[cont] *= 2;
  73.                posicionInicialVertical[cont] *= 2;
  74.            }
  75.            radioAsteroid *= 2;
  76.            this.dirHorizontal /= 2.5;
  77.            this.dirVertical /= 2.5;
  78.            this.rotAngulo /= 2.5;
  79.        }
  80.        else if (tamaño == 1) {
  81.            for (int cont = 0; cont < posicionInicialHorizontal.length; cont ++) {
  82.                posicionInicialHorizontal[cont] *= 1;
  83.                posicionInicialVertical[cont] *= 1;
  84.            }
  85.            radioAsteroid *= 1;
  86.            this.dirHorizontal /= 2;
  87.            this.dirVertical /= 2;
  88.            this.rotAngulo /= 2;
  89.        }
  90.        else if (tamaño < 1) {
  91.            for (int cont = 0; cont < posicionInicialHorizontal.length; cont ++) {
  92.                posicionInicialHorizontal[cont] /= 2;
  93.                posicionInicialVertical[cont] /= 2;
  94.            }
  95.            radioAsteroid /= 2;
  96.            this.dirHorizontal /= 1.5;
  97.            this.dirVertical /= 1.5;
  98.            this.rotAngulo /= 1.5;
  99.        }
  100.        //Creamos las longitudes en los array simples creados para ello
  101.        horizontalPts = new int[posicionInicialHorizontal.length];
  102.        verticalPts = new int[posicionInicialVertical.length];
  103.        horizontalExplosion = new int[posicionHorizontalExplosion.length];
  104.        verticalExplosion = new int[posicionVerticalExplosion.length];
  105.    }
  106.    //Gets y Sets de la clase Asteroide
  107.    public void setActivado(boolean activado) {
  108.        this.activado = activado;
  109.    }
  110.    public Point2D getCentro() {
  111.        return new Point2D.Double(horizontal, vertical);
  112.    }
  113.    public double getRadioAsteroid() {
  114.        return radioAsteroid;
  115.    }
  116.    public int getTamaño() {
  117.        return tamaño;
  118.    }
  119.    public double getHorizontal() {
  120.        return horizontal;
  121.    }
  122.    public double getVertical() {
  123.        return vertical;
  124.    }
  125.    public double getVidaAsteroide() {
  126.        return vidaAsteroide;
  127.    }
  128.    /**
  129.      * Método que determina el tipo de asteroid
  130.      * @param tipo
  131.      */
  132.    public void  tipoAsteroid (int tipo){
  133.        //Posiciones de los diferentes tipos de asteroid
  134.        double [] tipo1Horizontal = {-16, -8, 0, 8, 16, 12, 16, 4, -8, -16, -16};
  135.        double [] tipo1Vertical = {-8, -16, -8, -16, -8, 0, 8, 16, 16, 8, -8};
  136.        double [] tipo2Horizontal = {-12, -16, -8, 0, 8, 16, 8, 16, 8, -4, -8, -16, -12};
  137.        double [] tipo2Vertical = {0, -8, -16, -12, -16, -8, -4, 4, 16, 12, 16, 8, 0};
  138.        double [] tipo3Horizontal = {-8, -16, -4, 8, 16, 16, 8, 0, 0, -8, -16, -8};
  139.        double [] tipo3Vertical = {0, -4, -16, -16, -4, 4, 16, 16, 4, 16, 4, 0};
  140.        double [] tipo4Horizontal = {-4, -8, 4, 16, 16, 4, 16, 8, 4, -8, -16, -16, -4};
  141.        double [] tipo4Vertical = {-8, -16, -16, -8, -4, 0, 8, 16, 12, 16, 4, -8, -8};
  142.        //Según el tipo aleatorio que haya salido, le damos unos valores u otros.      
  143.        if (tipo == 1) {
  144.            posicionInicialHorizontal = tipo1Horizontal;
  145.            posicionInicialVertical = tipo1Vertical;
  146.        }
  147.        else if (tipo == 2) {
  148.            posicionInicialHorizontal = tipo2Horizontal;
  149.            posicionInicialVertical = tipo2Vertical;
  150.        }
  151.        else if (tipo == 3) {
  152.            posicionInicialHorizontal = tipo3Horizontal;
  153.            posicionInicialVertical = tipo3Vertical;
  154.        }
  155.        else if (tipo == 4) {
  156.            posicionInicialHorizontal = tipo4Horizontal;
  157.            posicionInicialVertical = tipo4Vertical;
  158.        }
  159.    }      
  160.    /**
  161.      * Método de dibujar asteroide normal
  162.      * @param g
  163.      */
  164.    public void pintar (Graphics2D g) {
  165.        if (activado) {
  166.            for (int cont = 0; cont < horizontalPts.length; cont ++) {
  167.                horizontalPts[cont] = (int) (posicionInicialHorizontal[cont] * Math.cos(angulo) - posicionInicialVertical[cont] * Math.sin(angulo) + horizontal + 0.5);
  168.                verticalPts[cont] = (int) (posicionInicialHorizontal[cont] * Math.sin(angulo) + posicionInicialVertical[cont] * Math.cos(angulo) + vertical + 0.5);
  169.            }
  170.            g.setColor(Color.WHITE);
  171.            asteroid = new Polygon(this.horizontalPts,this.verticalPts, this.horizontalPts.length);
  172.            g.drawPolygon(asteroid);
  173.        }
  174.    }
  175.    /**
  176.      * Método de dibujar la explosión
  177.      * @param g
  178.      */
  179.    public void pintarExplosion (Graphics g) {
  180.        for (int cont = 0; cont < horizontalExplosion.length; cont ++) {
  181.            horizontalExplosion[cont] = (int) (posicionHorizontalExplosion[cont] * Math.cos(angulo) - posicionVerticalExplosion[cont] * Math.sin(angulo) + horizontal + 0.5);
  182.            verticalExplosion[cont] = (int) (posicionHorizontalExplosion[cont] * Math.sin(angulo) + posicionVerticalExplosion[cont] * Math.cos(angulo) + vertical + 0.5);
  183.        }
  184.        g.setColor(Color.WHITE);
  185.        g.drawPolygon(horizontalExplosion, verticalExplosion, horizontalExplosion.length);
  186.    }
  187.    /**
  188.      * Método de mover el asteroide.
  189.      * @param tamañoAncho
  190.      * @param tamañoAlto
  191.      */
  192.    public synchronized void mover (double tamañoAncho, double tamañoAlto) {
  193.        if (activado) {
  194.            angulo += rotAngulo;
  195.            horizontal += dirHorizontal;
  196.            vertical += dirVertical;
  197.        }
  198.        if (horizontal < (0 - (radioAsteroid))) {
  199.            horizontal += tamañoAncho + (radioAsteroid);
  200.        }
  201.        else if (horizontal > (tamañoAncho + (radioAsteroid))) {
  202.            horizontal -= tamañoAncho + (radioAsteroid);
  203.        }
  204.        if (vertical < (0 - (radioAsteroid))) {
  205.            vertical += tamañoAlto + (radioAsteroid);
  206.        }
  207.        else if (vertical > (tamañoAlto + (radioAsteroid))) {
  208.           vertical -= tamañoAlto + (radioAsteroid);
  209.        }
  210.    }
  211.    /**
  212.      * Método de movimiento del asteroide explotado.
  213.      */
  214.    public synchronized void moverExplosion () {
  215.        angulo += rotAngulo;
  216.        horizontal += dirHorizontal;
  217.        vertical += dirVertical;
  218.        vidaAsteroide --;
  219.    }
  220.    /**
  221.      * Método de la explosión del asteroid
  222.      * @return
  223.      */
  224.    public synchronized Asteroid explota() {
  225.        double horizontalVel = Math.random();
  226.        double verticalVel = Math.random();
  227.        double horizontalDir =  (Math.random() * 2);
  228.        double verticalDir = (Math.random() * 2);
  229.        if (horizontalDir == 1) {
  230.            horizontalVel *= -1;
  231.        }
  232.        if (verticalDir == 1) {
  233.            verticalVel *= -1;
  234.        }
  235.        return new Asteroid (horizontal, vertical, 0, .1, horizontalVel, verticalVel, 0);
  236.    }
  237.    /**
  238.      * Método que comprueba si al asteroide le ha dado un disparo
  239.      * @param disparo
  240.      * @return
  241.      */
  242.      public synchronized boolean colisionDisparo (Disparo disparo){
  243.        if (asteroid.contains(disparo.horizontal, disparo.vertical));
  244.        return asteroid.contains(disparo.horizontal, disparo.vertical);
  245.    }
  246.    /**
  247.      * Método que comprueba si una asteroide choca con una nave
  248.      * @param jugador
  249.      * @return
  250.      */
  251.    public synchronized boolean colisionNave (Nave jugador){
  252.        if (asteroid.intersects(jugador.nave.getBounds2D()));
  253.        return asteroid.intersects(jugador.nave.getBounds2D());
  254.    }
  255.    /** Método del Thread del asteroide
  256.      * NO FUNCIONA: SI SE PONE AQUÍ EL MOVIMIENTO, EN EL MÉTODO DE ACCIONES ASTEROID DE ESPACIOCANVAS NO DEBE IR.
  257.      */
  258.    @Override
  259.    public void run () {
  260.         while (true) {    
  261.            try {
  262.                mover (j1.ancho, j1.alto);
  263.                moverExplosion ();
  264.                Thread.sleep(40);
  265.                j1.repaint();
  266.            }
  267.            catch (InterruptedException ex) { }
  268.        }
  269.    }
  270. }
  271.  

Clase Enemigo - Ovni: Movimiento y dibujo. Incorpora sus dibujos

Código
  1. package asteroides;
  2.  
  3. //Importar librerias necesarias
  4. import java.awt.*;
  5. import java.awt.geom.Point2D;
  6. import java.util.ArrayList;
  7. import java.util.Random;
  8.  
  9. /**
  10.  * Clase Nave - Enemigo - FALLA EL THREAD
  11.  * EL MOVIMIENTO DEL THREAD FUNCIONA, PERO NO DETECTA LAS COLISONES
  12.  */
  13.  
  14. public class Enemigo extends Thread {
  15.    EspacioCanvas j1;
  16.    //Vidas del ovni
  17.    int vida;
  18.    //Posición del ovni
  19.    double horizontal;
  20.    double vertical;
  21.    //Angulo del platilla
  22.    double angulo;
  23.    //Poligono del ovni
  24.    Polygon ovni;
  25.    //Eje del ovni
  26.    final double eje = -3.1588;
  27.    //Direcciones del ovni
  28.    double dirHorizontal;
  29.    double dirVertical;
  30.    //Variables para el disparo
  31.    int contador;
  32.    int tiempoDisparo;
  33.    //Posiciones del ovni
  34.    double [] posicionInicialHorizontal;
  35.    double [] posicionInicialVertical;
  36.    int [] puntosHorizontal;
  37.    int [] puntosVertical;
  38.    //ArrayList de los disparos del ovni
  39.    ArrayList <Disparo> disparosOvni;
  40.    /**
  41.      * Constructor del ovni
  42.      * @param horizontal
  43.      * @param vertical
  44.      */
  45.    public Enemigo(double horizontal, double vertical) {
  46.        this.horizontal = horizontal;
  47.        this.vertical = vertical;
  48.        this.angulo = eje;
  49.        contador = 0;
  50.        vida = 1;
  51.        //Determinamos el tipo de asteroide;
  52.        int numTipo = ((int) (Math.random() * 2) + 1);
  53.        tipoEnemigo (numTipo);
  54.        //Creamos los array
  55.        puntosHorizontal = new int[posicionInicialHorizontal.length];
  56.        puntosVertical = new int[posicionInicialVertical.length];
  57.        disparosOvni = new ArrayList <Disparo>();
  58.        j1 = new EspacioCanvas ();
  59.    }
  60.    //GETS Y SETS
  61.    public Disparo disparo (Enemigo ovni) {
  62.        return new Disparo (ovni);
  63.    }
  64.    public Point2D getCentro() {
  65.        return new Point2D.Double(horizontal, vertical);
  66.    }
  67.    public int getVida() {
  68.        return vida;
  69.    }
  70.    public double getHorizontal() {
  71.        return horizontal;
  72.    }
  73.    public double getVertical() {
  74.        return vertical;
  75.    }
  76.    public void setHorizontal(double horizontal) {
  77.        this.horizontal = horizontal;
  78.    }
  79.    public void setVertical (double vertical) {
  80.        this.vertical = vertical;
  81.    }
  82.  
  83.    public void tipoEnemigo (int enemigo) {
  84.        double [] posicionInicialHorizontal1 = {8, 12, -12, 14, 20, -20, 20, 14, -14, -20, -14, -12, -8};
  85.        double [] posicionInicialVertical1 = {12, 6, 6, 6, 0, 0, 0, -6, -6, 0, 6, 6, 12};
  86.        double [] posicionInicialHorizontalPeque = {4, 6, -6, 7, 10, 10, 10, 7, -7, -10, -7, -6, -4};
  87.        double [] posicionInicialVerticalPeque = {6, 3, 3, 3, 0, 0, 0, -3, -3, 0, 3, 3, 6};
  88.        if (enemigo == 1) {
  89.            posicionInicialHorizontal = posicionInicialHorizontal1;
  90.            posicionInicialVertical = posicionInicialVertical1;
  91.        }
  92.        else if (enemigo == 2) {
  93.            posicionInicialHorizontal = posicionInicialHorizontalPeque;
  94.            posicionInicialVertical = posicionInicialVerticalPeque;
  95.        }
  96.    }
  97.    /**
  98.      * Método de dibujar el ovni
  99.      * @param g
  100.      */
  101.    public void pintar(Graphics2D g) {
  102.        //Para la figura del ovni
  103.        for (int cont = 0; cont < puntosHorizontal.length; cont ++) {
  104.            //Calculamos las posiciones de la posicion
  105.            puntosHorizontal[cont] = (int) (posicionInicialHorizontal[cont] * Math.cos(angulo) - posicionInicialVertical[cont] * Math.sin(angulo) + horizontal + 0.5);
  106.            puntosVertical[cont] = (int) (posicionInicialHorizontal[cont] * Math.sin(angulo) + posicionInicialVertical[cont] * Math.cos(angulo) + vertical + 0.5);
  107.        }
  108.        //Para dibujar los disparos del ovni
  109.        ovni = new Polygon (this.puntosHorizontal, this.puntosVertical, this.puntosHorizontal.length);
  110.        for (int cont = 0; cont < disparosOvni.size(); cont ++) {
  111.            disparosOvni.get(cont).pintar(g);
  112.        }
  113.        //Color del ovni
  114.        g.setColor(Color.WHITE);
  115.        g.drawPolygon(ovni);
  116.    }
  117.    /**
  118.      * Método de mover el ovni
  119.      * @param tamañoAncho
  120.      * @param tamañoAlto
  121.      */
  122.    public synchronized void mover(double tamañoAncho, double tamañoAlto) {
  123.        //Movimientos aleatorios del platillo
  124.        Random r = new Random();
  125.        if (contador == 0 || contador %150 == 0) {
  126.            dirHorizontal = Math.random()*3*((r.nextInt(2)==0?-1:1)*1);
  127.            dirVertical = Math.random()*3*((r.nextInt(2)==0?-1:1)*1);
  128.        }
  129.        //Le añadimos las direcciones
  130.        horizontal += dirHorizontal;
  131.        vertical += dirVertical;
  132.        //Si llega a los bordes, vuelve por el otro extremo
  133.        if (horizontal < 0) {
  134.            horizontal += tamañoAncho;
  135.        }
  136.        if (horizontal > tamañoAncho) {
  137.            horizontal -= tamañoAncho;
  138.        }
  139.        if (vertical < 0) {
  140.            vertical += tamañoAlto;
  141.        }
  142.        if (vertical > tamañoAlto) {
  143.            vertical -= tamañoAlto;
  144.        }
  145.        contador ++;
  146.        //Añadimos los disparos, según el calculos a los valores del contador
  147.        if (this.tiempoDisparo == 0 || this.tiempoDisparo %45 == 0) {
  148.                this.disparosOvni.add(disparo(this));
  149.        }
  150.        this.tiempoDisparo ++;
  151.        //Vamos moviendo los disparos
  152.        for (int cont = 0; cont < disparosOvni.size(); cont ++) {
  153.            disparosOvni.get(cont).mover(tamañoAncho, tamañoAlto);
  154.            //Comprobamos si han llegado a su limite
  155.            if (disparosOvni.get(cont).limite <= 0) {
  156.                disparosOvni.remove(cont);
  157.            }
  158.        }
  159.    }
  160.    /**
  161.      * Método que comprueba si choca con un asteroide
  162.      * @param asteroide
  163.      * @return
  164.      */
  165.    public synchronized boolean colisionAsteroid (Asteroid asteroide){
  166.        if(ovni.intersects(asteroide.asteroid.getBounds()));
  167.        return ovni.intersects(asteroide.asteroid.getBounds());
  168.    }
  169.    /**
  170.      * Método que comprueba si choca con la nave
  171.      * @param nave
  172.      * @return
  173.      */
  174.    public synchronized boolean colisionNave (Nave nave){
  175.        if (ovni.intersects(nave.nave.getBounds2D()));
  176.        return ovni.intersects(nave.nave.getBounds2D());
  177.    }
  178.    /**
  179.      * Método que comprobar si le da ha dado un disparo.
  180.      * @param disparo
  181.      * @return
  182.      */
  183.    public synchronized boolean colisionDisparo (Disparo disparo){
  184.        if (ovni.contains(disparo.horizontal, disparo.vertical));
  185.        return ovni.contains(disparo.horizontal, disparo.vertical);
  186.    }
  187.    /** Método del Thread del ovni
  188.      * NO FUNCIONA: SI SE PONE AQUÍ EL MOVIMIENTO, EN EL MÉTODO DE ACCIONES DE ESPACIO CANVAS NO DEBE IR.
  189.     */
  190.    @Override
  191.    public void run () {
  192.        while (true) {      
  193.            try {
  194.                mover (j1.ancho, j1.alto);
  195.                Thread.sleep (60);
  196.                j1.repaint();
  197.            }
  198.            catch (InterruptedException ex) { }
  199.        }
  200.    }
  201. }
  202.  

Clase Disparo - Movimiento y pintar. Relacionado con la nave y el ovni

Código
  1. package asteroides;
  2.  
  3. //Importamos bibliotecas necesarias
  4. import java.awt.*;
  5. import java.awt.geom.Point2D;
  6.  
  7. /** CLASE DISPARO - Lo usa la nave y el enemigo - FALLA EL THREAD
  8.  */
  9.  
  10. public class Disparo extends Thread {
  11.    EspacioCanvas j1;
  12.    //Velocidad del disparo
  13.    final double velocidadDisparo = 12;
  14.    //Posiciones y angulo del disparo
  15.    double horizontal;
  16.    double vertical;
  17.    double angulo;
  18.    //Direcciones del disparo
  19.    double dirHorizontal;
  20.    double dirVertical;
  21.    //Limite del disparo
  22.    int limite;
  23.    //Boolean para ver si se ha activado el disparo
  24.    boolean activado;
  25.    //Radio del disparo
  26.    double radioDisparo = 0.5;
  27. //    int [] puntosHorizontal, puntosVertical;
  28.    /**
  29.      * Constructor del disparo de la Nave
  30.      * @param horizontal
  31.      * @param vertical
  32.      * @param angulo
  33.      * @param velEnvioH
  34.      * @param velEnvioV
  35.      * @param limite
  36.      */
  37.    public Disparo(double horizontal, double vertical, double angulo, double velEnvioH, double velEnvioV, int limite) {
  38.        this.horizontal = horizontal;
  39.        this.vertical = vertical;
  40.        this.angulo = angulo;
  41.        dirHorizontal = velocidadDisparo * Math.cos(angulo) + velEnvioH;
  42.        dirVertical = velocidadDisparo * Math.sin(angulo) + velEnvioV;
  43.        this.limite = 35;
  44.        activado = true;
  45.        j1 = new EspacioCanvas ();
  46.    }
  47.    /**
  48.      * Constructor disparo para Ovni
  49.      * @param ovni
  50.      */
  51.    public Disparo (Enemigo ovni){
  52.        this.limite = 60;
  53.        this.angulo = ovni.angulo;
  54.        this.horizontal = ovni.horizontal;
  55.        this.vertical = ovni.vertical;
  56.        this.dirHorizontal = ovni.dirHorizontal;
  57.        this.dirVertical = ovni.dirVertical;
  58.    }
  59.    //Gets del disparo
  60.    public boolean getActivado() {
  61.        return activado;
  62.    }
  63.    public Point2D getCentro() {
  64.        return new Point2D.Double(horizontal, vertical);
  65.    }
  66.    public double getRadioDisparo() {
  67.        return radioDisparo;
  68.    }
  69.    /**
  70.      * Método de dibujar el disparo cuando se activa
  71.      * @param g
  72.      */
  73.    public void pintar(Graphics2D g){
  74. //        Graphics2D g = g0;
  75.        g.setColor(Color.WHITE);
  76.        g.fillOval((int)horizontal, (int)vertical, 3, 3);
  77.    }  
  78.    /**
  79.      * Método de movimiento del disparo una vez activado
  80.      * @param tamañoAncho
  81.      * @param tamañoAlto
  82.      */
  83.    public synchronized void mover (double tamañoAncho, double tamañoAlto) {
  84.        //Si se ha activado el disparo
  85.        if (activado) {
  86.            //A horizontal y vertical le sumamos la dirección
  87.            horizontal += dirHorizontal;
  88.            vertical += dirVertical;
  89.        }
  90.        //Si el disparo supera los limites de los lados, vuelve por el otro extremo
  91.        if (horizontal < 0) {                    
  92.            horizontal += tamañoAncho;
  93.        }
  94.        else if (horizontal > tamañoAncho) {
  95.            horizontal -= tamañoAncho;
  96.        }
  97.        if (vertical < 0) {
  98.            vertical += tamañoAlto;
  99.        }
  100.        else if (vertical > tamañoAlto) {
  101.            vertical -= tamañoAlto;
  102.        }
  103.        //Se resta tiempo
  104.        limite --;
  105.        //Si no queda tiempo, el disparo se desactiva
  106.        if (limite == 0) {
  107.            activado = false;
  108.        }
  109.    }
  110.    /** Método del Thread del disparo
  111.      * NO FUNCIONA: SI SE PONE AQUÍ EL MOVIMIENTO, EN EL RUN DE ESPACIOCANVAS NO DEBE IR.
  112.      */
  113.    @Override
  114.    public void run () {
  115.        while (true) {      
  116.            try {
  117.                mover (j1.ancho, j1.alto);
  118.                Thread.sleep (10);
  119.                j1.repaint();
  120.            }
  121.            catch (InterruptedException ex) { }
  122.        }
  123.    }
  124. }
  125.  

Clase Nave: Movimiento y dibujo, el KeyListener esta en el Espacio Canvas

Código
  1. package asteroides;
  2.  
  3. //Importar librerias necesarias
  4. import java.awt.*;
  5. import java.awt.geom.Point2D;
  6. import java.util.ArrayList;
  7.  
  8. /**
  9.  * Clase Nave - Jugador
  10.  */
  11. public class Nave  {
  12.    EspacioCanvas j1;
  13.    //Poligono de la nave
  14.    Polygon nave;
  15.    //Atributos del movimiento de la nave
  16.    double aceleracion;
  17.    double arrastre;
  18.    //Radio de la nave
  19.    double radio = 12;
  20.    //Posición de la nave
  21.    double horizontal;
  22.    double vertical;
  23.    //Rotación de la nave
  24.    double angulo;
  25.    double rotAngulo;
  26.    //Direcciones de la nave
  27.    double dirHorizontal;
  28.    double dirVertical;
  29.    //Booleans del movimiento y disparo
  30.    boolean acelerador;
  31.    boolean irzquierda;
  32.    boolean derecha;
  33.    boolean disparo;
  34.    //Posiciones de la nave
  35.    final int [] posicionInicialHorizontal = {-12, 12, -12, -5, -5};
  36.    final int [] posicionInicialVertical = {8, 0, -8, -5, 5};
  37.    //Posiciones del acelerador
  38.    final double [] posicionEmpujeInicialHorizontal = {-4, - 12, - 4};
  39.    final double [] posicionEmpujeInicialVertical = {-3, 0 , 3};
  40.    int vida;
  41.    int [] puntosHorizontal;
  42.    int [] puntosVertical;
  43.    int [] inicioEmpujeHorizontal;
  44.    int [] inicioEmpujeVertical;
  45.    /**
  46.      * Constructor de la nave
  47.      * @param horizontal
  48.      * @param vertical
  49.      * @param angulo
  50.      * @param rotAngulo
  51.      * @param aceleracion
  52.      * @param arrastre
  53.      */
  54.    public Nave(double horizontal, double vertical, double angulo, double rotAngulo, double aceleracion, double arrastre) {
  55.        this.horizontal = horizontal;
  56.        this.vertical = vertical;
  57.        this.angulo = angulo;
  58.        this.rotAngulo = rotAngulo;
  59.        this.aceleracion = aceleracion;;
  60.        this.arrastre = arrastre;
  61.        acelerador = false;
  62.        irzquierda = false;
  63.        derecha = false;
  64.        vida = 3;
  65.        //Creamos los array
  66.        puntosHorizontal = new int[posicionInicialHorizontal.length];
  67.        puntosVertical = new int[posicionInicialVertical.length];
  68.        inicioEmpujeHorizontal = new int[posicionEmpujeInicialHorizontal.length];
  69.        inicioEmpujeVertical = new int[posicionEmpujeInicialVertical.length];
  70.    }
  71.    //GETS Y SETS
  72.    public Disparo disparo () {
  73.        return new Disparo (horizontal, vertical, angulo, dirHorizontal, dirVertical, 50);
  74.    }
  75.    public void setAcelerador(boolean acelerador) {
  76.        this.acelerador = acelerador;
  77.    }
  78.    public void setIrzquierda(boolean irzquierda) {
  79.        this.irzquierda = irzquierda;
  80.    }
  81.    public void setDerecha(boolean derecha) {
  82.        this.derecha = derecha;
  83.    }
  84.    public Point2D getCentro() {
  85.        return new Point2D.Double(horizontal, vertical);
  86.    }
  87.    public double getRadio() {
  88.        return radio;
  89.    }
  90.    public double getRotAngulo () {
  91.        return rotAngulo;
  92.    }
  93.    public double getHorizontal() {
  94.        return horizontal;
  95.    }
  96.    public double getVertical() {
  97.        return vertical;
  98.    }
  99.    public void setHorizontal(double horizontal) {
  100.        this.horizontal = horizontal;
  101.    }
  102.    public void setVertical (double vertical) {
  103.        this.vertical = vertical;
  104.    }
  105.    /**
  106.      * Método de dibujar la nave.
  107.      * @param g
  108.      */
  109.    public void pintar(Graphics2D g) {
  110.        //Si esta pulsado el acelerador
  111.        if (acelerador) {
  112.            //Recorremos para calcular los delanteros
  113.            for (int cont = 0; cont < inicioEmpujeHorizontal.length; cont ++) {
  114.                //Calculamos el movimiento                
  115.                inicioEmpujeHorizontal[cont] = (int) (posicionEmpujeInicialHorizontal[cont] * Math.cos(angulo) - posicionEmpujeInicialVertical[cont] * Math.sin(angulo) + horizontal + 0.5);
  116.                inicioEmpujeVertical[cont] = (int) (posicionEmpujeInicialHorizontal[cont] * Math.sin(angulo) + posicionEmpujeInicialVertical[cont] * Math.cos(angulo) + vertical + 0.5);
  117.            }
  118.            //Color de la nave
  119.            g.setColor(Color.WHITE);
  120.            //Señalamos los puntos del acelerador
  121.            g.drawPolyline(inicioEmpujeHorizontal, inicioEmpujeVertical, inicioEmpujeHorizontal.length);
  122.        }
  123.        //Para el movimiento de la nave, recorremos
  124.        for (int cont = 0; cont < puntosHorizontal.length; cont ++) {
  125.            //Calculamos las posiciones de la posicion
  126.            puntosHorizontal[cont] = (int) (posicionInicialHorizontal[cont] * Math.cos(angulo) - posicionInicialVertical[cont] * Math.sin(angulo) + horizontal + 0.5);
  127.            puntosVertical[cont] = (int) (posicionInicialHorizontal[cont] * Math.sin(angulo) + posicionInicialVertical[cont] * Math.cos(angulo) + vertical + 0.5);
  128.        }
  129.        //Color de la nave
  130.        g.setColor(Color.WHITE);
  131.        nave = new Polygon (puntosHorizontal, puntosVertical, puntosHorizontal.length);
  132.        //Señalamos los puntos de la nave
  133.        g.drawPolygon(nave);
  134.    }
  135.    /**
  136.      * Método de mover la nave
  137.      * @param tamañoAncho
  138.      * @param tamañoAlto
  139.      */
  140.    public synchronized void mover(double tamañoAncho, double tamañoAlto) {
  141.        //Comprobamos hacia donde va la nave, ségun la tecla pulsada
  142.  
  143.        if (irzquierda) {
  144.            angulo -= rotAngulo;
  145.        }
  146.        if (acelerador) {
  147.            dirHorizontal += aceleracion * Math.cos(angulo);
  148.            dirVertical += aceleracion * Math.sin(angulo);
  149.        }
  150.        if (derecha) {
  151.            angulo += rotAngulo;
  152.        }
  153.        //Le añadimos las direcciones
  154.        horizontal += dirHorizontal;
  155.        vertical += dirVertical;
  156.        //Múltiplamos el arrastre a la dirección
  157.        dirHorizontal *= arrastre;
  158.        dirVertical *= arrastre;
  159.        //Si llega a los bordes, vuelve por el otro extremo
  160.        if (horizontal < 0) {
  161.            horizontal += tamañoAncho;
  162.        }
  163.        else if (horizontal > tamañoAncho) {
  164.            horizontal -= tamañoAncho;
  165.        }
  166.        if (vertical < 0) {
  167.            vertical += tamañoAlto;
  168.        }
  169.        else if (vertical > tamañoAlto) {
  170.            vertical -= tamañoAlto;
  171.        }
  172.    }
  173.    /**
  174.      * Método que comprueba si le da un disparo suyo o no
  175.      * @param disparos
  176.      * @return
  177.      */
  178.    public synchronized boolean colisionDisparo (ArrayList <Disparo> disparos){
  179.        for (int cont = 0; cont < j1.disparos.size(); cont ++) {
  180.            if (nave.contains(j1.disparos.get(cont).horizontal, j1.disparos.get(cont).vertical)){
  181.                return true;
  182.            }
  183.        }
  184.        return false;
  185.    }
  186. }
  187.  

Gracias de antemano por vuestro tiempo.


« Última modificación: 5 Enero 2016, 12:47 pm por S_Code » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
GNU/Linux
Codename!! 1 2,868 Último mensaje 18 Agosto 2011, 07:14 am
por Foxy Rider
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
Programación C/C++
Codename!! 0 2,079 Último mensaje 15 Agosto 2011, 21:31 pm
por Codename!!
diferencias entre Procesadores intel con HD Graphics y sin HD Graphics
Hardware
Vjuan_ 6 3,808 Último mensaje 21 Diciembre 2012, 00:12 am
por Aprendiz-Oscuro
Problemas con Graphics y JPanel
Java
shadows789 3 2,269 Último mensaje 4 Mayo 2014, 12:46 pm
por Chuidiang
Problemas al insertar imagen desde un Thread
Java
Luis Daniel 1 1,975 Último mensaje 15 Junio 2018, 04:38 am
por Damian616
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines