Вступление
Примеры Словарь Вопросы



Sun Microsystems

Примеры программирования на Java

Космос
(space.java)

Описание апплета
Пример работы апплета
import java.applet.*;
import java.awt.*;

//========================================
	class Coordinate
// Для начала в программе объявляется новый класс Coordinate,
//  который  содержит координаты x и y. Используя обьекты класса Coordinate,
// можно хранить координаты объекта. Функция-конструктор класса использует 
// значения его параметров для ввода переменных координат:
	 {
	   public int x;
	   public int y;
	   
	    public Coordinate(int x, int y)
	    
	     { 
// Параметры функции-конструктора тоже называются х и у, как и переменные- 
// члены класса. Для различия между ними используется ключевое слово this.
// Функцию-конструктор можно было бы описать и так:
//  public Coordinate(int a, int b)
//           {
//            x = a;
// 	      y = b;
//	     }

	     this.x = x;
	     this.y = y;
	     }
	 }
//============================================

public class space extends Applet implements Runnable

  {
    
     Graphics g;
     
     Image background; // Здесь будет храниться картинка фона
     Image home; // В этой переменной будет содержаться движущейся объект
    
    
     Coordinate coordinate;
    
     Thread thread; // переменная типа Поток
    
     
     int width; // Данные переменные хранят ширину и
     int height; //  высоту фонового изображения 
	
     int count; // Здесь фиксируется число загруженных изображений
     int grad;  // Вспомогательная переменная. Она используется при 
     // формировании траектории дыижения корабля 
     
     boolean done_loading = false;
    
     
//=====================================================================

	public void init()
 	{
 	  
 	   g = getGraphics();
 	   // Получение изображения для фона и объекта из файлов
 	   background = getImage(getCodeBase(), "space.jpg");
 	   home = getImage(getCodeBase(), "salyut.gif");
 	   
 	    width = size().width;
 	    height = size().height;
 	   
 	   get_coordinate();
	   repaint();
 	   
 	   // Создается изображение вне экрана ( createImage), а
	   // затем выводится на экран функцией drawImage.
	   Image offScrImage = createImage(width, height);
 	   Graphics offScrGC = offScrImage.getGraphics();
	   offScrGC.drawImage(background, 0, 0, this);
	   
	 	  
 
 	}
//==========================================================================
public void start() // Запуск потока
	
	{
	   if (thread == null)
	   (new Thread(this)).start();
	}
//===========================================================================
 public void delay () // функция задержки
  { 
  try
              {
                Thread.sleep(10);
              }
            catch (InterruptedException e)
              {
              }
  
  
  }


//=======================================================================
void get_coordinate()
  {
     // Начальное положение объекта
     coordinate = new Coordinate(100, 100);
   }

//========================================================
	void move()
   {
  
   if (count > 1 ) // Когда все изображения загружены в память можно
   // начинать движение
     {
   int old_x = coordinate.x;//Сохранение координат предыдущего ("старого")
   int old_y = coordinate.y;// местоположения
   
   int dx = (int) (Math.random() * 2); //dx и dy -- приращение координат.
   int dy = (int) (Math.random() * 2); // Они могут принимать значения  0, 1

switch ( grad%4) // Формирование траектории
       {
      case 1:
      dy = -dy;
      break;
      case 2:
      dx = -dx;
      dy = -dy;
      break;
      case 3:
      dx = -dx;
      break;
       }
    
  
     int new_x = old_x + dx; // Вычисление "новых" координат
     int new_y = old_y + dy;
   
   // При удалении объекта  необходимо восстановить "старое" фоновое
   // изображение. Для этого достаточно перерисовать только 
   // невидимую часть. Для этого создается копия графического
   // контекста g2.
   
     Graphics g2;
     g2 = g.create();
     
   // Затем clipRect создает  прямоугольник отсечения ( там где раньшеЂ
   // было изображение объекта )	
     g2.clipRect(coordinate.x, coordinate.y,home.getWidth(null) ,home.getHeight(null) );
    
  // Если "новое" изображение объекта попадает полностью в границы
  // аплета, то новые координаты становяться текущими. Затем восстанавливается
  // фоновое изображение и выводиться объект уже в новом месте с координатами
  // new_x и new_y
    
    if ( ((new_x > 0) & (new_x < (width -home.getWidth(this )))) & ((new_y > 0) & (new_y < (height - home.getHeight(this)))))
    {  
     coordinate.x = new_x;
     coordinate.y = new_y;
    
     
     g2.drawImage(background, 0, 0, null); 
     g.drawImage (home, coordinate.x, coordinate.y,  this);
     
    }
    else 
   grad ++; 
     
  }
    
  
 }
//=====================================================================  
public void run()
	{
	 while (true) // Работает пока запущен аплет
	 {
	 move();
	 delay();
	 }	
	}

//=====================================================================

public boolean imageUpdate ( Image img, int infoflags, int x, int y,
					int w, int h)
	   {
	      // Пока фоновое изображение загружается, параметр
	      // infoflags не равен ALLBITS. Переменная done_loading
	      // равна false, и в строке статуса Вы видите Loading
	       if (infoflags == ALLBITS)
	        {
	          done_loading = true;
	         count ++;
	          repaint();
	         
	          return false;
	        }
	      else 
	          {
	          showStatus ("Loading");
	          return true;
	 	  }  
	   }
	   
	   
//======================================================

public void paint (Graphics _g)
	  
	  {
	     if (!done_loading)
	       showStatus ("Loading");
	  else     
	{
	showStatus ("OK");
	g.drawImage (background, 0, 0, this);
        g.drawImage (home, coordinate.x, coordinate.y, this);
        }
    } 
 	   
//==============================================
 }   Ѓ