Использование функций в программе «Зоопарк» ActionScript 

 

 

Применим наши новые знания функций к программе по созданию виртуального 

зоопарка (чтобы освежить в памяти существующий код программы, обратитесь 

к листингу 4.1, содержащему код класса VirtualPet). 

Если помните, в последней версии нашей программы по созданию виртуального 

зоопарка животные могли только употреблять пищу (то есть накапливать  

калории), но не переваривать ее (то есть терять калории). Чтобы наши животные могли 

переваривать пищу, мы добавим новый метод digest ( ) в класс VirtualPet. 

Метод digest ( ) будет вычитать калории из того объекта VirtualPet, над  

которым осуществляется вызов данного метода. Чтобы имитировать переваривание 

пищи в течение времени, мы создадим интервал, используемый для вызова метода 

digest ( ) один раз в секунду. Количество калорий, потребляемых при каждом 

вызове метода digest ( ), будет определяться новой статической переменной 

caloriesPerSecond. Присвоим переменной caloriesPerSecond значение 

100, позволяя животному прожить максимум 20 секунд на «полный желудок». 

Следующий код демонстрирует описание переменной caloriesPerSecond: 

private static var caloriesPerSecond = 100; 

Далее представлено описание метода digest ( ). Обратите внимание, что,  

поскольку переваривание пищи является внутренним процессом, метод dige s t ( ) 

объявлен с использованием модификатора управления доступом private. 

private function digest ( ) { 

currentCalories -= Virtual Pet.caloriesPerSecond; 

Чтобы создать интервал, вызывающий метод digest ( ) один раз в секунду,  

воспользуемся собственной функцией se t Inte rval ( ). Каждое животное должно  

приступать к перевариванию пищи сразу после его создания, поэтому поместим вызов 

функции setlnterval ( ) в метод-конструктор класса Virtual Pet. Кроме того, 

сохраним идентификатор интервала, возвращаемый функцией setlnterval ( ), 

в новой переменной экземпляра digestlntervallD, чтобы в дальнейшем при  

необходимости можно было удалить созданный интервал. 

Следующий код демонстрирует описание переменной digestlntervallD: 

private var digestlntervallD; 

Измененный конструктор класса VirtualPet выглядит так: 

public function VirtualPet (name) { 

setName(name); 

// Вызывать метод digest( ) один раз в секунду 

digestlntervallD = setlnterval(digest, 1000); 

Теперь, когда объекты класса vi rtual Pet могут переваривать пищу,  

воспользуемся глобальной функцией trace ( ), чтобы сообщать о текущем состоянии каждого 

животного в процессе отладки. Будет выдаваться сообщение о состоянии всякий 

раз при выполнении методов digest ( ) или eat ( ). Обновленная версия метода 
digest ( ) выглядит следующим образом: 
private function digest ( ) { 
currentCalories -= VirtualPet.caloriesPerSecond; 
trace(getName( ) + " digested some food. It now has " + currentCalories 
+ " calories remaining."); 
Обновленная версия метода eat ( ): 
public function eat (numberOfCalories) { 
var newCurrentCalories = currentCalories + numberOfCalories; 
if (newCurrentCalories > VirtualPet.maxCalories) { 
currentCalories = VirtualPet.maxCalories; 
} else { 
currentCalories = newCurrentCalories; 
trace(getName( ) + " ate some food. It now has " + currentCalories 
+ " calories remaining."); 
Если бы мы запустили нашу программу «Зоопарк» прямо сейчас, то увидели бы 
следующие сообщения в окне Output (Вывод) (среда разработки Flash) или Console 
(Консоль) (Flex Builder): 
Stan digested some food. It now has 900 calories remaining. 
Stan digested some food. It now has 800 calories remaining. 
Stan digested some food. It now has 700 calories remaining. 
Stan digested some food. It now has 600 calories remaining. 
Stan digested some food. It now has 500 calories remaining. 
Stan digested some food. It now has 400 calories remaining. 
Stan digested some food. It now has 300 calories remaining. 
Stan digested some food. It now has 200 calories remaining. 
Stan digested some food. It now has 100 calories remaining. 
Stan digested some food. It now has 0 calories remaining. 
Stan digested some food. It now has -100 calories remaining. 
Stan digested some food. It now has -200 calories remaining. 
Stan digested some food. It now has -300 calories remaining. 
Но в чем же дело? Количество калорий у животных не должно принимать  
отрицательных значений. Вместо этого животные должны умирать, когда значение 
переменной currentCalories достигнет 0. В нашей программе состояние смерти 
будет выражаться следующим образом. 
□ Если значение переменной currentCalories равно 0, программа будет  
игнорировать любые попытки увеличить значение переменной currentCalories 
путем вызова метода eat ( ). 
□ Когда значение переменной currentCalories станет равным 0, программа 
удалит интервал, с помощью которого вызывается метод digest ( ), и  
отобразит сообщение о «смерти животного». 
Сначала модифицируем метод eat ( ). С поставленной задачей должен справиться 
простой условный оператор: 
public function eat (numberOfCalories) { 
// Если это животное мертво, 
if (currentCalories = 0) { 
// ...завершить метод, не изменяя значение переменной 
// currentCalories 
trace(getName( ) + " is dead. You can\'t feed it."); 
return; 
var newCurrentCalories = currentCalories + numberOfCalories; 
if (newCurrentCalories > Virtual Pet.maxCalories) { 
currentCalories = VirtualPet.maxCalories; 
} else { 
currentCalories = newCurrentCalories; 
trace(getName( ) + " ate some food. It now has " + currentCalories 
+ " calories remaining."); 
Теперь мы должны остановить процесс вызова метода diges t ( ), когда значение 
переменной currentCalories достигнет 0. Для этого воспользуемся функцией 
flash.utils .clearInterval ( ): 
private function digest ( ) { 
// Если в результате потребления очередной порции калорий значение 
// переменной currentCalories станет равным 0 или меньше... 
if (currentCalories - Virtual Pet.caloriesPerSecond <= 0) { 
// ...прекратить вызов метода digestC ) 
clearlnterval(digestlntervallD); 
// После чего очистить желудок животного 
currentCalories = 0; 
// и сообщить о смерти животного 
trace(getName( ) + " has died."); 
} else { 
// ...иначе употребить оговоренное количество калорий 
currentCalories -= VirtualPet.caloriesPerSecond; 
// и сообщить о новом состоянии животного 
trace(getName( ) + " digested some food. It now has " 
+ currentCalories + " calories remaining."); 
В листинге 5.3 представлен целиком весь код класса VirtualPet, включая все 
внесенные изменения. 
Листинг 5.3. Класс VirtualPet 
package zoo { 
import flash.utils.setlnterval; 
import flash.utils.clearlnterval; 
139 
internal class Virtual Pet { 
private static var maxNameLength = 20; 
private static var maxCalories = 2000; 
private static var caloriesPerSecond = 100; 
private var petName; 
private var currentCalories = VirtualPet.maxCalories/2; 
private var digestlntervallD; 
public function VirtualPet (name) { 
setName(name); 
digestlntervallD = setlnterval(digest. 1000); 
public function eat (numberOfCalories) { 
if (currentCalories == 0) { 
trace(getName( ) + " is dead. You can\'t feed it."); 
return; 
var newCurrentCalories = currentCalories + numberOfCalories; 
if (newCurrentCalories > Virtual Pet.maxCalories) { 
currentCalories = VirtualPet.maxCalories; 
} else { 
currentCalories = newCurrentCalories; 
trace(getName( ) + " ate some food. It now has " + currentCalories 
+ " calories remaining."); 
public function getHunger ( ) { 
return currentCalories / VirtualPet.maxCalories; 
public function setName (newName) { 
// Если длина заданного нового имени больше maxNameLength 
// символов... 
if (newName.length > Virtual Pet.maxNameLength) { 
// ...обрезать имя 
newName = newName.substr@. Virtual Pet.maxNameLength); 
} else if (newName == "") { 
// ...в противном случае, если заданное новое имя является 
// пустой строкой, завершить выполнение метода, не изменяя 
// значения переменной petName 
return; 
// Присвоить новое, проверенное имя переменной petName 
petName = newName; 
Глава 5. Функции 
public function getName ( ) { 
return petName; 
private function digest ( ) { 
// Если в результате потребления очередной порции калорий значение 
// переменной currentCalories животного станет равным 0 или меньше, 
if (currentCalories - Virtual Pet.caloriesPerSecond <= 0) { 
// ...прекратить вызов метода digestC ) 
clearlnterval(digestlntervalID); 
// После чего очистить желудок животного 
currentCalories = 0; 
// и сообщить о смерти животного 
trace(getName( ) + " has died."); 
} else { 
// ...иначе употребить оговоренное количество калорий 
currentCalories -= VirtualPet.caloriesPerSecond; 
// и сообщить о новом состоянии животного 
trace(getName( ) + " digested some food. It now has " 
+ currentCalories + " calories remaining."); 




BACK NEXT

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям