Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    19

    Muovere immagini in un frame

    Salve ho un problema, mi servirebbe un algoritmo per muovere un immagine all'interno di un frame tramite i tasti direzionali. Vorrei creare un gioco, però sto bloccato su questo particolare importante

  2. #2
    secondo il regolamento è vietato chiedere algoritmi completi, ti possiamo solo dare dei consigli e delle possibili implementazioni, magari con spezzoni di codici.

    Devi prima fare lo scheletro del programma, arrivare al problema, e discuterlo qui, completo di CODICE

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    19
    sisi scusami ma alla fine in pratica è più un consiglio quello che cerco, l'algoritmo me lo scrivo io XD il mio problrms sta nel fatto che il movimento dell'immagine deve seguire alcuni criteri che non riesco ad applicare. in pratica vorrei che la mia immagine, quando tengo premuto il tasto direzionale, si sposti lentamente all'interno del frame

  4. #4
    Cancellarla e rimetterla in un'altra posizione.


    Ma se vuoi fare un gioco usando le primitive grafiche, per di più con java, capirai che deve essere un gioco semplicissimo (già questa cosa che chiedi è uno "sprite", e già se non usi opengl o directx saranno lentissimi).

    Comunque....quello che devi fare è tenere traccia della posizione dell'immagine con delle variabili, modificarle quando si premono i tasti direzionali e quindi far chiamare indirettamente il metodo JFrame.paint(Graphics g) che fa le dovute operazioni.

    Per darti un'idea di quanto deve esssere semplice...qui c'è un tetris scritto da me in java, utlizzando solo le primitive grafiche:
    http://newbufferedwriter.blogspot.it...di-tetris.html

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    19
    grazie per il link, per essere chiari fino a quel punto ci sono arrivato e funzionava anche, ma sussiste il problema che se tengo premuto un tasto direzionale la mia immagine si deve cmq spostare lentamente e nn muoversi a velocità supersoniche XD

  6. #6
    ma dipende dal passo che gli dai! Comunque se non posti codice non posso aiutarti

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    19
    allora devo riscrivere prima il codice perchè lo tengo nell'altro portatile che praticamente è fuori uso

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    19
    ho trovato il codice adesso lo posto, spero qualcuno riesca ad aiutarmi

    codice:
    package Immagini;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    
    public class MovimentoFrame extends JFrame{
    	public static final int MILLISECONDI = 100;
    	public static final int SPRITE_DIM = 32;
    	public static final int COLONNE = 20;
    	public static final int RIGHE = 20;
    	public static final int APPLET_WIDTH = RIGHE*SPRITE_DIM;
    	public static final int APPLET_HEIGHT = COLONNE*SPRITE_DIM;
    	public static final int JUMP = SPRITE_DIM;
    	private JLabel[] arraylabel;
    	private ImageIcon imgPers;
    	private JLabel labelPers;
    	private JPanel jp;
    	private boolean isControlled=true;
    	private int x;
    	private int y;
    	private int inc_x;
    	private int inc_y;
    	private Timer timer;
    	private Image image;
    	private ImageIcon immagine;
    	private ImageIcon imgTexture;
    	
    	public MovimentoFrame(int x0, int y0){
    		x=x0;
    		y=y0;
    		inc_x=inc_y=0;
    		
    		try {
    			image = ImageIO.read(new File("/home/vincenzo/Scrivania/grass09.jpg"));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		getContentPane().setLayout(null); //tolgo il LayoutManager predefinito
    		getContentPane().setPreferredSize(new Dimension(APPLET_WIDTH, APPLET_HEIGHT));
    		imgPers = new ImageIcon("/home/vincenzo/Scrivania/persT.PNG");
    		labelPers = new JLabel(imgPers);
    		labelPers.setBounds(0, 0, 32, 32); // Imposto posizione e dimensione del mio JTextPane
    		labelPers.setOpaque(false);
    		jp = new BackgroundPanel(image);
    		jp.setLayout(null);
    		jp.setBounds(0, 0, APPLET_WIDTH, APPLET_HEIGHT); // Imposto posizione e dimensione del mio JPanel
    		//getContentPane().add(labelPers);
    		jp.add(labelPers);//
    		createImageIcon();
    		createPanelImage();
    		getContentPane().add(jp); 
    		addKeyListener(new DirectionKeyListener());
    	    timer = new Timer(MILLISECONDI, new ActionListener() {
    	            public void actionPerformed(ActionEvent evt) {
    	                int x1 = x + inc_x;
    	                int y1 = y + inc_y;
    	                if ((x1>=0) && (x1<APPLET_WIDTH))
    	                    x=x1;
    	                if ((y1>=0) && (y1<APPLET_HEIGHT))
    	                    y=y1;
    	                aggiorna();
    	            }
    	        });
    	}
    	private class DirectionKeyListener extends KeyAdapter {
    		//Spostiamo l'immagine a seconda dell'evento della tastiera
            public void keyPressed(KeyEvent event) {
            	
                switch (event.getKeyCode()) {
                    case KeyEvent.VK_UP:
                        inc_y=-JUMP;
                        isControlled=false;
                        break;
                    case KeyEvent.VK_DOWN:
                        inc_y=JUMP;
                        isControlled=false;
                        break;
                    case KeyEvent.VK_LEFT:
                        inc_x=-JUMP;
                        isControlled=false;
                        break;
                    case KeyEvent.VK_RIGHT:
                        inc_x=JUMP;
                        isControlled=false;
                        break;
                    default:
                    	break;
                }       
                
            }
            
            public void keyReleased(KeyEvent event) {
                
              switch (event.getKeyCode()) {
                    case KeyEvent.VK_UP:
                    case KeyEvent.VK_DOWN:
                        inc_y=0;
                        break;
                    case KeyEvent.VK_LEFT:
                    case KeyEvent.VK_RIGHT:
                        inc_x=0;
                        break;
                }
            }
        }
    	public void aggiorna() {
    	
    		labelPers.setBounds(x, y,32,32);
    		if(!isControlled)
    			controll();
    		repaint();
    	}
    	
    	public void controll(){
    		for(int i=0;i<RIGHE;i++)
    			if(labelPers.getLocationOnScreen().equals(arraylabel[i].getLocationOnScreen())){
    				System.out.println(arraylabel[i].getX()+" "+arraylabel[i].getY());
    				
    				break;
    		}
    		isControlled = true;
    	}
    	class BackgroundPanel extends JPanel
    	{
    	    private Image img;
    
    	    public BackgroundPanel (Image img)
    	    {
    	        super (new BorderLayout ());
    	        this.img = img;
    	    }
    
    	    public void paintComponent (Graphics g)
    	    {
    	        super.paintComponent (g);
    
    	        g.drawImage (img, 0, 0, this);
    	    }
    	}
    	
    	private void createImageIcon() {
    		int i;
    		int j;
    		
    		arraylabel = new JLabel[RIGHE];
    		imgTexture = new ImageIcon("/home/vincenzo/Scrivania/erbaTR.PNG");
    		for(i=0;i<RIGHE;i++){
    				arraylabel[i]= new JLabel(imgTexture);
    				arraylabel[i].setSize(32,32);
    				//arraylabel[i].setBounds(i*JUMP, JUMP*4, 32, 32);
    			}
    	}
    	private void createPanelImage(){
    		//for(int i=0;i<RIGHE;i++)
    			//	jp.add(arraylabel[i]);
    		for(int i=0;i<RIGHE;i++){
    			arraylabel[i].setBounds(i*JUMP, JUMP*5, 32, 32);
    			jp.add(arraylabel[i]);
    		}
    				
    	}
    	public static void main(String[] args) {
            MovimentoFrame c= new MovimentoFrame(0,0);
            c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            c.pack();
            c.setResizable(false);
            c.setVisible(true);
            c.timer.start();
            c.setLocationRelativeTo(null);
            System.out.println(c.getSize());
        }
    	
    }

  9. #9
    public static final int JUMP = SPRITE_DIM;


    prova ad assegnargli 1 invece, o comunque un numero inferiore a SPRITE_DIM che è 32.
    fai le prove...1....o 5...o 10 . COn 32 certo che ti va veloce

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    19
    ma a me sta bene che si muova di 32 pixel a ogni click. In effetti il codice che ho postato fa quello che voglio ma non in modo efficiente... Qualcuno di voi mi sà dire se esiste un modo più efficiente per muovere questa immagine, qualche miglioria al mio codice? Grazie

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.