ОСТОРОЖНО ПРОГРАММИРОВАНИЕ!!! ActionScript 3.0МНОГО БУКАФФФФФИтак, от нечего делать я решил написать статью в которой решил научить вас создавать панель с очками в игре не мегонубским способом через динамический текст, а супер крутым способом при котором очки будут отображаться цифрами которые мы сами нарисуем.
Вот что у нас должно получиться.http://dolimoll.idenchig.ru/wp-content/uploads/2013/01/p2Score.swfДля кого полезен этот урок?В первую очередь этот урок полезен школоте которая ни чего не понимает в As, а так же нубам. Аниматорам думаю это нах не надо.
Приступим!Начну с того каждый быдлокодер должен уметь изголяться и извращаться как только может при написании игры. И в этот раз мы будет создавать мегокрутую панель для очков. В этом уроке будет совсем немного рисования и очееееень много быдлокода который я постараюсь объяснить. Итак, для начала создадим новый класс который я назвал p2Score, собственно, это и есть наша панель с очками.
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.geom.Rectangle;
public class p2Score extends Sprite
{
public var mFont:Class;
public var fontWidth:Number = 0;
public var fontInt:Number = 5;
public var mResize:Boolean = false;
private var myScore:Number = 0;
public function p2Score(fontMovieClip:Class, width:Number, resize:Boolean = false)
{
mFont = fontMovieClip;
mResize = resize;
fontWidth = width;
}
public function set score(num:Number):void
{
clear();
myScore = num;
var mscore:String = String(num);
for (var i = 0; i < mscore.length; i++)
{
var s = mscore.substr(i, 1);
var mf:MovieClip = new mFont();
mf.gotoAndStop(Number(s) + 1);
if (!mResize)
{
mf.x = fontWidth * i + fontInt * i;
}
else
{
var mfr = mf.getBounds(mf);
if (this.numChildren > 0)
{
var md:MovieClip = this.getChildAt(this.numChildren - 1) as MovieClip;
var mdr:Rectangle = md.getBounds(md);
mf.x = md.x + mdr.x + mdr.width + fontInt - mfr.x;
}
else
{
mf.x -= mfr.x;
}
}
addChild(mf);
}
}
public function get score():Number
{
return myScore;
}
public function clear()
{
var nm:int = this.numChildren;
for (var i = 0; i < nm; i++)
{
this.removeChildAt(0);
}
}
}
}
Если вы полный нубяра и уже наложили полные штаны кирпичей от такой кучи кода, то можете переодеться и начать читать дальше. Итак, что же тут такое написано? Здесь все очень просто! Как мы видим класс p2Score наследуется от класса Sprite, а значит он обладает всеми его свойсвами(ваш Кэп) и в него можно добавлять другие графические объекты. Далее идет конструктор с параметрами p2Score(fontMovieClip:Class, width:Number, resize:Boolean = false), fontMovieClip - класс нашего мувиклипа в котором будут наши цифры, width - ширина одной цифры, resize определяет будет ли наша ширина постоянной или она будет зависить от ширины цифры. Думаю то что происходит в конструкторе объяснять не надо, ибо там и так все понятно.
Далее идут set и get методы. "Нах они нам нужны, ведь это непонятно как то?" - скажет типичный нуб. А нужны они нам вот зачем, так как наши очки будут изображаться графически нашими нарисованными цифрами, то мы не сможем изменить это изображение просто изменив переменную которая будет хранить в себе значение очков, а нам придется вызвать функции которая будет все это изменять, и запись будет очень неудобной, например, она будет такой p2Score.setScore(1000), это очень отстойно, т.к для того что бы просто взять значение нам придется написать еще одну функции, а с помощью set и get методов бы будет как чисто козырные кореши использовать такой код p2Score.score += 12 и наше графическое изображение очков сразу поменяется.
Первым мы рассмотрим наш set score метод. Для начала мы очищаем нашу панель от старого изображения функцией clear() которая определена в этом же классе. Далее мы переводим наши очки из типа Number в тип String и перебираем каждый символ что бы узнать на какой кадр нужно установить мувиклип с цифрой, затем мы создаем новый мувиклип с цифрой и ставим его на нужный нам кадр. Если включен флаг resize то выравниваем наши мувиклипы по оси Х в зависимости от их ширины, для этого определяем угловые точки функцией getBounds.
Метод get score и функция clear() очень просты и не нуждаются в объяснении.
Как все это использовать?Я написал в главном классе игры Main следующий код.
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Main extends Sprite
{
public var myScore:Number = 10;
public var tablo:p2Score;
public function Main()
{
tablo = new p2Score(myFont, 40, true);
addChild(tablo);
tablo.score = myScore;
stage.addEventListener(MouseEvent.CLICK, onMyClick);
}
private function onMyClick(e:MouseEvent):void
{
tablo.score += 12;
}
}
}
Здесь создается новый экземпляр tablo нашего класса p2Score с параметрами myFont - это класс моего мувиклипа с цифрами, в нем есть 10 кадров, на первом кадре нарисована цифра 0, на втором - 1, на третьем - 2 и т.д, дальше идет параметр width который я написал 40, и флаг resize у меня равен значению true, т.е длина каждой цифры разная. Дальше на stage вешается мышиный слушатель и по каждому щелчку мыши наш параметр tablo.score увеличивается на 12.
Достоинства.[+] Мегокрутое отображение панели очков.
[+] Относительное быстродействие.
[+] Удобство использования.
Отстоинтсва.[-] Нельзя вывести отрицательные числа.
[-] Нельзя вывести дробные числа.
Послесловие:Недостатки очень лего исправляются, для этого нужно сделать проверку символа и если он равен "-" или "." то мувиклип ставим на кадр в котором нарисованы "-" или "." соответственно.