Руководство по созданию AS3 Flash игры – часть 5: геймплей
После того, как я объяснил механизм создания очков в Руководстве по
созданию AS3 Flash игры – часть 4: очки, самое время создавать
геймплей.
Идея – создать игру типа Collectabubble, только более отшлифованную и с большим количеством деталей. Первое, о чем нужно поговорить – вращающаяся панель, видеоклип к которому называется bar с классом bar.as Вот код для bar.as
ACTIONSCRIPT:
package {
import flash.display.Sprite;
import flash.events.Event;
publicclass bar extends Sprite {
// variables used in this class
privatevar point_x:int;
privatevar point_y:int;
// precision is the number of points I am going to calculate
// in case of collision, reset the hero, subtract 2 points to the score and slow down the bar
as3circle(root).circle_hero.init();
as3circle(root).add_score(-2);
adjust_speed(-0.1);
}
}
}
publicfunction adjust_speed(val){
rotspeed+=val;
if(rotspeed<0.2){
rotspeed = 0.2;
}
}
}
}
Как Вы видите, она аналогична кодировке для coins.as, так как функции их схожи: реагировать на столкновения самой панели и героя. Единственное отличие вращающейся панели в том, что она…вращается. =) В строке 14 Вы видите переменную, которая отвечает за скорость вращения, в строке 23 – за обновление. Как
только обнаружено столкновение, я не просто сразу сбрасываю героя
(строка 30), но также вычитаю 2 очка со счета (строка 31) и замедляю
панель (строка 32). Как замедлить панель? С помощью добавления функции регулирования скоростей в строках 36-41. Если панель замедляется, когда герой с ней сталкивается, следовательно, она должна и ускоряться, когда герой подбирает монету.
coins.as
ACTIONSCRIPT:
package {
import flash.display.Sprite;
import flash.events.Event;
publicclass coin extends Sprite {
// variables used in this class
privatevar dist_x:int;
privatevar dist_y:int;
privatevar distance:int;
// main function
publicfunction coin(){
// calling place_coin function.
// this function randomly places the coin in the field
// determining the distance between the hero and the coin
// notice how do I refer the hero
dist_x = x - as3circle(root).circle_hero.x;
dist_y = y - as3circle(root).circle_hero.y;
distance = dist_x*dist_x+dist_y*dist_y;
// 1809 = (hero radius + coin radius)^2
// this way I don't have to perform a square root to distance
if(distance <1089){
// if the hero picks up a coin, then move it elsewhere, add one point to the score and speed up the bar
as3circle(root).add_score(1);
as3circle(root).rotating_bar.adjust_speed(0.2);
place_coin();
}
}
privatefunction place_coin(){
x = Math.floor(Math.random()*400)+50;
y = Math.floor(Math.random()*400)+50;
}
}
}
В 28 строке я увеличиваю скорость вращения панели по мере набора монет. В конце концов, бесполезно описывать, как панель добавляется в главный класс ascircle.as: