Просмотр полной версии : Помощь с ООП
WaldeMar1321
18.03.2015, 12:31
Здравствуйте! Есть одна проблема, и вы возможно можете помочь.
Описание - есть три класса: Class1, Class2, и собственно Main (все MovieClip)
Class1 проигрывает свою анимацию на собственном таймере с использованием nextFrame,
Class2 должен подождать до нужного кадра анимации Class1 и выполнить свою со своим таймером.
Логично будет отслеживать Class1.currentFrame, я пытался сделать это внутри Class2.
Проблема 1: Я не знаю возможно ли это? Так как я обращаюсь к свойству MovieClip через Class1
без явных определений типа "Class1::MovieClip::currenFrame" или как-то так. В С++ с этим по проще.
И вторая проблема: весь не большой код имеет структуру
package { //Main.as
import flash.*//и все такое
public class Main extends Movie Clip {
var C1:MovieClip = new Class1;
var C2:MovieClip = new Class2;
public function Main()
{
}
//Везде Main видит оба класса и свойства и методы базового класса MovieClip
}
}
package { //Class1.as
import flash.*
public class Class1 extends MovieClip {
public function Class1 () {}
}
}
package { // Class2.as
import flash.*
public class Class2 extends MovieClip
{
public function Class2 () {}
public function Panic()
{
if(Class1.currenFrame == 666)
{
//Do something!
}
}
}
}
Код имеет примерно такой вид. Но эти два класса
друг друга не видят. Как только я не обявлял их в Main.
Подскажите пожалуйста, что не так? Эти файлы в одном проекте, в одной папке.
Спасибо.
package { //Main.as
import flash.*//и все такое
public class Main extends MovieClip {
var C1:MovieClip = new Class1;
var C2:MovieClip = new Class2;
public function Main()
{
C1.play();
addEventListener(Event.ENTER_FRAME , onFrame);
}
private function onFrame(e:Event):void
{ if(C1.currentFrame == 666) C2.gotoAndPlay(1);
}
}
}
package { //Class1.as
import flash.*
public class Class1 extends MovieClip {
public function Class1 ()
{
}
}
}
package { // Class2.as
import flash.*
public class Class2 extends MovieClip
{
public function Class2 () {}
}
}
WaldeMar1321
18.07.2015, 21:37
Здравствуйте, спасибо за совет, только что дошли руки его проверить)))
Занят был, не поверите))
К сожалению вышеописанная вами схема работает раз через пять. Кадров там конечно не 666, но по идее цель умеет увернуться от выстрела иногда, но для этого нужно их точно регистрировать. нажатие мыши, 10 миллисекунд анимации, и только перед попаданием у нее есть шанс, иногда. Но если быстро кликать мышкой (не сильно быстро, но достаточно), этот момент проскальзывает.((
Сталкивались с таким? Спасибо за участие.
AlexCooper
18.07.2015, 22:00
К сожалению вышеописанная вами схема работает раз через пять. Кадров там конечно не 666, но по идее цель умеет увернуться от выстрела иногда, но для этого нужно их точно регистрировать. нажатие мыши, 10 миллисекунд анимации, и только перед попаданием у нее есть шанс, иногда.
Основная причина, покадровая анимация. Вы используете анимацию в виде набора кадров, собранных в иде на таймлайне. Проблема в том, что используя постоянные и не изменные кадры, вы теряете контроль над воспроизведением как таковым, вы можете лишь отслеживать воспроизведение. Если вы хотите научиться программированию, ваша цель должна быть кодинг в блокноте. В противном случае из покадровой анимации делают снимки, и работают не как с мувиклипом, а как с массивом кадров. И уже в точности что, когда, и как "крутить" при показе.
Соотвественно работая с мувиклипом, предлагать решения, стоит только в том случае, если вы хотите просто выполнить задачу
WaldeMar1321
18.07.2015, 22:17
К сожалению я пока не могу рисовать прямо во флэше. Я делаю трех мерную анимацию в блендере, рендерю и потом по кадрам закиваю во флэш и там расставляю на таймлайне. Про кодинг в блокноте доставило))) Если бы не узнал что на флэше можно относительно быстро зарабатывать, продолжал бы писать на С++ в блокноте)))
Но смысл последнего предложения я не понял.
AlexCooper
18.07.2015, 22:59
package { //Main.as
import flash.*//и все такое
public class Main extends Movie Clip {
var C1:MovieClip = new Class1;
var C2:MovieClip = new Class2;
public function Main()
{
C1.addEventListener( CustomEvent.COMPLETE, playHandler );
C2.addEventListener( CustomEvent.COMPLETE, playHandler );
C1.play()
}
public function playHandler(e:CustomEvent):void {
switch (e.target) {
case C1:
/*
if (e.label=='somelabel666') { */
C1.stop();
C2.play();
// }
break;
}
}
//Везде Main видит оба класса и свойства и методы базового класса MovieClip
}
}
package { //CustomEvent.as
public class CustomEvent extends Event {
public static var PLAY:String = 'PLAY';
public static var COMPLETE:String = 'COMPLETE';
public var label:String='default'
public function CustomMovie (type:String, label:String='') {
super(type,true);
this.label = label;
}
}
}
package { //CustomMovie.as
import flash.*
public class CustomMovie extends MovieClip {
public function CustomMovie () {
}
protected function complete(label:String=''):void {
this.dispatchEvent( new CustomEvent(CustomEvent.COMPLETE, label ) );
}
}
}
package { //Class1.as
import flash.*
public class Class1 extends CustomMovie {
public function Class1 () {
addEventListener( Event.ENTER_FRAME, frameHandler );
}
public function frameHandler(e:Event):void {
if(this.currenFrame == 666)
{
removeEventListener( Event.ENTER_FRAME, frameHandler );
complete('somelable666');
}
}
}
}
package { // Class2.as
import flash.events.Event;
public class Class2 extends CustomMovie
{
public function Class2 () {}
public function Panic()
{
}
}
}
"Class1 проигрывает свою анимацию на собственном таймере с использованием nextFrame,
Class2 должен подождать до нужного кадра анимации Class1 и выполнить свою со своим таймером. "
самый простой вариант - генерить событие из Class1, детектить это событие, и начинать проигрывание в Class2.
т.е. - ОБРАЗНО это может выглядеть примерно так:
var c1:Class1 = new Class1();
var c2:Class2 = new Class2();
c1.addEventListener("class_2_play_your_animation", function(e:Event):void{ c2.play() });
внутри же класса Class1, по достижении нужного момента, генерить событие
dispatchEvent(new Event("class_2_play_your_animation"));
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.