Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.05.2012, 15:13
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 1  
Ответить с цитированием
Tetraeon

Регистрация: May 2012
Сообщений: 166
По умолчанию Распределение оновного кода по классам

Привет всем! Я недавно начал изучать AS3 до этого вообще не сталкивался с программированием. Выучил несколько уроков и набросал мини движок 2D Аркады прямо во .fla файле... и да... я уже понял что это было сделано зря. Теперь уже неделю мучаюсь с тем как раскидать весь этот код по классам... в интернете много чего, но то что мне нужно очень сложно найти без знаний в чем же именно проблема. Если вы мне поможете с этим я буду вам очень признателен.

В данный момент создал главный класс со всем кодом и подкласс со слушателем клавиатуры, но столкнулся с 2 проблемами:

1. Привязка слушателя событий клавиатуры к stage. в классе выдает ошибку.
2. Объект любого другого класса отличного от главного (при попытках их создания) не объявляются в главном классе как переменная.

По первому вопросу судя по прочитанному на этом форуме нужно что то с фокусом сделать, но не могу достать информации об этом.
Код главного класса:
Код AS3:
package  
{
	классы flash.
 
	public class Main extends MovieClip
	{
          public var hero = new hero_mc;
          и др.
 
                public function Main() 
		{
			addChild(hero);
                         и др.
 
			addEventListener (Event.ENTER_FRAME , moveHeroE);
			timerGA.addEventListener (TimerEvent.TIMER, GoblinAutoAttack);
			addEventListener(MouseEvent.MOUSE_MOVE , Cursor );
			addEventListener (MouseEvent.MOUSE_DOWN , MouseDown );
			addEventListener (MouseEvent.MOUSE_UP , MouseUp );
			addEventListener (Event.ENTER_FRAME , moveHero);
			timer.addEventListener (TimerEvent.TIMER, AutoAttack);
                }
Далее идут функции до которых я еще не имел возможности добраться чтобы проверить.



Код Подкласса:

Код AS3:
package  
{
import Main
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
 
	public class Keys extends Main
	{
		public function Keys() 
		{
			addEventListener (KeyboardEvent.KEY_DOWN , key_down );
			addEventListener (KeyboardEvent.KEY_UP , key_up );
		}
					public function key_down (e:KeyboardEvent): void 
					{
						if (e.keyCode == Keyboard.A)
						{
							left = 1;
							trace('left=1');
							Moving=true;
						}
						if (e.keyCode == Keyboard.W)
						{
							up = 1;
							Moving=true;
						}
						if  (e.keyCode == Keyboard.D)
						{
							right = 1;
							Moving=true;
						}
						if  (e.keyCode == Keyboard.S)
						{
							down = 1;
							Moving=true;
						}
					}
/////////////////////////////////////////////////////////////////////////////
					public function key_up (e:KeyboardEvent): void
					{
						if (e.keyCode == Keyboard.A)
						{
							HeroSpeed = 2;
							left = 0;
							Moving=false;
							if (A==0)
							{
							hero.gotoAndStop(2);
							}
						}
						if (e.keyCode == Keyboard.W)
						{
							up = 0;
							Moving=false;
							if (A==0)
							{
							hero.gotoAndStop(6);
							}
						}
						if  (e.keyCode == Keyboard.D)
						{
							right = 0;
							HeroSpeed = 2;
							Moving=false;
							if (A==0)
							{
							hero.gotoAndStop(2);
							}
						}
						if  (e.keyCode == Keyboard.S)
						{
							down = 0;
							Moving=false;
							if (A==0)
							{
							hero.gotoAndStop(2);
							}
						}
					}
	}	
}
т.к. все действия (hero.x += HeroSpeed) находятся в главном классе в варианте кнопки left я вписал команду trace чтобы видеть выполняются ли действия и даже не знаю будут ли они выполнятся помимо trace, я надеюсь что расширение главного класса даст такую возможность.


Последний раз редактировалось Tetraeon; 06.05.2012 в 17:50.
Старый 06.05.2012, 15:45
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
extends Main
Никогда так не делайте. Мейн это Мейн, он всегда один и содержит все приложение. Если в Мейне Вы создаете экземпляр Кейс, создается и новый Мейн (в конструкторе класса Кейс будет запущен конструктор суперкласса Мейн), а значит опять создан экземпляр Кейс, а в нем — Мейн и так до бесконечности. Или у Вас класс Документа это Кейс?)))
С заглавной буквы называют только Классы. Методы и переменные — всегда с маленькой.
64 "if", в каждом из которых Moving=true; это сила. Если это выражение не зависит от условий, зачем его пихать в блоки условий?
"Привязка к стейдж" — надо чтобы стейдж у экземпляра уже был, когда Вы пытаетесь повесить на стейдж слушатель. Подпишитесь на событие Event.ADDED_TO_STAGE и инициализируйте слушателей только в обработчике этого события.
Второй вопрос не понятен. Конкретизируйте.
__________________
Reality.getBounds(this);

Старый 06.05.2012, 16:27
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 3  
Ответить с цитированием
Tetraeon

Регистрация: May 2012
Сообщений: 166
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Никогда так не делайте. Мейн это Мейн, он всегда один и содержит все приложение. Если в Мейне Вы создаете экземпляр Кейс, создается и новый Мейн (в конструкторе класса Кейс будет запущен конструктор суперкласса Мейн), а значит опять создан экземпляр Кейс, а в нем — Мейн и так до бесконечности. Или у Вас класс Документа это Кейс?)))
С заглавной буквы называют только Классы. Методы и переменные — всегда с маленькой.
64 "if", в каждом из которых Moving=true; это сила. Если это выражение не зависит от условий, зачем его пихать в блоки условий?
"Привязка к стейдж" — надо чтобы стейдж у экземпляра уже был, когда Вы пытаетесь повесить на стейдж слушатель. Подпишитесь на событие Event.ADDED_TO_STAGE и инициализируйте слушателей только в обработчике этого события.
Второй вопрос не понятен. Конкретизируйте.
т.е. в субклассе Keys extends должен быть MovieClip ?
По поводу Moving это только часть всей программы и это значение указывает что персонаж движется(оно в условии нажатия клавиши), чтобы в других условиях не перечислять все направления движения. Хотя возможно есть и более простой способ, но я пока навскидку так набросал все таки опыта у меня всего 3 недели)
С Event.ADDED_TO_STAGE вроде бы справился... Спасибо за подсказку! Перс начал двигаться после такого преобразования:
Код AS3:
addEventListener (Event.ADDED_TO_STAGE , addStage);
public function addStage (e:Event): void
{
stage.addEventListener (KeyboardEvent.KEY_DOWN , key_down );
stage.addEventListener (KeyboardEvent.KEY_UP , key_up );
}

По поводу 2го вопроса: создавал я для отдельного персонажа класс закинул ему туда условия не связывая их с остальными частями программы я еще не совсем понимаю как это делается...)) и попытался в Main просто его отметить как переменную т.е. MovieClip'у дал класс Goblin и в Main написал public var Gob = new Goblin_mc; ну и поперли ошибки. (этот этап уже пройден, все получилось)

Добавлено через 3 часа 4 минуты
Столкнулся с очередной проблемой:
При расфасовке кода из основного класса в подкласс нужно каким то образом вместо переменных писать ссылки на переменные из основного класса... как это сделать?

И вот еще не могу понять как сделать чтобы при создании нескольких экземпляров 1 класса не было конфликтов имен их переменных?
К примеру в игре у вражеского персонажа есть атрибуты такие как поле видимости и поле дистанции атаки, они имеют свое имя которое указано в его классе. При таком раскладе если я направляю своего персонажа на 1го из таких врагов как обойти конфликт схожести имен этих полей... ведь мой персонаж будит идти к "FieldGoblin" которых 2 и больше.

Добавлено через 22 часа 22 минуты
Перепробовал уже много вариантов связывания главного класса и 2-ух подклассов между собой, но что то не получается... связывание произвожу таким образом:
Например в главном классе Main
Код AS3:
public var gob:Goblin = new Goblin;  ////Goblin - подкласс MovieClip'a
public var war:Warrior = new Warrior; /////Warrior подкласс MovieClip'a
public var curs = new cursor_mc;
/////Все классы расширяют MovieClip
public function Main() 
{
addChild (curs);
 
addChild (war);
war.x = 275;
war.y = 400;
 
addChild(gob);
gob.x = 500;
gob.y = 400;
//////// тут есть подозрения что надо ссылки на 
////////мувиклипы давать а не на их классы, 
///////но так и так в конце ошибки идут.
/////После объявления слушателей:
	public function mouseUp (e:MouseEvent):void
	{
	    if (gob.FieldHeroE.hitTestObject(curs))
		{
			if (!gob.statusDead)
			{
			gob.heroEHpline.visible = true;
			gob.FieldHeroE.visible = true;
			addChild(war.BattleMark);
			war.A=1;
			}
////И  так далее, все переменные с gob. и war. 
////содержатся в подклассах. Выдает такую ошибку:
Error: Error #1023: Переполнение стека.
	at Warrior()
	at Goblin()
В нете смотрел что ошибка связана с не симметричностью классов, но я ничего не понимаю.
наверняка я не 1й кто таким же методом тыка с обрывками информации из интернета пытается что то создать)))
Может есть у кого какие наводки ?

Добавлено через 46 часов 27 минут
Пересмотрел вариант создания программы вынес МувиКлип Врага на сцену, снес его переменную и
назвав его тем же именем что и его бывшая переменная.
сейчас столкнулся с такой проблемой:
Решил в МувиКлип Врага вложить все его атрибуты(поля обзора и т.д.), а не центрировать их с каждым кадром, но нужно теперь в объявлении переменной каждого поля указать путь внутрь клипа Врага.. как это сделать?
пробовал так:
Код AS3:
///heroE - имя Врага
///FieldHeroEn_mc - название клипа поля.
var FieldHeroE = new heroE.FieldHeroEn_mc;


Последний раз редактировалось Tetraeon; 08.05.2012 в 14:53.
Создать новую тему Ответ Часовой пояс GMT +4, время: 19:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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