[Java 2D] Camera e sprite

di il
6 risposte

[Java 2D] Camera e sprite

Buonasera ,

Come nell'immagine che segue , sto cercando di realizzare quanto viene spiegato qui



Ovvero creare una camera( un rettangolo) dove qualunque oggetto all'interno viene renderizzato.
Con questa camera dovrei muovermi all'interno di una mappa ovvero un rettangolo molto più grande ( world).
Ho creato già la camera , una sprite e tutto il necessario per muovermi all'interno.
Nel metodo che renderizza ho questo codice, spero sia autoesplicativo:

 sprite.setPosX(200-camX);
 sprite.setPosY(200-camY);
 if(camera.contains(sprite.getRect())) sprite.draw(dbg);

  camera.set(camX, camY);
  camera.draw(dbg);

Quando premo 'D' la camera si sposta verso Destra mentre la sprite se contenuta all'interno , va verso sinistra.
Quando premo 'A' la camera si sposta verso Sinistra mentre la sprite se contenuta all'interno , va verso Destra.
Quindi una animazione.

Il numero '200' è un offeset rispetto alla camera, come spiegato nell'articolo. In realtà non ho utilizzato gli stessi valori , ma il principio credo sia lo stesso.
Qui di seguito riporto la condizione iniziale , quando lancio il programma:
(Start)

poi quando mi sposto con la camera verso Destra
http://imgur.com/a/bDDV (camera verso destra)

Il problema è che , come si vede nella seconda immagine, la sprite non viene più renderizzata già prima di raggiungere l'estrema sinistra dello schermo o frame ( per capirci quando X=0)
A parte quello funziona. Se sposto la camera si muove anche la sprite e scompare quando non è contenuta per poi riapparire quando lo è.

Ora questa mi sembra una domanda particolare , ma se qualcuno ha già fatto qualcosa di simile , ogni cosa sarebbe ben accetta
rimango a disposizione per qualsiasi chiarimento , Grazie

6 Risposte

  • Re: [Java 2D] Camera e sprite

    Forse ho capito: devo tenere il rettangolo piu piccolo al centro della camera (player) , e spostare tutto il resto come un unico blocco . Mi sembra piuttosto difficile:)
  • Re: [Java 2D] Camera e sprite

    Pessimo risultato :
    http://www.videosprout.com/video?id=71702196-10f7-4a2e-a5b7-f6bf3e0ec2db

    Sto provando a fare il rendering della griglia ma solo di quello che è contenuto nella camera ( rettangolo esterno = camera)
    oltretutto quando raggiunge la fine della griglia mi "sporca" lo schermo di blu ed anche lento a renderizzare ogni quadretto che trova dentro la camera
    Le dimensioni della griglia compresa la parte che non si vede è griglia 4000x800
    
        for(int index = 0; index < elementDrawable.size(); index++)
        {
            if(camera.contains( elementDrawable.get(index).getRect() ))
            elementDrawable.get(index).draw(dbg);
        }
    
        camera.set(camX, camY);
        camera.draw(dbg);
        
        dbg.translate(tx, ty);
    
    
    
  • Re: [Java 2D] Camera e sprite

    Cyrano ha scritto:


    Ora questa mi sembra una domanda particolare , ma se qualcuno ha già fatto qualcosa di simile , ogni cosa sarebbe ben accetta
    Intuisco quello che vuoi fare in generale. Domanda: conosci già JViewport ? E' un componente che viene usato internamente da JScrollPane ma può anche essere usato direttamente, se uno vuole. Serve appunto per fornire una "finestra" che mostra una porzione di un componente molto più grande.

    L'alternativa è sviluppare da zero una logica di "viewport" in un proprio componente, andando ad applicarla direttamente al disegno delle figure che si vuole disegnare. Non è immediatissimo (richiede un po' di ragionamenti) ma è possibile.
  • Re: [Java 2D] Camera e sprite

    andbin ha scritto:


    Cyrano ha scritto:


    Ora questa mi sembra una domanda particolare , ma se qualcuno ha già fatto qualcosa di simile , ogni cosa sarebbe ben accetta
    Intuisco quello che vuoi fare in generale. Domanda: conosci già JViewport ?
    ..no, vado a vedere di cosa si tratta )
  • Re: [Java 2D] Camera e sprite

    Buongiorno ,

    Alla fine ho preso un libro.Doveva essere una semplice applicazione ma poi mi ha preso la mano , meglio ritornare alla base.
    Il risultato è questo

    le sprite sono state scaricate gratutitamente


    Non so se va bene , ho come il sospetto che vada a scatti .per ora lo lascio così
  • Re: [Java 2D] Camera e sprite

    Comunque questo è quello che ho capito/imparato:
    Al momento il codice è in grado di posizionare in una griglia full screen tutti i tile che voglio con dimensioni 32x32.
    Il background è una immagine che si muove dipendentemente dalla direzione del player ad una velocità di molto inferiore
    perchè ritrae un paesaggio e quindi genera un pò di prospettiva.

    Lo scrolling del background ( bg) si sposta nella direzione opposta a quella del Player. il bg si sposta di n Pixel ogni volta che si muove il player.
    Questi n Pixel ( da ora assegnati a OFFsetX ) vengono calcolati in questo modo:
    
    OffSetX = 0;
    OffSetY = 0;  
    if (MAP_WIDTH > WINDOW_WIDTH)
    {
           /* Ottiene la metà in pixel della finestra window */
            int middle = WINDOW_WIDTH / OffSetDiv;
    
            /* Questo offset mantiene il player sempre al centro */
            OffSetX = Math.round(middle - X - gridCellWidth); 
    
            /* Ottiene la coordinate del lato sinistro */
            OffSetX = Math.min(OffSetX, 0);
    
            /* Ottiene la stessa cosa per il lato destro*/
            OffSetX = Math.max(OffSetX, WINDOW_WIDTH - MAP_WIDTH);
            
            /* Converte l'offeset in Tile*/
           OffSetX /=gridCellWidth;
    }
    
    Lo stesso vale per l'asse Y.
    Player:
    L'offeset OFFSetX convertito in Tile, viene quindi sommato alle coordinate in Tile del Player ( es. X+OffSetX).
    La varibaile X rappresenta la coordinata sull'asse X, mentre Y quella dell'asse Y. ( per ora non utilizzata).
    Backround:
    Al metodo o funzione che si occupa di muovere il BG , viene passato solamente OFFSetX senza alcuna coordinata in quanto il bg occupa tutto l'asse x e inizia il suo rendering quindi dalla posizione 0.
    Rendering del livello:
    I tile con associata immagine jpg , sono contenuti in un elenco ( Lista) e richiamati all'interno di un ciclo per il rendering
    verso le rispettive coordinate in tile posX e posY.
    Viene quindi sommato a posX e posY l'offset ( OFFSetX e OFFSetY). In realtà OFFsetY non lo uso per ora.
    Il Player per ora non ha gravità , non salta e passa attraverso i tiles :rolleyes:

    Tutto questo sopra spiegato permette al Player di muoversi liberamente con l'effetto scrolling.
    Con il resto del codice è possibile caricare/salvare il livello , cancellare ogni singolo tile. Rendere visibile/invisibile
    la griglia, il toolbox , lo stesso livello.

    Il problema è che i tile che compongono il livello si muovono a passi di 32 pixel per volta ( 1 tile) ad ogni passo del Player.
    Il Player fa anch'esso un passo pari a 32 pixel. Se decido di dimezzare tale passo, allora i tile del livello si muoveranno
    sempre di 32pixel, ma ogni due passi del player.
    Player e tile del livello sono legati come visto sopra.
Devi accedere o registrarti per scrivere nel forum
6 risposte