Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Collision detection, poco collision molto detection

    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:

    codice:
    	public Rectangle2D getBounds() {
    		return new Rectangle2D.Double(x, y, DIAMETER, DIAMETER);
    	}
    per ottenere il rettangolo che lo contiene.

    Esempio, ostacolo:

    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);
    	}
    }
    Questa è la logica di sparo e movimento:

    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;
    	}
    }
    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.

  2. #2
    Ho capito cosa accade ma non perché. Se inserisco quei cicli for che controllano eventuali collisioni, il movimento dei proiettili diventa istantaneo invece che essere graduale. Per questo appena sparo scompaiono, perché arrivano subito all'obiettivo e vengono immediatamente rimossi. Ma veramente non capisco perché ._.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.