Java-апплеты и интеллектуальный баннер

Ну, вот допустим, Вы большой поклонник собак, кошек, рыбок, змеек и других разного рода милых домашних любимцев и когда Ваш «живой уголок» достигает внушительных размеров, Вы решаете поведать о нем всему миру. Как это лучше всего сделать? Конечно же, через Интернет и Вы изготавливаете сайт посвященный Вашим питомцам и размещаете его в Сети. Но чтобы о них узнал весь мир одного этого факта еще мало – если Вы не примете специальных мер к «раскрутке» своего сайта о нем будете знать только Вы ну и может быть еще Ваши ближайшие друзья, которым Вы о нем расскажете, но которые и так, скорее всего, имеют возможность наблюдать Ваш «зверинец» живьем. Одним из способов такой «раскрутки» является размещение на тех или иных условиях своих баннеров на других сайтах на данный момент более популярных, чем Ваш, и, конечно же, чем более интересен,  будет Ваш баннер, тем больше вероятность, что кто-либо из посетителей того сайта «кликнет» по нему и посетит Ваш сайт. Вот такой баннер мы сейчас и изготовим, используя такое мощное средство как язык Java.

Конечно же, наш баннер будет производным от Java-класса Applet – практически единственного ее класса обращения, к которому можно вставлять непосредственно в HTML код. Для начала опишем, какие стандартные пакеты Java мы будем импортировать (т.е. заимствовать): Конечно же, это будет пакет applet содержащий описание средств Java как раз для класса Applet и предназначенных -

import java.applet.*;

пакет awt содержащий подавляющее большинство ее изобразительных средств -

import java.awt.*;

и пакет net содержащий средства Java для работы с Интернет -

import java.net.*;

Ну а собственно «заголовок» нашего класса (т.е. нашего баннера) будет выглядеть так:

public class MyBanner extends Applet implements Runnable

{

Здесь говорится, что наш класс (class) будет «публичным» (public), т.е. к нему смогут обращаться все, у кого возникнет такая потребность, будет называться MyBanner (Ну а как же еще?), будет являться (как мы и говорили) расширением (extends) стандартного Java-класса Applet и будет реализовывать (implements) стандартный Java-интерфейс Runnable который позволит нашему классу выполняться одновременно в нескольких потоках (нитях) (Thread) и на этом мы в свое время остановимся подробнее.

Опишем теперь переменные, которые будут нужны нам в нашем апплете. Вообще говоря, Java не предъявляет сколь либо жестких требований к тому месту в программе, в котором находится описание той или иной переменной – оно может находиться практически в любом месте до первого использования этой переменной и даже может быть совмещено с ним, однако я считаю хорошим тоном программирования сделать это в начале соответствующей «структурной единицы» (класса, функции и т.п.) что способствует читабельности программы.

Итак:

  private final String  strTexts[] = {"Мои собаки", "Мои кошки", "Мои рыбки"}, strFont = "Arial";

  private final int nTexts = strTexts.length, nStars = 250, nDelay = 50, nDepartFactor = 2, nStopFactor = 20;

  private final double  defddx = 0.0050000000000000001D, max = 0.10000000000000001D;

  private int wFull, hFull, wHalf, hHalf, iText, nFont, nFactor;

  private int xStar[] = new int[nStars], yStar[] = new int[nStars], zStar[] = new int[nStars];

  private double  dx, ddx, rot;

  private Font  fntTexts;

  private Image imgFull;

  private Graphics  gFull;

  private Thread  trdPict;

Подробно на смысле каждой из этих переменных я остановлюсь тогда, когда у нас возникнет необходимость в ней, здесь же я отмечу только их общие черты, которые заключаются, во-первых, в том, что все эти переменные описаны как «приватные» (private) т.е. доступные только внутри нашего класса, а во-вторых, некоторые из них описаны как «финальные» (final) т.е. такие значения, которых не могут изменяться в дальнейшем и которые, следовательно, являются отнюдь не переменными, а совсем даже наоборот – постоянными (константами).

Теперь, когда мы запаслись достаточным количеством переменных и констант можно перейти непосредственно к алгоритму нашего апплета, но прежде я хочу остановиться вот на каком моменте: В любом апплете есть несколько функций, которые Java-система стан дартно вызывает в начале его работы, однако для удобства рассмотрения его алгоритма мы начнем не с них а «с конца» с функции рисования в области нашего апплета, тем более что Java и здесь не предъявляет каких-либо требований к текстуальному расположению этих функций друг относительно друга (хотя конечно в окончательном тексте программы функции вызываемые раньше удобнее располагать «выше» по тексту).

И тут возникает очень существенный вопрос: А что же собственно мы собирается рисовать? Дело в том, что практически все алгоритмы создающие красивые визуальные эффекты весьма громоздки, запутаны, нелогичны и тем самым очень мало подходят для первого знакомства с возможностями Java-апплетов. Решая этот вопрос, я остановился на алгоритме изображающем звездное небо, летящее из центра навстречу зрителю. Решение, конечно же, более чем сомнительное с содержательной точки зрения – ведь мы делаем баннер сайта посвященного Вашему «зоопарку» в котором как мне представляется, Вы разводите не маленьких зелененьких человечков, а обычных земных животных, однако более чем логичное в том смысле, что выбранный алгоритм является одним из простейших среди равных ему по красоте. Ну а некоторая загадочность получившегося в результате баннера может даже сослужить Вам хорошую службу, поскольку кого-то эта загадочность может как раз и заинтересовать.

Итак, как я уже сказал, начнем мы рассмотрение программы нашего баннера с функции осуществляющей рисование в нем, заголовок которой выглядит следующим образом:

  public void paint(Graphics g)

  {

Эта функция так и называемая «рисование» («paint») описана у нас как «публичная» (public), т.е. к ней смогут обращаться все, у кого возникнет такая потребность в частности и Java-система (а именно так оно и будет), «пустая» (void), т.е. не возвращающая никакого значения и имеющая один параметр «g» стандартного Java класса «Графический контекст» (Graphics). Как уже было отмечено, эта функция относится к стандартно вызываемым Java-системой и поэтому единственное, что мы можем свободно выбрать в ее заголовке это имя ее параметра – «g».

Первое что мы сделаем в ней - это создадим «большую картинку», которая собственно и будет изображением нашего баннера, и здесь я хочу отметить следующий момент: На мой взгляд, одним из факторов мощности изобразительных средств Java является возможность включения операторов присваивания внутрь других выражений, что позволяет очень компактным образом описывать сразу целую группу действий. Итак:

    gFull = (imgFull = createImage(wFull = size().width, hFull = size().height)).getGraphics();

Здесь мы сделали следующее:

§       При помощи стандартной функции size() определи ширину – width и высоту – height нашего баннера и запомнили их значения в переменных wFull и hFull соответственно, которые, как Вы, конечно же, помните, мы описали еще в начале нашего апплета как имеющие «целые» (int) значения.

§       Создали при помощи стандартной функции createImage, как и собирались «большую картинку» которая будет содержать изображение нашего баннера и запомнили ее в переменной imgFull также описанной нами в начале нашего апплета, но только имеющей тип «Картинка» (Image);

§       При помощи другой стандартной функции getGraphics() получили графический контекст созданной нами «большой картинки» и запомнили его в переменной gFull соответствующего типа, которая тоже была описана нами в начале нашего апплета.

Прежде чем пойти дальше введем две вспомогательные переменные wHalf и hHalf, которые также как и переменные wFull и hFull были описаны в начале нашего апплета как имеющие «целый» (int) тип и которые будут равны половине переменных wFull и hFull соответственно и, следовательно, указывают на центр нашего баннера.

    wHalf = wFull / 2;

    hHalf = hFull / 2;

Теперь определим начальное расположение наших «звезд» сделав это в цикле по целой переменной i, которая будет пробегать у нас значение от 0 (напомню, что в Java элементы массивов нумеруются с 0) до количества наших «звезд» определенного еще в начале нашего апплета в постоянной nStars:

    for(int i = 0; i < nStars; i++) {

      xStar[i] = (int)(Math.random() * (double)wFull) - wHalf;

      yStar[i] = (int)(Math.random() * (double)hFull) - hHalf;

      zStar[i] = (int)(Math.random() * 100D);

    }

Координаты X и Y (элементы массивов xStar и yStar соответственно) для всех «звезд» формируются единообразно путем умножения ширины нашего баннера (wFull) - для координаты X и его высоты (hFull) - для координаты Y на значение стандартной функции random() Java-класса «Математика» (Math) которое является случайным числом в интервале от 0 до 1, в результате чего наши «звезды» оказываются распределенными случайным образом по всей площади нашего «неба». Ну а чтобы наши «звезды» оказались размешенными не относительно начала координат, которое для любого апплета находиться в его левом верхнем углу, а относительно его центра мы еще и «сдвинем» полученные значения на величины wHalf (половина ширины апплета) и hHalf (половина высоты апплета) по координатам X и Y соответственно.

Что же касается координаты Z (элемента массива zStar) наших «звезд» т.е. их удаления от зрителя, то она формируется с использованием все той же функции random() и может изменяться от 0 до 100 некоторых условных единиц (не путайте, пожалуйста, с «у.е.» в которых сейчас принято указывать цену многих товаров).

Ну, вот, а теперь нам нужно «всего лишь» прорисовать наше «звездное небо» при помощи функции DrawFull, на которой мы подробно остановимся несколько позднее

    DrawFull(g);

и... нам осталось только начать и кончить «разборку» с нашим апплетом. Но с чем мы действительно покончили – так это с нашей функцией paint.

  }

С функцией рисования paint мы действительно покончили но, скорее всего Вы обратили внимание на то, что если бы мы просто ограничились ею, то мы бы получили хотя и размещенные случайным образом, но статичные «звезды» а ведь мы собирались сделать так чтобы они «летели» навстречу зрителю.

Совершенно ясно, что для этого нужно что-то динамически менять в нашей картинке через некоторые достаточно небольшие промежутки времени и действительно в Java существует для этого механизм называемый потоками, когда ее программа как бы разделяется на несколько частей – этих самых потоков, которые выполняются параллельно т.е. в некотором роде одновременно не мешая, друг другу. На то, что класс, входящий в программу будет выполняться именно как потоковый, указывает описание, что он реализует стандартный Java-интерфейс Runnable в заголовке этого класса, а как Вы, конечно же, помните, именно так мы описали класс нашего баннера.

Продолжение следует

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Дата публикации:
Автор публикации: