Narzędzia użytkownika

Narzędzia witryny


Action disabled: source
java:java09

Programowanie grafiki - interaktywność i animacja

Wprowadzenie

Zestaw ilustruje wykorzystanie interfejsu MouseMotionListener w celu obsługi zdarzeń myszy (interaktywność) oraz wykorzystania dodatkowego wątku w celu zrealizowania animacji.

Przykład I

Poniżej znajdziesz przykład ilustrujący wykorzystanie podejścia obiektowego do programowania grafiki interaktywnej. Zidentyfikuj składowe klas, przeanalizuj cel ich użycia oraz składnię, a także przeanalizuj dokumentację dotyczącą każdej spośród wykorzystanych klas bibliotecznych. Odpowiedz na pytanie w jakim celu i w jaki sposób został tutaj wykorzystany mechanizm dziedziczenia. Zestaw odpowiednią jednostkę kompilacji i przetestuj przykład.

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
class Kulka extends Ellipse2D.Float
{
   Plansza p;
   int dx,dy;
 
   Kulka(Plansza p,int x,int y,int dx,int dy) 
   {                                          
      this.x=x;                               
      this.y=y;                               
      this.width=10;                          
      this.height=10;                         
 
      this.p=p;                               
      this.dx=dx;                             
      this.dy=dy;                             
   }                                          
 
   void nextKrok()                                        
   {                                                     
      x+=dx;                                             
      y+=dy;                                             
 
      if(getMinX()<0 || getMaxX()>p.getWidth())  dx=-dx; 
      if(getMinY()<0 || getMaxY()>p.getHeight()) dy=-dy; 
 
      p.repaint(); 
      Toolkit.getDefaultToolkit().sync();                                      
   }                                                     
}
class SilnikKulki extends Thread
{
   Kulka a;
 
   SilnikKulki(Kulka a) 
   {                    
      this.a=a;         
      start();          
   }                    
 
   public void run()                   
   {                                  
      try                             
      {                               
         while(true)                  
         {                            
            a.nextKrok();             
            sleep(15);                
         }                            
      }                               
      catch(InterruptedException e){} 
   }                                  
}
class Belka extends Rectangle2D.Float
{
   Belka(int x)       
   {                  
      this.x=x;       
      this.y=170;     
      this.width=60;  
      this.height=10; 
   }                  
 
   void setX(int x) 
   {                
      this.x=x;     
   }                
}
class Plansza extends JPanel implements MouseMotionListener
{
   Belka b;
   Kulka a;
   SilnikKulki s;
 
   Plansza()                         
   {                                 
      super();                       
      addMouseMotionListener(this);  
 
      b=new Belka(100);              
      a=new Kulka(this,100,100,1,1); 
      s=new SilnikKulki(a);          
   }                                 
 
   public void paintComponent(Graphics g) 
   {                                      
      super.paintComponent(g);            
      Graphics2D g2d=(Graphics2D)g;       
 
      g2d.fill(a);                        
      g2d.fill(b);                        
   }                                      
 
   public void mouseMoved(MouseEvent e) 
   {                                    
      b.setX(e.getX()-50);              
      repaint();                        
   }                                    
 
   public void mouseDragged(MouseEvent e) 
   {                                      
 
   }                                      
}
public class Program
{
   public static void main(String[] args)                       
   {                                                           
      javax.swing.SwingUtilities.invokeLater(new Runnable()    
      {                                                        
         public void run()                                     
         {                                                     
            Plansza p;                                         
            p=new Plansza();                                   
 
            JFrame jf=new JFrame();                            
            jf.add(p);                                         
 
            jf.setTitle("Test grafiki");                       
            jf.setSize(400,370);                               
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            jf.setVisible(true);                               
         }                                                     
      });                                                      
   }                                                           
}

ćw. 9.1
Rozwiń powyższy przykład dodając odbicie kulki od belki. W tym celu posłuż się dokumentacją odpowiednich klas bibliotecznych (Rectangle2D.Float i Elipse2D.Float) - znajdź odpowiednie metody i wykorzystaj je w celu wykrycie zderzenia pomiędzy tymi obiektami.

ćw. 9.2
Rozwiń przykład dodając do planszy cegiełki. Możesz w tym celu napisać nową klasę o nazwie na przykład Cegielka rozszerzającą klasę Rectangle2D.Float z pakietu Java2D. Referencje do obiektów reprezentujących cegiełki możesz przechowywać w odpowiedniej tablicy albo za pomocą bibliotecznej implementacji listy java.util.ArrayList (pierwsze rozwiązanie jest szybsze). Zastanów się jak zoptymalizować algorytm wykrywania kolizji kulki z dużą ilością cegiełek.

ćw. 3.3
Zaimplementuj operacje zbijania cegiełek oraz zliczania punktów. Analogicznie jak poprzednio, wykrywanie zderzeń możesz zaimplementować wykorzystując odpowiednie metody klas Kulka lub Cegielka, które te klasy odziedziczyły po swoich klasach bazowych (Rectangle2D.Float i Ellipse2D.Float).

ćw. 3.4
Zmodyfikuj operację odbicia kulki od belki w taki sposób żeby odbicie następowało pod ostrzejszym kątem jeżeli kulka nie zostanie odbita centralną częścią belki (pamiętaj o przeskalowaniu wektora prędkości w taki sposób, żeby odbicie nie powodowało zmiany wartości bezwzględnej prędkości, czyli inaczej mówiąc nie zmieniało energii kinetycznej kulki).

ćw. 3.5
Zaimplementuj system zliczania punktów oraz rozwiń przykład dodając kolory, grafiki lub zdjęcia. Możesz także dodać efekty dźwiękowe.

ćw. 3.6
Rozwiń przykład poprzez dodanie kilku plansz odpowiadających kolejnym poziomom o rosnącej skali trudności. Dodaj system przeszkód oraz bonusów.

Przykład II

Pracując w parach zaprojektuj grę zręcznościową według własnego pomysłu. Sporządź listę klas, określ zależności pomiędzy nimi oraz metody jakie musiał byś zaimplementować w każdej z nich.

ćw. 3.7
Wykorzystując umiejętności w zakresie projektowania obiektowego oraz umiejętności w zakresie programowania interaktywnej grafiki zaprojektuj i napisz implementację symulacji korków w ruchu drogowym. Możesz w tym celu wykorzystać automat komórkowy działający według następujących reguł:

- droga to ciąg komórek
- każdy pojazd zajmuje jedną komórkę
- każda komórka zawiera co najwyżej jeden pojazd
- prędkość pojazdu zawiera się w przedziale 0-5 komórek na krok czasowy
- jeżeli pojazd ma prędkość <5, to w każdym kroku czasowym przyspiesza o 1, aż do osiągnięcia prędkości 5
- jeżeli odległość do pojazdu poprzedzającego wynosi d, pojazd zwalnia do d-1, żeby uniknąć zderzenia
- z pewnym prawdopodobieństwem, niektóre samochody zwalniają bez żadnej zewnętrznej przyczyny

Zauważ że korki na drodze mogą powstawać także bez żadnej zewnętrznej przyczyny (przeszkody na drodze), mogą utrzymywać się długo po tym jak pojazd który go spowodował opuścił obszar korka, oraz mogą propagować się zarówno w kierunku ruchu pojazdów, jak i w kierunku przeciwnym. Przeprowadź symulacje dla różnych wartości obciążenia drogi oraz różnych wartości prawdopodobieństwa że dany pojazd zwolni bez żadnej zewnętrznej przyczyny.


Z. Dendzik, 2024

java/java09.txt · ostatnio zmienione: 2024/10/17 21:46 przez zbd