Руководство по actionscript. часть 7, стр. 029
Листинг П.2. Класс VirtualPet
package zoo { import flash. utils.*; import flash. events.*;
// Класс VirtualPet представляет животное в зоопарке. Он расширяет класс // EventDispatcher. благодаря чему может являться получателем // события в процессе диспетчеризации, public class VirtualPet extends EventDispatcher { // ==СТАТИЧЕСКИЕ КОНСТАНТЫ==
// Типы событий, относящиеся к классу VirtualPet (обрабатываемые // объектом VirtualPetView. который отображает животное на экране) public static const NAME_CHANGE:String = «NAME_CHANGE»; public static const STATE_CHANGE;String = «STATE_CHANGE»;
// Состояния, представляющие текущее физическое состояние животного public static const PETSTATE_FULL:int = 0; public static const PETSTATE_HUNGRY:int = 1; public static const PETSTATE_STARVING:int = 2; public static const PETSTATE_DEAD:int = 3;
// ==СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ==
// Максимальная длина имени животного
private static var maxNameLength:int = 20;
// Максимальное количество калорий, которое может иметь животное
private static var maxCalories:int = 2000;
// Скорость, с которой животное переваривает пищу
private static var caloriesPerSecond:int = 100;
// Имя для животного, используемое по умолчанию
private static var defaultName:String = «Unnamed Pet»;
// ==ПЕРЕМЕННЫЕ ЭКЗЕМПЛЯРА ==
// Имя животного
private var petName:String;
// Текущее количество калорий в «желудке» животного, private var currentCalories:int: // Текущее физическое состояние животного private var petState:int;
// Таймер для вызова метода digest( ) на регулярной основе private var digestTimer:Timer;
// Конструктор
public function VirtualPet (name:String):void { // Присваиваем имя этому животному setName(name);
// Даем этому животному половину от максимально возможного количества // калорий (полупустой «желудок»). setCalori es(Vi rtualPet. maxCalori es/2);
}
// Начинает жизненный цикл животного public function start ( ):void {
// Вызываем метод digestTimerl_istener( ) один раз в секунду
digestTimer = new TimerdOOO. 0);
digestTimer. addEventListener(TimerEvent. TIMER. digestTimerListener); digestTimer. start( );
}
// Останавливает жизненный цикл животного public function stop ( ):void { if (digestTimer!= null) { digestTimer. stop( );
}
}
// Присваивает имя животному и уведомляет приемники об изменении public function setName (newName:String):void { // Генерируем исключение, если новое имя не является допустимым if (newName. indexOfC «) == 0) {
throw new VirtualPetNameException( ); } else if (newName == «») {
throw new VirtualPetInsufficientDataException( ); } else if (newName. length > VirtualPet. maxNameLength) { throw new VirtualPetExcessDataException( );
}
// Присваиваем новое имя petName = newName;
// Уведомляем приемники об изменении имени
di spatchEvent(new Event(Vi rtua1 Pet. NAME_CHANGE));
}
// Возвращает имя животного public function getName ( ):String { // Если животному не было присвоено допустимое имя… if (petName == null) { // …возвращаем имя. используемое по умолчанию return Virtual Pet. defaultName; } else {
// …в противном случае возвращаем имя животного return petName;
}
}
// Добавляет некоторое количество калорий в желудок животного. // используя объект Food public function eat (foodltem:Food):void { // Если животное умерло, ничего не делаем if (petState == Virtual Pet. PETSTATE_DEAD) { trace(getName( ) + » is dead. You can’t feed it.»); return;
}
// Если пищей является яблоко, проверяем его на наличие червей. // Если яблоко червивое, не будем его есть, if (foodltem is Apple) { if (Apple(foodltem).hasWorm( )) { traceCThe » + foodltem. getName( ) + » had a worm. » + getName( )
+ » didn’t eat it.»); return;
}
}
// Отображаем отладочное сообщение с информацией об употребленной пище trace(getName( ) + » ate the » + foodItern. getName( )
+ » (» + foodItem. getCalories( ) + » calories).»); // Добавляем калории из пищи в «желудок» животного setCalori es(getCalori es( ) + foodItem. getCalories( ));
}
// Присваивает животному новое количество калорий и при необходимости // изменяет его состояние
private function setCalories (newCurrentCalories:int):void { // При необходимости корректирует значение newCurrentCalories // в соответствии с допустимым диапазоном if (newCurrentCalories > VirtualPet. maxCalories) {
currentCalories = VirtualPet. maxCalories; } else if (newCurrentCalories < 0) {
currentCalories = 0; } else {
currentCalories = newCurrentCalories;
}
// Определяем количество калорий в желудке животного, в процентах
// от максимально допустимого количества калорий
var caloriePercentage:int = Math. floor(getHunger( )*100);
// Отображаем отладочное сообщение, информирующее о текущем количестве // калорий у животного
trace(getName( ) + » has » + currentCalories + » calories»
+ » (» + caloriePercentage + «% of its food) remaining.»):
// При необходимости устанавливаем состояние животного в зависимости // от изменения в количестве калорий if (caloriePercentage == 0) { // У животного не осталось пищи. Поэтому, если оно еще не умерло… if CgetPetStateC ) != Virtual Pet. PETSTATE_DEAD) { // …деактивируем его die( ); } •
} else if (caloriePercentage < 20) { // животному срочно требуется пища. устанавливаем его состояние // в «ужасно голодный».