![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2012
Сообщений: 166
|
Привет всем! Я недавно начал изучать AS3 до этого вообще не сталкивался с программированием. Выучил несколько уроков и набросал мини движок 2D Аркады прямо во .fla файле... и да... я уже понял что это было сделано зря. Теперь уже неделю мучаюсь с тем как раскидать весь этот код по классам... в интернете много чего, но то что мне нужно очень сложно найти без знаний в чем же именно проблема. Если вы мне поможете с этим я буду вам очень признателен.
В данный момент создал главный класс со всем кодом и подкласс со слушателем клавиатуры, но столкнулся с 2 проблемами: 1. Привязка слушателя событий клавиатуры к stage. в классе выдает ошибку. 2. Объект любого другого класса отличного от главного (при попытках их создания) не объявляются в главном классе как переменная. По первому вопросу судя по прочитанному на этом форуме нужно что то с фокусом сделать, но не могу достать информации об этом. Код главного класса: 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); } Код Подкласса: 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); } } } } } Последний раз редактировалось Tetraeon; 06.05.2012 в 17:50. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
С заглавной буквы называют только Классы. Методы и переменные — всегда с маленькой. 64 "if", в каждом из которых Moving=true; это сила. Если это выражение не зависит от условий, зачем его пихать в блоки условий? "Привязка к стейдж" — надо чтобы стейдж у экземпляра уже был, когда Вы пытаетесь повесить на стейдж слушатель. Подпишитесь на событие Event.ADDED_TO_STAGE и инициализируйте слушателей только в обработчике этого события. Второй вопрос не понятен. Конкретизируйте.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: May 2012
Сообщений: 166
|
Цитата:
По поводу Moving это только часть всей программы и это значение указывает что персонаж движется(оно в условии нажатия клавиши), чтобы в других условиях не перечислять все направления движения. Хотя возможно есть и более простой способ, но я пока навскидку так набросал все таки опыта у меня всего 3 недели) С Event.ADDED_TO_STAGE вроде бы справился... Спасибо за подсказку! Перс начал двигаться после такого преобразования: 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 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 минут Пересмотрел вариант создания программы вынес МувиКлип Врага на сцену, снес его переменную и назвав его тем же именем что и его бывшая переменная. сейчас столкнулся с такой проблемой: Решил в МувиКлип Врага вложить все его атрибуты(поля обзора и т.д.), а не центрировать их с каждым кадром, но нужно теперь в объявлении переменной каждого поля указать путь внутрь клипа Врага.. как это сделать? пробовал так: Последний раз редактировалось Tetraeon; 08.05.2012 в 14:53. |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:51. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|