пятница, 21 января 2011 г.

Урок 11.4. Люди

Как я обещал, в этой игре можно будет спасать людей (собирать их). Они будут появляться в рандомной точке и крутиться, в надежде, что их кто-нибудь спасёт. Да, кстати я переделал звёзды. Раньше они появлялись в центре экрана, за границами экрана, но теперь всё нормально. Пока что ничего за спасания человека не дают, но мы это исправим, когда будем делать меню. Вот что должно получиться:



Для начала я предупрежу вас, что объяснять всё я не буду. Выкладывать код в урок буду исходя из темы урока. Остальной код можно будет узнать, скачав исходник.
Итак, рисуем человека, который будет летать в космосе, конвертируем в символ, называем его man и экспортируем в ActionScript. Далее рисуем прямоугольник размерам с человека, выделяем его, жмём F8, называем marker. Именно этот маркер (который в человеке) называем Marker. Этим маркером будет проверяться соприкосновение с вертолётом и пулей. Создаём класс man. Код:
package {
 import flash.display.MovieClip;
 import flash.events.Event;
 import flash.geom.Point;
 public class man extends MovieClip {

  private var speedX,speedY,staticX,staticY:Number;
  private var game;
  private var Speed, rotationSpeed,radius,degrees,angle:Number;
  private var radians:Number=Math.PI/180;

  public function man(Game) {
   game=Game;
   rotationSpeed=Math.random()*2;
   Speed=Math.random()*5+2;
   radius=40;
   degrees=0;
   angle=0;
   
   start_position();
   
   this.addEventListener(Event.ENTER_FRAME,update_bullet);
   
   // делаем маркер невидимым 
   this.Marker.visible=false;
   
   game.mans_container.addChildAt(this,0);
  }
  private function start_position(){
   var i:int=Math.random()*4;
   var X,Y:Number;
   if(i==0){
    X=Math.random()*game.stgWidth;
    Y=0-radius;
    this.rotation=Math.random()*180;
   }
   else if(i==1){
    X=Math.random()*game.stgWidth;
    Y=game.stgHeight+radius;
    this.rotation=Math.random()*-180;
   }
   else if(i==2){
    X=0-radius;
    Y=Math.random()*game.stgHeight;
    this.rotation=Math.random()*360-180;
   }
   else if(i==3){
    X=game.stgWidth+radius;
    Y=Math.random()*game.stgHeight;
    this.rotation=Math.random()*180-90;
   }
   var point:Point=new Point(X,Y);
   point=game.mans_container.globalToLocal(point);
   staticX=point.x;
   staticY=point.y;
   this.x=staticX;
   this.y=staticY;
  }
  private function update_bullet(e:Event) {
   update_coordinats();
   rotat();
   check_hit();
  }
  private function check_hit(){
   var kill:Boolean=false;
   if(this.Marker.hitTestObject(game.Player.Marker)){
    kill=true;    
   }
   else{
    for(var i:int=0; i<game.bullets_container.numChildren;i++){
     if(game.bullets_container.getChildAt(i).hitTestObject(this.Marker)){
      kill=true;
      game.bullets_container.getChildAt(i).self_destruction();
     }
    }
   }
   if(kill==true){
    self_destruction();
   }
  }
  private function rotat(){
   this.rotation+=rotationSpeed;
  }
  private function update_coordinats() {
   //проверка на вылет пули за пределы окна
   var point:Point=new Point(this.x,this.y);
   point=game.bullets_container.localToGlobal(point);
   if ((point.x+this.width<game.stgWidth+500)&&(point.y+this.height0-500)&&(point.y-this.width>0-500)) {
    // выполняется вращение вокруг оси
    angle = degrees * radians;
    degrees += Speed/2;
    
    var yposition = radius * Math.cos(angle);
    var xposition = radius * Math.sin(angle);
    
    this.x = xposition+staticX;
    this.y = yposition+staticY;
    //
   } else {
    self_destruction();
   }
  }
  public function self_destruction() {
   // иногда по неизвестной мне причине объект может удалить себя дважды и при этом возникнет ошибка
   //поэтому лучше себя застраховать
   try { 
    this.removeEventListener(Event.ENTER_FRAME,update_bullet);
    this.parent.removeChild(this); 
   } catch (Error) {

   }
  }
 }
}

Это ещё не всё. Открываем рисунок вертолёта, добавляем из библиотеки маркер. Этот маркер нужен для того, чтобы проверять соприкосновения с людьми, так что размещаем его желательно в центре и называем также Marker:


Остальные изменения я не стал выкладывать в урок. Скачать исходник со всеми изменениями можно здесь.
Удачи!
P.S. интересно, кто-нибудь что-то сделал по моим туториалам?..

2 комментария:

  1. От того в какую сторону поворачиваешь зависит скорость вращения винта. Это не совсем правильно

    ОтветитьУдалить
  2. :) Это просто обман зрения, в этом уроке было написано про вращение винта (что он будет поворачиваться на 20 градусов каждый кадр). И если вертолёт крутиться в сторону вращения винта, то будет казаться, что винт крутиться быстрее (или медленнее, хз).

    ОтветитьУдалить