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

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

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

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
По умолчанию Получение Спрайта через Stage

Почему не могу получить Trace?
Базовый Класс:
Код AS3:
package
{
 
	import flash.display.*;
	import flash.events.*;
	import flash.events.KeyboardEvent;
	import flash.text.TextField;
	import flash.text.engine.TextBlock;
	import flash.text.engine.TextElement;
	import flash.ui.*;
	import flash.utils.*;
 
	import mx.core.*;
 
	public class Game1 extends Sprite
	{
		import flash.net.*;
		import flash.utils.*;
		public var spr1:Sprite = new Sprite; 
		public var spr2:Sprite = new Sprite;
		public var wall1:Shape = new Shape;
		public var wall2:Shape = new Shape;
		public var wall3:Shape = new Shape;
		public var dnco:Shape = new Shape;
		public var rico:Shape = new Shape;
		public var leco:Shape = new Shape;
		public var upco:Shape = new Shape;
		public var jump:Boolean = false;
		public var jmpc:Number = 0;
		public var col:Collision = new Collision();
		public var verwall:Array = [];        
		public var keyri:uint = 39;
		public var recive:String = "";
		public var keyle:uint = 37;
		public var connect:Socket = new Socket();
		public var keypri:Boolean = false;
		public var keyple:Boolean = false;
		public function Game1()
		{
			spr1.graphics.beginFill(0x666666, 1);
			spr1.graphics.drawRect(-300, 0, 1600,1400);
			spr1.graphics.endFill();
			addChild(spr1);
			spr1.name="spr1";
			spr2.width=30;
			spr2.height=50;
			spr2.graphics.beginFill(0x0099ff, 1);
			spr2.graphics.drawRect(0, 0,30 ,50);
			spr2.graphics.endFill();
			spr2.x=30;
			spr2.width=30;
			spr2.height=50
			spr2.y=250;
			wall1.graphics.beginFill(0x222222, 1);
			wall1.graphics.drawRoundRect(-300, 0,1800 ,1600,2,2);
			wall1.graphics.endFill();
			wall1.x=0;
			wall1.y=350;
			wall1.width=600;
			wall1.height=50;
			addChild(wall1);
			dnco.graphics.beginFill(0x222222, 1);
			dnco.graphics.drawRoundRect(5, 45,25 ,10, 2, 2);
			dnco.graphics.endFill();
			dnco.x=5;
			dnco.y=0;
			dnco.width=20;
			dnco.height=5;
			upco.graphics.beginFill(0x222222, 1);
			upco.graphics.drawRoundRect(0, 0,1800 ,1600, 2, 2);
			upco.graphics.endFill();			
			upco.x=5;
			upco.y=0;
			upco.width=20;
			upco.height=5;
			leco.graphics.beginFill(0x222222, 1);
			leco.graphics.drawRoundRect(0, 5,5 ,40, 2, 2);
			leco.graphics.endFill();
			leco.x=0;
			leco.y=5;
			leco.width=5;
			leco.height=40;
			rico.graphics.beginFill(0x222222, 1);
			rico.graphics.drawRoundRect(0, 0,1800 ,1600, 2, 2);
			rico.graphics.endFill();
			rico.x=25;
			rico.y=5;
			rico.width=5;
			rico.height=40;
			spr2.addChild(leco);
			spr2.addChild(rico);
			spr2.addChild(upco);
			spr2.addChild(dnco);
			spr1.addChild(spr2);
			spr2.name="spr2";
			wall1.name="wall1";
			dnco.name="dnco";
			rico.name="rico";
			leco.name="leco";
			upco.name="upco";	
			stage.addEventListener(KeyboardEvent.KEY_DOWN, onkey);
			stage.addEventListener(KeyboardEvent.KEY_UP, onup);
			stage.addEventListener(Event.ENTER_FRAME, frasher);
			start();
		}
		public function start():void
		{
			var col:Collision = new Collision();
			jmpc=spr1.y-40;
			col.level.push(wall1);
 
		}
		public function jumpanim():void
		{
			if((jump == true) && (col.coldn == true))
			{
				(jmpc=(spr1.y-40));
			}
			if((jump == true) && (jmpc>spr2.y) && (col.coldn == true))
			{
				jump=false;
			}
		}
		public function onup(event:KeyboardEvent):void
		{
			if(event.keyCode == keyri)
			{
				keypri = false;
			}
			if(event.keyCode == keyle)
			{
				keyple = false;
			}
		}
 
		public function onkey(event:KeyboardEvent):void
		{
			if((event.keyCode == Keyboard.RIGHT) && (spr2.x <= 594) && (col.colri == false))
			{
				(spr2.x=(spr2.x+5));
				keypri=true;
			}
			if((event.keyCode == Keyboard.LEFT) && (spr2.x >= 0) && (col.colle == false))
			{
				(spr2.x=(spr2.x-5));
				keyple=true;
			}
			if((event.keyCode == Keyboard.UP) && (jump == false) && (col.coldn == true) && (col.colup == false))
			{
				jump=true;
				jumpanim();
			}
		}
 
		public function frasher(event:Event):void
		{
			if((spr2.x > 0) && (col.coldn == false) && (jump == false))
			{
				spr2.y=(spr2.y + 4);
			}
			if((keypri == true) && (spr2.x >= 0) && (spr2.x <= 620) && (col.colri == false))
			{
				(spr2.x=(spr2.x+5));
			}
			if((keyple == true) && (spr2.x >= 0) && (spr2.x <= 620) && (col.colle == false))
			{
				(spr2.x=(spr2.x-5));
			}
 
			if((jump == true) && (spr2.y<jmpc))
			{
				jump = false;
			}
			else if(jump == true)
			{
				(spr2.y=(spr2.y-8));
			}
			if(col.colle == true)
			{
				jump=false;
				keypri=false;
				keyple=false;
				while(col.colle == false)
				{
					spr2.x=(spr2.x+4);
				}
			}
			if(col.colri == true)
			{
				jump=false;
				keypri=false;
				keyple=false;
				while(col.colri == false)
				{
					spr2.x=(spr2.x-4);
				}
			}
		}
	}
}
Класс с Trace:
Код AS3:
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.events.Event;
	import flash.events.IEventDispatcher;
	import flash.events.KeyboardEvent;
	import flash.ui.*;
	public dynamic class Collision extends Sprite
	{
		public var main:Game1;
		public var i:int = 0;
		public var level:Array = [];
		public var coldn:Boolean = false;
		public var colup:Boolean = false;
		public var colri:Boolean = false;
		public var colle:Boolean = false;
		public function Collision()
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{	
			removeEventListener(Event.ADDED_TO_STAGE, init);
			stage.addEventListener(Event.ENTER_FRAME, collis);
		}
		public function collis(event:Event):void
		{
			trace(stage.getChildAt(2) as String);
}
__________________
...Nothing can't be coded...

Старый 14.01.2013, 15:16
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
потому что у тебя в stage ровно один мувик - Game1. А всякие wall и spr1 добавляются в него. И вообще, ловить мувики вот таким образом, через getChildAt, getChildByName - это плохой код. Плохо читаемый, тяжело искать ошибки. В ООП так не делают. Если у тебя объект Game1 плотно взаимодействует с collision - то прямо передай ему ссылку на Game1, или данные, которые ему нужны.

Вообще, судя по названию "Collision" - у тебя там обработка коллизий происходит. Я бы ее не отделял от игрового класса, это не логично. Ну или сделал бы полностью статический класс, или даже просто отдельную функцию в пакете, если код класса начинает превращаться в простыню и мне хочется разбить класс на несколько файлов.
__________________
мой пустой блог

Старый 14.01.2013, 15:20
fd96 вне форума Посмотреть профиль Отправить личное сообщение для fd96 Найти все сообщения от fd96
  № 3  
Ответить с цитированием
fd96
 
Аватар для fd96

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
игровой класс и так огромный уже =( хотел на классы разделить , если в один класс засунуть это - то работает. Посоветуй как разделить , в Игровом классе есть ещё loop функция, она плотно взаимодействует с Collision... так что если вызывать на прямую то loop который обновляется 60 раз в секунду по enterFrame выведет цикличную рекурсию и Stack Owerflow

Добавлено через 25 минут
iflamberg , а что вы имели в виду под
Цитата:
или даже просто отдельную функцию в пакете
__________________
...Nothing can't be coded...

Старый 14.01.2013, 15:48
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Ну так на объекты не абы как разделяют. У тебя в collision, я так понимаю, обработка столкновений, а в loop, скорее всего, основной игровой цикл, вся логика. Логично было бы все таки их оствить вместе. Вместо этого наружу, в отдельный класс, можно было бы выделить контроллер клавиатуры, карту и ее генератор(если у тебя случайным образом карта генерируется), вот эту твою простыню
Код AS3:
			spr1.graphics.beginFill(0x666666, 1);
			spr1.graphics.drawRect(-300, 0, 1600,1400);
			spr1.graphics.endFill();
			addChild(spr1);
			spr1.name="spr1";
			spr2.width=30;
			spr2.height=50;
			spr2.graphics.beginFill(0x0099ff, 1);
			spr2.graphics.drawRect(0, 0,30 ,50);
			spr2.graphics.endFill();
			spr2.x=30;
			spr2.width=30;
			spr2.height=50
			spr2.y=250;
поделить на объекты, чтобы этот код у них в конструкторе оказался. Опять же, если у этих объектов одинаковая природа, что так и есть судя по названиям wall, spr - то пусть это будет отдельный наследник спрайта, пусть он получает в конструктор все эти выставляемые тобой x,y,width,height и данные для beginFill/drawRect и т.д. и ты избавишься от приличной простыни.

А вообще ООП - не панацея. Я,например, считаю, что если по смыслу объект не разделим, и над всем его кодом работает один человек, значит быть простыне, благо инспекторы классов и автокоплит делают работу с ними почти комфортной.
__________________
мой пустой блог

Старый 14.01.2013, 15:53
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 5  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
а зачем import mx.core.* ?
__________________
adobe AS3 manual

Старый 14.01.2013, 15:55
fd96 вне форума Посмотреть профиль Отправить личное сообщение для fd96 Найти все сообщения от fd96
  № 6  
Ответить с цитированием
fd96
 
Аватар для fd96

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
Тут не только карта создаётся , ещё фон и спрайт игрока =) Вот в чём беда, loop это цикл с анимацией движения и гравитацией , ты прав , по логике это и вправду корректно не делится ,я могу только вынести создание карты и обращаться из главного класса к нему, но разве это панацея? А простыня приличная уже , могу полную версию показать. К слову контролёр клавиатуры плотно с главным loop взаимодействует, потому и прошу помощи я сам не могу сделать логику ООП и жду хотя - бы какой то простейшей конструкции чтобы это разделить , работаю в Flash Builder там не особо удобно выходит таки.. Если я вам уже надоел - извиняюсь.

Добавлено через 34 секунды
strangedk здесь не полный скрипт , тут для конкретного вопроса...
__________________
...Nothing can't be coded...

Старый 14.01.2013, 16:41
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 7  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Ну я не знаю. У меня вот,скажем, и по 70 килобайтов файлы классов получались, и меньше его ну никак не сделать, там логика передвижений, столкновений, сортировки спрайтов по глубине в изометрии, зачем это разносить?

Но это не твой случай, fd96. Тут можно разнести. Но тут такое дело... эту работу можешь выполнить ты и только ты. Никто не захочет в твоих простынях копаться, это не спросили-ответил вариант, это надо делать вдумчиво.

Пока же у тебя я не вижу понимания самого ООП. Вот скажем, можно ли выделить проверку столкновений в отдельный класс Collision? Да почему бы нет. Пусть будет такой себе класс, который для объекта проверит его столкновения с другим объектом и изменит состояния своих переменных colup, coldown и т.д. Но тогда он не должен искать объекты на сцене через stage.getChild. Передай ему те объекты, с которыми ему взаимодействовать. Через конструктор, вызов функции, вызов статической функции, еще как нибудь.

Или скажем контроллер клавиатуры. Как он работает? Как он должен взаимодействовать с основным классом и объектами на сцене? Нужен ли он вообще? Ну, в принципе, нужен. Зачем хранить в основном классе, какие клавиши нажаты, какие нет? Зачем держать слушатели клавиатуры в основном классе? loop плотно работает с клавиатурой? Ну и отлично. Главный класс может держать ссылку на контроллер клавиатуры, loop по ссылке обращается к контроллеру клавиатуры и узнает какие клавиши зажаты, куда двигать персонажа. Или, наоборот, контроллер клавиатуры может держать у себя ссылку на главный класс и по нажатию кнопки, вызывать функцию главного класса, заставляя его выполнять какие-то действия. Например, по нажатию ESC, вызываем game.pause(). Понимаешь? Какие-то такие должны быть размышления.
__________________
мой пустой блог

Старый 14.01.2013, 18:48
fd96 вне форума Посмотреть профиль Отправить личное сообщение для fd96 Найти все сообщения от fd96
  № 8  
Ответить с цитированием
fd96
 
Аватар для fd96

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
Спасибо, навёли меня на мысли , я изначально неверно строил логику функций, передвижения у меня задействованы не в loop, при нажатии кнопки идёт выполнение условия и взаимодействие со спрайтом, то есть класс с движением будет обращаться и к Game1 и к Collision. И если вызывать их друг из друга то будет рекурсия и stack owerflow, а статичными их сделать не выйдет потому, что они меняют значения в процессе выполнения. Использовать для каждого мизерного движения Синглтоны - тоже плохая идея. Мне посоветовали сделать интерфес с переменными и везде их подставлять из интерфейса , так возможно будет лучше?
__________________
...Nothing can't be coded...

Старый 14.01.2013, 19:51
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 9  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Интерфейс?) Я думаю не стоит вам трогать интерфейсы сейчас.
__________________
return this...

Старый 14.01.2013, 20:24
fd96 вне форума Посмотреть профиль Отправить личное сообщение для fd96 Найти все сообщения от fd96
  № 10  
Ответить с цитированием
fd96
 
Аватар для fd96

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
Я понимаю, что будет печально сначала, но вдруг получится...
__________________
...Nothing can't be coded...

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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