Salve. Sto provando a programmare un giochino in java (per ora un applet) senza utilizzare particolari librerie, java puro. Ho difficoltà nell'implementare una semplice collision detection per la quale sto utilizzando l'oggetto Rectangle2D.
In generale la situazione è questa: c'è un'arena divisa in celle, dove ogni cella (grande 32x32) può essere vuota, contenere un nemico oppure il personaggio principale. Se si fa click con il mouse su
di un nemico allora si spara un proiettile verso di esso. Il proiettile deve svanire se si scontra con un
ostacolo interposto tra il nemico ed il pg principale oppure ovviamente se va a segno al nemico.
Il problema è che appena sparo un proiettile viene rilevata immediatamente una collisione e di fatto non parte alcun proiettile, perché una volta rilevata la collisione vado a rimuovere il proiettile dalla lista dei proiettili presenti in scena (possono essere sparati a raffica e devo controllarli tutti).
Ogni oggetto del modello dati implementa il metodo:
per ottenere il rettangolo che lo contiene.codice:public Rectangle2D getBounds() { return new Rectangle2D.Double(x, y, DIAMETER, DIAMETER); }
Esempio, ostacolo:
Questa è la logica di sparo e movimento:codice:package model; import java.awt.geom.Rectangle2D; public class Obstacle { private float x; private float y; private static final int DIAMETER = 32; public Obstacle(float x, float y) { this.x = x; this.y = y; } public float getX() { return x; } public float getY() { return y; } public Rectangle2D getBounds() { return new Rectangle2D.Double(x, y, DIAMETER, DIAMETER); } }
Insomma come mai mi rileva subito una collisione ed il proiettile non fa a tempo a partire che è già stato eliminato? Spero di ricevere un piccolo aiuto.codice:public class ArenaController { private Arena arena; /** selected cell for movement */ private float targetX, targetY; /** true if droid is moving */ private boolean moving = false; /** true if droid is shooting to enemy */ private boolean shooting = false; private DroidController droidController; public ArenaController(Arena arena) { this.arena = arena; this.droidController = new DroidController(arena); } public void update(float delta) { Droid droid = arena.getDroid(); //droid movements if (moving) { droidController.moveDroid(delta, targetX, targetY); //check if arrived if (droid.getX() == targetX && droid.getY() == targetY) moving = false; } //meccanismo di sparo if(shooting) { //se non ci sono proiettili non si sta sparando if(arena.getBullets().isEmpty()) { shooting = false; } //scorro tutti i proiettili sparati ancora presenti for(int i = 0; i < arena.getBullets().size(); i++) { //proiettile corrente Bullet bullet = arena.getBullets().get(i); //calcolo angolo double angle = Math.atan2(bullet.getEnemyY() - bullet.getY(), bullet.getEnemyX() - bullet.getX()); //aggiornamento delle coordinate per spostare il proiettile bullet.setX((float) (bullet.getX() + (Math.cos(angle) * bullet.getSpeed() * delta))); bullet.setY((float) (bullet.getY() + (Math.sin(angle) * bullet.getSpeed() * delta))); //per ogni proiettile controllo se si è scontrato //con uno degli ostacoli presenti nell'arena for(int j = 0; j < arena.getObstacles().size(); j++) { Obstacle obs = arena.getObstacles().get(j); if(obs.getBounds().contains(bullet.getBounds())) { arena.removeBullet(bullet); } } //per ogni proiettile controllo se si è scontrato //con uno dei nemici della scena for(int j = 0; j < arena.getEnemies().size(); j++) { Enemy ene = arena.getEnemies().get(j); if(ene.getBounds().contains(bullet.getBounds())) { arena.removeBullet(bullet); } } } } } public boolean onClick(int x, int y) { //click on empty cell if(arena.getGrid()[(int)(y / Arena.TILE)][(int)(x / Arena.TILE)] == null) { //coordinates targetX = x / Arena.TILE; targetY = y / Arena.TILE; //enables movement moving = true; return true; } //click on enemy: fire if(arena.getGrid()[(int)(y / Arena.TILE)][(int)(x / Arena.TILE)] instanceof Enemy) { //coordinates float enemyX = x / Arena.TILE; float enemyY = y / Arena.TILE; //new bullet Bullet bullet = new Bullet(); //start coordinates bullet.setX(arena.getDroid().getX()); bullet.setY(arena.getDroid().getY()); //end coordinates (enemie) bullet.setEnemyX(enemyX); bullet.setEnemyY(enemyY); //adds bullet to arena arena.addBullet(bullet); //enables shooting shooting = true; return true; } return false; } }

Rispondi quotando