Consenso all'uso dei cookies

SITO1 -- SITO2 -- Forum1 -- CercaGlobale -- Informativa su Cookie e Privacy


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
JAVA animazione e collisione
#1
Sono riuscito ad animare una immagine e a controllare la collisione con un'altra, ovviamente scopiazzando dalla rete, si può fare di meglio e in modo più semplice ?
Codice:
package Collision;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
//import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Collision {

 public static void main(String[] args) {
   EventQueue.invokeLater(new Runnable() {
     @Override
     public void run() {
       JFrame frame = new JFrame();
     
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.add(new BackgroundPane());
       frame.pack();
       frame.setVisible(true);
       frame.setSize(100, 500);
     }
   });
 }
}

class BackgroundPane extends JPanel {
 private BufferedImage bg;
 private BufferedImage bg2;
 private int yOffset = 0;
 private int yDelta = 4; // velocità scorrimento
 Timer timer;

 public BackgroundPane() {
   try {
//     bg = ImageIO.read(new URL("http://www.java2s.com/style/download.png"));
       File file= new File("meteorite_01.gif");
       bg = ImageIO.read(file);
       file= new File("meteorite_02.gif");
       bg2 = ImageIO.read(file);
   } catch (Exception ex) {
     ex.printStackTrace();
   }

   timer = new Timer(40, new ActionListener() {
       
     @Override
     public void actionPerformed(ActionEvent e) {
       yOffset += yDelta; // muove l'oggetto
       if (yOffset > getHeight()) {
         yOffset = 0;
       }
       repaint();
     }
   });
   timer.start();
 }

 @Override
 public Dimension getPreferredSize() {
   return new Dimension(bg.getWidth(),bg.getHeight());
 }

 @Override
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   Graphics2D g2d = (Graphics2D) g.create();
   int bg2Y = 400;
   int xPos = (getWidth() - bg.getWidth()) / 2;
   int yPos = yOffset;
   g2d.drawImage(bg, xPos, yPos, this);
   g2d.drawImage(bg2, xPos, bg2Y, this); // meteoritr fisso
   Rectangle r1 = new Rectangle(xPos,yOffset,bg.getHeight(),bg.getWidth());
   Rectangle r2 = new Rectangle(xPos,bg2Y+5,bg2.getHeight(),bg2.getWidth());
   if (r1.intersects(r2)) {
//            yOffset = 0;
           timer.stop();
           setBackground(Color.RED);
   }
   g2d.dispose();
 }
}

P.S. mi piacerebbe poter muovere l'oggetto in basso col mouse, ma non so come fare


Allegati
.gif   meteorite_01.gif (Dimensione: 1,92 KB / Download: 43)
.gif   meteorite_02.gif (Dimensione: 2,13 KB / Download: 44)
Cita messaggio
Grazie da:
#2
sulle immagini non ti so dire, tuttavia per usare il mouse devi gestire un MouseEvent;
ti converrbbe comunque importare sia
import java.awt.event.*;
sia
import javax.swing.event.*;
così da poter gestire tutto o quasti.

In linea di massimo dovresti innanzitutto rilevare le coordinate del mouse (ci sono metodi appositi come getX() e getY() ), vedere se tali coordinate cadono in quelle della figura, se si, gestire l'evento MOUSE_DRAGGED (mouse trascinato), e l'evento MOUSE_RELEASED quando viene rilasciato (quando accade rilevare la nuova posizione del mouse e "mollare" l'immagine).
A questo punto però ti consiglierei anche di iscriverti ad un forum di programmazione o di sviluppo Java per ottenere miglior supporto
Il mio blog: ZEROZEROCENT.BLOGSPOT.COM
LEGGE DI MURPHY: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
VERSIONE QUANTISTICA DELLA LEGGE DI MURPHY: TUTTO VA MALE CONTEMPORANEAMENTE
Cita messaggio
Grazie da:
#3
grazie BAT, risolto così:
Codice:
package Collision;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
//import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.ImageIcon;

public class Collision {

 public static void main(String[] args) {
   EventQueue.invokeLater(new Runnable() {
     @Override
     public void run() {
       JFrame frame = new JFrame();
     
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.add(new BackgroundPane());
       frame.pack();
       frame.setVisible(true);
       frame.setSize(300, 500);
     }
   });
 }
}

class BackgroundPane extends JPanel {
 int maxX;
 public int xImage;
 private BufferedImage bg;
 private BufferedImage image;
 private int yOffset = 0;

 private int yDelta = 2; // velocità scorrimento
 Timer timer;
 int x,y,spostamento,hImage,wImage;
 public int mousepos;

 public BackgroundPane() {
     
   try {
//     bg = ImageIO.read(new URL("http://www.java2s.com/style/download.png"));
       File file= new File("meteorite_01.gif");
       bg = ImageIO.read(file);
       //file= new File("meteorite_02.gif");
       file= new File("astronave.gif");
       image = ImageIO.read(file);
       xImage = (getWidth() - image.getWidth()) / 2;
   } catch (Exception ex) {
     ex.printStackTrace();
   }

   wImage=image.getWidth();
   hImage=image.getHeight();
   addMouseMotionListener(new MouseMotionAdapter(){
   @Override
   public void mouseMoved(MouseEvent ev){
       mousepos = ev.getX();
   }
   });
   
   timer = new Timer(40, new ActionListener() {
       
     @Override
     public void actionPerformed(ActionEvent e) {
       yOffset += yDelta; // muove l'oggetto
       if (yOffset > getHeight()) {
         yOffset = 0;
       }
       
       xImage = mousepos;
       repaint();
     }
   });
   timer.start();
 }

 @Override
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   Graphics2D g2d = (Graphics2D) g.create();
   int bg2Y = 400;
   int xPos = (getWidth() - bg.getWidth()) / 2;
   int yPos = yOffset;
   g2d.drawImage(bg, xPos, yPos, this);
   g2d.drawImage(image, xImage , bg2Y, this); // meteoritr fisso
   Rectangle r1 = new Rectangle(xPos,yOffset,bg.getHeight(),bg.getWidth());
   Rectangle r2 = new Rectangle(xImage ,bg2Y+5,hImage,wImage);
   if (r1.intersects(r2)) {
       timer.stop();
       setBackground(Color.RED);
   }
   g2d.dispose();
 }
}
(26-10-2018,19:06 )BAT Ha scritto: A questo punto però ti consiglierei anche di iscriverti ad un forum di programmazione o di sviluppo Java per ottenere miglior supporto
quale mi consigli ?
Cita messaggio
Grazie da:
#4
stackoverflow è il migliore se non hai problemi con l'inglese
Il mio blog: ZEROZEROCENT.BLOGSPOT.COM
LEGGE DI MURPHY: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
VERSIONE QUANTISTICA DELLA LEGGE DI MURPHY: TUTTO VA MALE CONTEMPORANEAMENTE
Cita messaggio
Grazie da:
#5
Grazie del consiglio, l'ho provato con molta soddisfazione
Cita messaggio
Grazie da:


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)