PDA

Просмотр полной версии : Вызов функции из другого класса


TEI
15.12.2012, 22:19
Добрый вечер.

Никак не могу понять. У меня есть класс Panel. В нем кнопка - home, которая кидает нас в menu (gotoAndStop).
Еще у меня есть несколько игровых классов. Каким образом мне удалить ENTER_FRAME в них, когда игрок кликает на эту кнопку?

У меня был вариант - просто вызвать функцию в этих классах, которая удалит все и вся. Но никак не могу понять как ее вызвать...

Или есть другой вариант подобной задачи ? (в любом случае подскажите, как решить моим способом)

GBee
15.12.2012, 23:59
Переформулируйте, пожалуйста. В огороде бузина...

TEI
16.12.2012, 00:45
Проще говоря - как вызвать функцию из другого класса ?

iNils
16.12.2012, 01:52
ссылкаНаОбъект.имяФункции();

TEI
17.12.2012, 00:07
Не совсем понял... в одном классе:
var engine_cla:Engine;
engine_cla.addEle1();

в класса Engine:
public function addEle1() {
ele1_var = new ele1_vaz;
ele1_var.x = 100;
ele1_var.y = 444;
addChild(ele1_var);
}

Почему не работает?

GBee
17.12.2012, 00:12
var engine_cla:Engine = new Engine();

iNils
17.12.2012, 00:13
Переменную мало объявить, ее надо дать ссылку на созданный экземпляр. А сейчас, engine_cla у вас равен null.
var engine_cla:Engine = new Engine ();
engine_cla.addEle1();

PS. В ActionScript, подчеркивание используется только для констант, а переменные записывают не ele1_var, а ele1Var. Классы пишут с большой буквы, таким образом, ele1_vaz становится Ele1Vaz.

TEI
17.12.2012, 00:16
Вау. Какой быстрый фид бек! Спасибо! Буду разбираться дальше!

Добавлено через 27 минут
Хоть убейте. Почему это не работает?
package code
{
import flash.display.*
import flash.events.*
import flash.text.*
import flash.ui.*
import flash.utils.*;
import flash.media.*;
import flash.sampler.*;
import code.*;

dynamic public class Ele1 extends Main {
var engine_cla:Engine;

public function Ele1() {
playBt.addEventListener(MouseEvent.CLICK,create_obj_f);
}
//
function create_obj_f(e:MouseEvent) {//создать
engine_cla = new Engine();
engine_cla.addEle1();

}
}
}


package code
{
import flash.display.*
import flash.events.*
import flash.text.*
import flash.ui.*
import flash.utils.*;
import flash.media.*;
import flash.sampler.*;
import code.*;

dynamic public class Engine extends Main {
public function Engine() {
}
public function addEle1() {
// создаю
}

}
}

Добавлено через 28 минут
Выдает ошибку уже на
engine_cla = new Engine();

udaaff
17.12.2012, 00:47
Какую ошибку?

TEI
17.12.2012, 00:49
Какую ошибку?

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at code::Engine()
at code::Ele1/create_obj_f()

iNils
17.12.2012, 01:19
Я не знаю что за класс Main, но если его заменить на Sprite, то весь код работает без ошибок.

TEI
17.12.2012, 01:45
Мои классы Engine и класс Ele1 расширяются от класс Main. Эм, и как мне быть?
Я это сделал для того, чтобы у них были общие переменные.
public static


Да - Main - это основной класса. Я так понимаю, так делать нельзя?

iNils
17.12.2012, 01:48
Статик не наследуется. Для доступа к таким переменным все равно придется обращаться к Main, наследование тут не поможет.

TEI
17.12.2012, 03:03
Да, разобрался. Все работает. Но немного странно, вы можете пояснить эти два момента:
1. Если я вызываю функцию из другого класса и в этой функции я создаю новый клип. То мне нужно писать еще addChild(engine_cla). И только тогда работает. Это верно? Или это быдло код :)
addChild(engine_cla);
engine_cla.addEle1();

2. Когда я создаю var engine_cla:Engine = new Engine(); То срабатывает public function Engine() { в классе Engine. Это нормально ? Просто в этом метод-конструкторе у меня стоят addEventListener(Event.ENTER_FRAME,game_f); И они вызывают ее снова. В чем моя ошибка?

Большая спасибо

iNils
17.12.2012, 03:18
Если я вызываю функцию из другого класса и в этой функции я создаю новый клип. То мне нужно писать еще addChild(engine_cla). И только тогда работает. Это верно?addChild нужно вызывать каждый раз, когда вы создаете новый клип и хотите добавить его в дисплейный список.
Когда я создаю new Engine() То срабатывает public function Engine() {... Это нормально ?Конечно. Это вызов конструктора класса. Он срабатывает каждый раз, когда вы создаете новый экземпляр этого класса.
Просто в этом метод-конструкторе у меня стоят...И они вызывают ее снова.Подписывается, потому что вы подписались) Если вы не хотите, чтобы каждый созданный экземпляр Engine слушал Event.ENTER_FRAME, то не нужно там подписываться. Все зависит от задачи.

TEI
17.12.2012, 14:06
Спасибо, я понял :)

Добавлено через 15 минут
Хотел уточнить насчет одного момента :)
var engine_cla:Engine = new Engine();
addChild(engine_cla);
engine_cla.addEle1();
Сама функция вызывает объект.
public function addEle1() {
ele1_var = new ele1_vaz;
ele1_var.x = mouseX;
ele1_var.y = 144;
addChild(ele1_var);

}
Получается что то необычное. Объект вызывается в тело класса Engine, но его глубина принадлежит к классу Ele1, из которого я вызывал функцию. Как это исправить?

ps. если при вызове функции я не пишу addChild(engine_cla); - функция вызывается, но объект не появляется.

Добавлено через 5 часов 58 минут
С этим я разобрался)