Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Access of undefined property (http://www.flasher.ru/forum/showthread.php?t=127420)

SONICTOM 13.07.2009 19:44

Access of undefined property
 
Пишу первую примитивную игру леталку-стрелялку. Вот такой код:

Код AS3:

field.addEventListener(MouseEvent.CLICK, fieldClick);
function fieldClick(a:MouseEvent):void {
 var shoot:sh=new sh;
 addChild(shoot);
 shoot.x=sam.x;
 shoot.y=sam.y;
 shoot.addEventListener(Event.ENTER_FRAME, shootTrace);
}
 
function shootTrace(a:Event):void {
 if (shoot.y>0) {
  shoot.y-=5;
  field.removeEventListener(MouseEvent.CLICK, fieldClick);
 }
 if (shoot.y<0) {
  removeChild(shoot);
 
 }
}

При тесте вылазит ряд ошибок:
Цитата:

1120: Access of undefined property shoot.
Я предпологал сделать так, чтобы при клике по мувиклипу "field" создается объект "shoot", который библиотеке лежит в Библиотеке в виде мувиклипа. В свойствах объекта в Библиотеки указано имя класса "sh".
После этого "shoot" получает координаты мувиклипа "sam" и движется вверх. Если его координата по у станет меньше нуля, то он удаляется).

Подскажите, пожалуйста, где я допустил ошибку. Пожалуйста. объясните, как тупому, так как знаний у меня буквально после 20 видеоуроков по AS3. И еси можно, поправьте, пожалуйста, код.

Заранее большое спасибо за помощь и терпение!

switcher! 13.07.2009 20:51

По идее, shoot объявляется как локальная переменная, которая исчезает сразу по завершению функции fieldClick. А она это делает (завершается) за доли секунды ))

Так что когда вызывается функция shootTrace - ей просто нечего обрабатывать. Отсюда и выскакивает ошибка 1120.

для ваших целей - переменная должна быть объявлена извне функции fieldClick. Другое дело - преобразовать код для ваших задач. Это я подумаю - если местные спецы не помогут раньше.

Партизан 13.07.2009 20:56

Код AS3:

field.addEventListener(MouseEvent.CLICK, fieldClick);
//Создавать экземпляр sh нужно здесь, когда используете ссылку на него из
//разных функций (Знакомство с областью действия переменной)
// Когда создаете экземпляр класса ( var shoot:sh=new sh; ) пишется new sh()
//у вас скобки пропущены (Объекты и Классы) кстати имя класса (sh)
//принято писать с заглавной (Sh)
 
var shoot:sh=new sh();
 
function fieldClick(a:MouseEvent):void {
 
// Здесь sh не создается, пропущены ()  -  должно быть var shoot:sh=new sh();
// var shoot:sh=new sh;
 
 
 addChild(shoot);
 shoot.x=sam.x;
 shoot.y=sam.y;
 shoot.addEventListener(Event.ENTER_FRAME, shootTrace);
}
 
function shootTrace(a:Event):void {
 if (shoot.y>0) {
  shoot.y-=5;
  field.removeEventListener(MouseEvent.CLICK, fieldClick);
 }
 if (shoot.y<0) {
// Здесь неплохо бы удалить сначала листенер
  shoot.removeEventListener(Event.ENTER_FRAME, shootTrace);
  removeChild(shoot);
 
 }
}

Знакомство с областью действия переменной
Объекты и классы

cleptoman 13.07.2009 22:42

Код AS3:

function shootTrace(a:Event):void {
var shoot:sh = e.target as sh;
 
 if (shoot.y>0) {
  shoot.y-=5;
  field.removeEventListener(MouseEvent.CLICK, fieldClick);
 }
 if (shoot.y<0) {
shoot.removeEventListener(Event.ENTER_FRAME, shootTrace);
 
  removeChild(shoot);
 
 }
}

var shoot:sh = e.target as sh;

и еще:
Код AS3:

field.removeEventListener(MouseEvent.CLICK, fieldClick);

тут поменяйте что-нибудь..а то у вас каждый фрэйм филд отписывается от клика.)

Мечтатель 14.07.2009 00:01

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

var spOne:Sprite = new Sprite;

и
Код AS3:

var spOne:Sprite = new Sprite();

абсолютно тождественны! И в первом и во втором случае, программа разместит в памяти AVM2 экземпляр класса Sprite, на который будет ссылаться переменная spOne

Партизан 14.07.2009 00:18

Цитата:

Партизан абсолютно необязательно использовать круглые скобки при создании экземпляра класса.
не знал :) спасибо.

BlooDHounD 14.07.2009 01:02

Мечтатель, просто в первом случаи видно, что у "повара" проблемы со вкусом, и кушать его стрепню опасно для здоровья

MonkDead 14.07.2009 08:01

BlooDHounD, красиво сказал. Такую стряпню действительно есть не хочется.

SunShadow 14.07.2009 09:30

Допускается оба варианта записи. Уж кому как нравиться выделяться. Я пользуюсь вторым вариантом по привычке, и это новичков не пугает)

SONICTOM 14.07.2009 11:46

Братцы, большое спасибо за помощь!

Подскажите, пожалуйста, как можно рационально вызвать функцию fieldClick?
Пока я создал прозрачный мувиклип field на заднем плане и вызываю fieldClick кликом по нему.
Есть ли вариант MousEventa кликом не по field, а за его пределами. Тогда я мог бы сделать маленький мувиклип field, поместил бы его де-то за пределами рабочей области игры и вызывал бы fieldClick кликом мимо мувиклипа field.

Спасибо!


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

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