Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Помогите создать эффект выстрела (http://www.flasher.ru/forum/showthread.php?t=186596)

DenLev 06.11.2012 00:53

Помогите создать эффект выстрела
 
Помогите создать эффект выстрела. Суть такова есть враг (enemy), мувик состоит из двух кадров первый сам враг второй взрыв. Я пробовал соединить hitTestObject и gotoAndStop код выглядел так:
Код AS3:

if(pulaR.hitTestObject(enemy))
  {
  enemy.gotoAndStop (2);
  }

при этом выбивает такая ошибка 1120: Обращение несуществующого свойства pulaR если заменить pulaR на L5 то при столкновении с объектомвсе все работает. L5 это объект который и должен стрелять.

Вот весь код:
Код AS3:

var up,down,left,right = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUpF);
stage.addEventListener(Event.ENTER_FRAME,updatePosF);
 
function keyDownF(e:KeyboardEvent):void
{
 if (e.keyCode == Keyboard.UP)
 {
  up = 1;
 }
 if (e.keyCode == Keyboard.DOWN)
 {
  down = 1;
 }
 if (e.keyCode == Keyboard.RIGHT)
 {
  right = 1;
 }
 if (e.keyCode == Keyboard.LEFT)
 {
  left = 1;
 }
}
 
function keyUpF(e:KeyboardEvent):void
{
 if (e.keyCode == Keyboard.UP)
 {
  up = 0;
 }
 if (e.keyCode == Keyboard.DOWN)
 {
  down = 0;
 }
 if (e.keyCode == Keyboard.RIGHT)
 {
  right = 0;
 }
 if (e.keyCode == Keyboard.LEFT)
 {
  left = 0;
 }
}
 
function updatePosF(e:Event):void
{
 if (up == 1)
 {
  L5.y -=  10;
 }
 if (down == 1)
 {
  L5.y +=  10;
 }
 if (left == 1)
 {
  L5.x -=  10;
 }
 if (right == 1)
 {
  L5.x +=  10;
 }
}
//===========================================================>>>>
var enemyArr:Array= new Array();
var enemySpeed:Number=5;
const enemyNum:int = 40;
for (var i=0; i<enemyNum; i++)
{
 var enemy:MovieClip= new D2();
 enemyArr.push(enemy);
 enemyArr[i].x = Math.random() * -400 +400;
 enemyArr[i].y = Math.random() * -7000;
 addChild(enemyArr[i]);
 addEventListener(Event.ENTER_FRAME,enemyMove);
}
function enemyMove(e:Event):void
{
 for (var i=0; i<enemyNum; i++)
 {
  var enemy=enemyArr[i];
  enemy.y+=enemySpeed;
 if(pulaR.hitTestObject(enemy))
  {
  enemy.gotoAndStop (2)
  }
 }
}
//===========================================================>>>>
stage.addEventListener(MouseEvent.CLICK,vustril);
function vustril (e:MouseEvent):void{
var pulaRArr:Array= new Array();
var pulaRSpeed:Number=15;
const pulaRNum:int = 1;
for (var q=0; q<pulaRNum; q++)
{
 var pulaR:MovieClip= new pula();
 pulaRArr.push(pulaR);
 pulaRArr[q].x = L5.x;
 pulaRArr[q].y = L5.y;
 addChild(pulaRArr[q]);
 addEventListener(Event.ENTER_FRAME,pulaRMove);
}
function pulaRMove(e:Event):void
{
 for (var q=0; q<pulaRNum; q++)
 {
  var pulaR=pulaRArr[q];
  pulaR.y-=pulaRSpeed;
 }
}
}


spirit2 06.11.2012 05:07

У вас pulaR объявлена в функции vustril (причем дважды), а использовать вы её пытаетесь в функции enemyMove.

DenLev 06.11.2012 21:05

А как правильно надо записать?

Isfet 07.11.2012 18:01

вынести пулю за функции
Код AS3:

var pulaR:MovieClip;
function vustril (e:MouseEvent):void{
var pulaRArr:Array= new Array();
var pulaRSpeed:Number=15;
const pulaRNum:int = 1;
for (var q=0; q<pulaRNum; q++)
{
 pulaR = new pula();
 pulaRArr.push(pulaR);
 pulaRArr[q].x = L5.x;
 pulaRArr[q].y = L5.y;
 addChild(pulaRArr[q]);
 addEventListener(Event.ENTER_FRAME,pulaRMove);
}
function pulaRMove(e:Event):void
{
 for (var q=0; q<pulaRNum; q++)
 {
  pulaR=pulaRArr[q]
  pulaR.y-=pulaRSpeed;
 }
}
}


DenLev 07.11.2012 21:21

Спасибо уже работает,но появилась новая проблема функция enemyMove работает только после клика
к тому же появилась ошибка:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at litak_fla::MainTimeline/enemyMove()

Isfet 08.11.2012 10:51

переменная pulaR у вас создается в функции
Код AS3:

 var pulaR:MovieClip= new pula();

следовательно в другой функции ее не будет видно
Код AS3:

function enemyMove(e:Event):void
{
 for (var i=0; i<enemyNum; i++)
 {
  var enemy=enemyArr[i];
  enemy.y+=enemySpeed;
 if(pulaR.hitTestObject(enemy))  //вот здесь
  {
  enemy.gotoAndStop (2)
  }
 }
}

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

DenLev 08.11.2012 15:23

вот новый код:
Код AS3:

var enemy:MovieClip;
var enemyArr:Array= new Array();
var enemySpeed:Number=10;
const enemyNum:int = 40;
for (var i=0; i<enemyNum; i++)
{
 enemy = new D2();
 enemyArr.push(enemy);
 enemyArr[i].x = Math.random() * -400 +400;
 enemyArr[i].y = Math.random() * -7000;
 addChild(enemyArr[i]);
 addEventListener(Event.ENTER_FRAME,enemyMove);
}
function enemyMove(e:Event):void
{
 for (var i=0; i<enemyNum; i++)
 {
  var enemy=enemyArr[i];
  enemy.y+=enemySpeed;
  if(pulaR.hitTestObject(enemy))
  {
  enemy.gotoAndStop (2);
  }
    if(enemy.y>=400)
  {
  enemy.x = Math.random() * -400 +400;
  enemy.y = Math.random() * -7000;
  enemy.gotoAndStop(1);
  }
 }
}
//===========================================================>>>>
var pulaR:MovieClip;
stage.addEventListener(MouseEvent.CLICK,vustril);
function vustril (e:MouseEvent):void{
var pulaRArr:Array= new Array();
var pulaRSpeed:Number=15;
const pulaRNum:int = 1;
for (var q=0; q<pulaRNum; q++)
{
 pulaR = new pula();
 pulaRArr.push(pulaR);
 pulaRArr[q].x = L5.x;
 pulaRArr[q].y = L5.y;
 addChild(pulaRArr[q]);
 addEventListener(Event.ENTER_FRAME,pulaRMove);
}
function pulaRMove(e:Event):void
 
{
 for (var q=0; q<pulaRNum; q++)
 {
  pulaR=pulaRArr[q]
  pulaR.y-=pulaRSpeed;
 }
 }
}


Isfet 08.11.2012 17:03

здесь вы запускаете функцию enemyMove
Код AS3:

addEventListener(Event.ENTER_FRAME,enemyMove);

здесь обращаетесь к переменной pulaR
Код AS3:

 if(pulaR.hitTestObject(enemy))
  {

а создаете ее в другой функции, то есть чтобы заработал ваш код нужно сначала вызвать функцию
vustril которая создаст pulaR, а потом только вызвать функцию enemyMove, но я так понимаю это неправильно

вам нужно сделать проверку на существование пули так


Код AS3:

 var enemy=enemyArr[i];
  enemy.y+=enemySpeed;
 if(pulaR){
  if(pulaR.hitTestObject(enemy))
  {
  enemy.gotoAndStop (2);
  }
}
    if(enemy.y>=400)
  {
  enemy.x = Math.random() * -400 +400;
  enemy.y = Math.random() * -7000;
  enemy.gotoAndStop(1);
  }


DenLev 09.11.2012 02:43

Спасибо вам теперь все работает.


Часовой пояс GMT +4, время: 10:34.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.