Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Продолжим изучение actionScript 3.0. В этом выпуске рассмотрим: создание и использование классов, вспомним тригонометрию. Будем рисовать геометрические фигуры: прямоугольник и окружность.


Здравствуйте, уважаемые читатели!

Продолжим изучение actionScript 3.0. В этом выпуске рассмотрим: создание и использование классов, вспомним тригонометрию. Будем рисовать геометрические фигуры: прямоугольник и окружность. Используем простую заливку. Нарисуем треугольник с помощью линий. Используем текстовые поля. Заставим треугольники вращаться. Наверное, Вы уже догадались, что сегодня мы построим стрелочные часы.

Джоб Макар советовал начинать знакомство с  программированием игр с тригонометрии и физики. Мы увидим, как с помощью тригонометрических функций можно аккуратно расставить объекты по окружности.


Создайте новый проект, присвойте ему имя ArrowWatch.

Ниже следует текст главного модуля с подробными комментариями:

// Стрелочные часы. Класс ArrowWatch, дополнительные классы: Cif и Arr

// Экземпляр класса Cif - число в кружочке.

// Экземпляр класса Arr - вытянутый треугольник с заливкой (стрелка)

package {

[swf(width=200, height=200, backgrounColor="#FFFFFF")] //Установка начальных параметров

//параметр backGroundColor описан, но влияния не оказывает.

// поэтому задаем цвет приложения с помощью заливки.

import flash.display.GradientType; //Ссылки на библиотеки, как правило, подставляются автоматически

import flash.display.Sprite;

import flash.events.TimerEvent;

import flash.geom.Matrix;

import flash.utils.Timer;

public class ArrowWatch extends Sprite

{

public const RAD:uint = 90; // Имена констант принято писать заглавными буквами

public const WH:uint = 200;

public const DWH:uint = 20;

private var _rcir:uint; // Имена закрытых переменных принято начинать со знака _

private var _center:uint = DWH + WH / 2;

private var _harr:Arr;

private var _marr:Arr;

private var _sarr:Arr;

private var _hcr:Number

private var _timer:Timer = new Timer(1000); // Таймер с периодом 1000 мс = 1 секунда

public function ArrowWatch()

{

_rcir = RAD / 8; // радиус окружности вокруг цифры

_hcr = 3 / 360; // На столько градусов сдвигается часовая стрелка за одну секунду

graphics.lineStyle(4,0); //стиль линии 4 пикселя, черная

graphics.beginFill(0xFFFFFF); // Перед рисованием заливаемой формы вызывают этот метод

graphics.drawRect(DWH,DWH,WH,WH); // Рисуем квадрат от тодки (DWH,DWH) высотой и шириной WH

graphics.endFill(); // Этот метод завершает заливку формы

graphics.drawCircle(_center,_center,RAD); // Рисуем окружность

var rvect:uint = RAD - _rcir - 5; // Радиус - вектор

var beta:Number = Math.PI / 6; // Начальный угол (расположение числа 1 на циферблате

for (var i:uint = 1;i<=12;i++){ // Цикл: создание объектов Cif

new Cif(this,_rcir,_center+rvect*Math.sin(beta),_center-rvect*Math.cos(beta),i);

beta+=Math.PI / 6; // Новое значение угла

}

_harr = new Arr(this,_center,_center,10,RAD-40,0); //Создание объектов - стрелок

_marr = new Arr(this,_center,_center,8,RAD-30,0);

_sarr = new Arr(this,_center,_center,4,RAD-10,0xFF0000);

_harr.rotation = _marr.rotation = _sarr.rotation = 0; // Установка стрелов на 12 часов

centerCircle(_rcir,0xFF0000,0x0000FF,50,100); // рисуем центральный круг

_timer.addEventListener(TimerEvent.TIMER,_tick); // Назначаем обработчик события "тик таймера"

_initTime(); //Начальное положение стрелок

_timer.start(); // Запуск таймера

}

private function centerCircle(rad:uint,col1:uint,col2:uint,alpha1:uint,alpha2:uint):void{

var c_circ:Sprite = new Sprite(); //С этой функцией еще надо поработать. Заливка - не такая, как я планировал

var matrix:Matrix = new Matrix();

matrix.createGradientBox(rad,rad,0,rad/2,rad/2);

var colors:Array = [col1,col2];

var alphas:Array = [alpha1,alpha2];

var ratios:Array = [0,0xFF];

with (c_circ.graphics){

lineStyle(1);

beginGradientFill(GradientType.LINEAR,colors,alphas,ratios,matrix);

drawCircle(_center,_center,rad);

endFill();

}

addChild(c_circ);

}

private function _initTime():void{ // Начальное положение стрелок

var dat:Date = new Date();

_harr.rotation = dat.hours * 30 + dat.minutes * 0.5 + dat.seconds * _hcr;

_marr.rotation = dat.minutes * 6 + dat.seconds * .2;

_sarr.rotation = dat.seconds * 6;

}

private function _tick(E:TimerEvent):void{ //За одну секунду

_sarr.rotation += 6; //секундная стрелка перемещается на 6 градусов

_marr.rotation += .1; //минутная на 0,1 градуса

_harr.rotation += _hcr; //часовая - на эту величину.

}

}

}

Текст модуля Cif:

// Класс Cif описывает объект, состоящий из окружности и надписи

// Экземпляры класса используются в модели стрелочных часов.

package{

import flash.display.Sprite;

import flash.text.TextField;

import flash.text.TextFormat;

import flash.text.TextFieldAutoSize;

public class Cif extends Sprite{

private var _format:TextFormat = new TextFormat("Arial",12,0,true);

public function Cif(pa:Object,rad:uint,xx:uint,yy:uint,nn:uint){

pa.addChild(this);

var cf:TextField = new TextField();

cf.width =cf.height = rad*2-2;

cf.x = xx-cf.width / 2;

cf.y = yy-cf.height /2;

cf.text = nn.toString();

cf.setTextFormat(_format);

cf.autoSize = TextFieldAutoSize.CENTER;

graphics.lineStyle(1,0);

graphics.drawCircle(xx,yy,rad);

addChild(cf);

}

}

}

 

 


А вот и текст модуля Arr:

/ Рисует залитый треугольник

package{

import flash.display.Sprite;

import flash.display.Graphics;

public class Arr extends Sprite{

public function Arr(pa:Object,xx:uint,yy:uint,ww:uint,hh:uint,clr:uint){

pa.addChild(this);

//Рисуем треугольник

with(graphics){

lineStyle(1,clr);

moveTo(0, 0);

beginFill(clr);

lineTo(-ww / 2,0);

lineTo(0,  - hh);

lineTo(ww / 2, 0);

lineTo(0, 0);

endFill();

}

x = xx; // и смещаем его в нужную позицию

y = yy;

}

}

}


 

 


В избранное