2015-08-20 1 views
1

Я делаю TDS в Flash CS4 с помощью AS3, но, похоже, проблема. Трудно объяснить, поэтому я свяжусь с флеш-файлом. Нажмите this.Создание Top Down Shooter в Adobe Flash CS4 с использованием ActionScript 3, но пули ведут себя странно

Это первое время загрузки файла для совместного использования так и для тех, кто не может или не в состоянии загрузить файл, это то, что происходит:

Игрок имеет поворот мыши, который, игрок смотрит на то, где мышь есть. На Mouse down я поставил скрипт для создания пуль. Пули создаются в порядке. Но когда пули двигаются, когда возникает проблема. Скажем, что в положении и вращении X я выстрелил 5 пуль, и они двигаются в направлении X. Теперь, если я стреляю в пулю в положение Y и вращение, созданная там пуля идет в направлении Y , но так же делают все остальные пули, которые были созданы в позиции X и направлении. Они меняют курс.

Вот код игры.

package { 

import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.MouseEvent; 
import flash.ui.Keyboard; 
import flash.events.Event; 
import flash.events.KeyboardEvent; 
import flash.ui.Mouse; 
import flash.events.TimerEvent; 

public class Main extends MovieClip { 

    var player : Player = new Player(); 

    //Customizable Weapon Settings 
    var bulletNumber:Number;//number of bullets per shot 
    var bulletOffset:Number;//bigger number = less acurate 
    var bulletSpeed:Number;//pixels per frame 
    var bulletMaxAge:Number;//1000 = 1 second 
    var reloadSpeed:Number;//1000 = 1 second 

    var randomNum:Number; 
    public static var xSpeed:Number; 
    public static var ySpeed:Number; 
    var bulletAngle:Number; 
    var timer:Number=0; 
    var flag:Boolean; 

    //other variables (do not edit) 
    var mouseClicked:Boolean=false; 
    var radians:Number=Math.PI/180; 


    public function Main() { 

     player.x=stage.stageWidth/2; 
     player.y=stage.stageHeight/2; 
     stage.addChild(player); 
     player.gotoAndStop(5); 

     loadWeapon("Machine Gun"); 
     addEventListener(Event.ENTER_FRAME,on_enter_frame); 
     stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler); 
     stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler); 
    } 

    public function onMouseDownHandler(event:MouseEvent) { 
     //trace("Mouse Down"); 
     mouseClicked=true; 
     flag=true; 
    } 

    public function onMouseUpHandler(event:MouseEvent) { 
     //trace("Mouse Up"); 
     mouseClicked=false; 
     flag=false; 
     timer=0; 
    } 

    public function loadWeapon(weaponType:String) { 

     switch (weaponType) { 
      case "Machine Gun" : 
       //bulletNumber = 100; 
       bulletOffset=10; 
       bulletSpeed=10; 
       bulletMaxAge=1000; 
       break; 
     } 
    } 

    function on_enter_frame(e:Event) { 
     trace("Click: "+ mouseClicked); 
     fireWeapon(); 
    } 

    function fireWeapon() { 

     //check if mouse is clicked 
     //if true, create bullet 
     if (mouseClicked) { 
      createBullet(); 
      player.gotoAndStop(10); 
     } else { 
      player.gotoAndStop(1); 
     } 
    } 

    public function createBullet() { 
     var bullet : Bullet2= new Bullet2(); 
     bullet.x=player.x; 
     bullet.y=player.y; 
     if (flag) { 
      timer++; 
      if (timer==10) { 
       trace("lol"); 
       //calculate random bullet offset. 
       randomNum = Math.random() * (bulletOffset); 

       //set bullet firing angle 
       bulletAngle = (player.rotation + randomNum) * radians; 

       //set bullet speed based on angle 
       xSpeed=Math.cos(bulletAngle)*bulletSpeed; 
       ySpeed=Math.sin(bulletAngle)*bulletSpeed; 
       //trace (bulletAngle); 
       stage.addChild(bullet); 


       bullet.addEventListener(Event.ENTER_FRAME, runForest); 
       //mouseClicked = false; 
       timer=0; 

      } 
     } 
     function runForest(e:Event) { 
      bullet.x+=xSpeed; 
      bullet.y+=ySpeed; 
     } 
    } 


    } 
} 

Вещи, которые я пробовал:

1) Я поставил "runForest()" Funtion вне функции "createbullet()", которые дают мне «1120: Доступ неопределенной пули собственности. " Ошибка. (Это не имеет смысла, так как я даю ему входной приемник событий кадра.)

2) Для решения этого я сделал переменную пули глобальной и объявил ее внутри функции «createbullet()», как это ... » var bullet: Bullet2; " И внутри createbullet() - "bullet = new Bullet2();" Это дает мне совершенно другой результат.

3) Я положил функцию runForest() в свой собственный файл класса. Но то же самое происходит.

Я имел в виду учебник, в котором используется AS2. This - ссылка.

Помогите мне решить это пожалуйста. Спасибо!

ответ

1

Обзор этот код:

//set bullet speed based on angle 
xSpeed=Math.cos(bulletAngle)*bulletSpeed; 
ySpeed=Math.sin(bulletAngle)*bulletSpeed; 

затем посмотрим, как эти переменные скорости созданы:

public static var xSpeed:Number; 
public static var ySpeed:Number; 

У вас есть 1 переменную х направления скорости. Если есть только одна переменная, для скорости может быть только 1 значение.

вот почему все ваши пуль движутся в одном направлении, потому что все они имеют одно единственное значение для скорости, что заставляет их двигаться в одном направлении.

Ваш класс Main делает все в данный момент, и вы должны действительно реорганизовать часть этого кода на несколько других классов. Даже ваше собственное понимание кода вы пишете не отражается код, ваш комментарий говорит:

// установить скорость пули на основе угла

Теперь почему это пули скорость переменная Main? Объектно-ориентированное программирование сделано именно для этого. Вы можете буквально превратить свое простое английское описание желаемого поведения в код.

Когда вы говорите, что вы «хотите иметь пули», то создайте класс Bullet. Когда вы говорите: «каждый Bullet объект должен иметь свою собственную скорость», а затем добавить свойство этому классу, который является скоростью.

У вас будет такая же проблема с вашим оружием, и будет применено одно и то же решение.

+0

Я получил его для работы, выполнив это: bullet.bulletSpeedx = xSpeed; \t bullet.bulletSpeedy = ySpeed; и в классе Пули: функция runForest (е: Событие) { \t \t \t this.x + = bulletSpeedx; \t \t \t it.y + = bulletSpeedy; \t} –

+0

Да. Я понимаю. Но я упомянул об этом, ссылаясь на сценарий AS2. Да, буду делать и дальнейшую оптимизацию. –

+0

Спасибо большое! : D –

Смежные вопросы