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

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

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

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

Имею 5 классов в скрипте.
Соединил их воедино взаимодействий между ними ОЧЕНЬ много.
но при запуске появилась ошибка
Код:
Переполнение буфера at Collision()
	at Loop()
	at Mapcreate()
	at Collision()
	at Loop()
	at Mapcreate()
код привожу ниже начиная с базового класса.
Я понимаю что я нуб, но всё же , если найдёться кто - нибудь кто разберёт это ... то постарайтесь мне объяснить , что я не так сделал...
Код AS3:
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.ui.*;
	import flash.utils.*;
 
	import mx.core.*;
 
	public class Game1 extends Sprite
	{
		public var spr1:Sprite = new Sprite;
		public var spr2:Shape = new Shape;
		public var dnco:Shape = new Shape;
		public var upco:Shape = new Shape;
		public var rico:Shape = new Shape;
		public var leco:Shape = new Shape;
		public var map:Mapcreate = new Mapcreate();
		public function Game1() 
		{
			spr1.graphics.beginFill(0x00412A, 1);
			spr1.graphics.drawRect(-300, 0, 1800, 400);
			spr1.graphics.endFill();
			addChild(spr1);
			creation();
			addChild(spr2);
			makesen();
			addChild(leco);
			addChild(dnco);
			addChild(upco);
			addChild(rico);
			addChild(map.verwal1)
		}
		public function creation():void
		{
			spr2.graphics.beginFill(0x00AAFF, 0.5);
			spr2.graphics.drawRect(0, 0, 30, 50);
			spr2.graphics.endFill();
			spr2.x = 30;
			spr2.y = 300;
			spr2.width=30;
			spr2.height=50;
		}
		public function makesen():void
		{
			dnco.graphics.beginFill(0x222222, 0.5);
			dnco.graphics.drawRoundRect(0, 0, 20, 5, 5, 5);
			dnco.graphics.endFill();
			dnco.x = spr2.x+5;
			dnco.y = spr2.y+45;
			dnco.width=20;
			dnco.height=5;
 
			upco.graphics.beginFill(0x222222, 0.5);
			upco.graphics.drawRoundRect(0, 0, 20, 5, 5, 5);
			upco.graphics.endFill();
			upco.x = spr2.x+5;
			upco.y = spr2.y;
			upco.width=20;
			upco.height=5;
 
			rico.graphics.beginFill(0x222222, 0.5);
			rico.graphics.drawRoundRect(0, 0, 5, 45, 5, 5);
			rico.graphics.endFill();
			rico.x = spr2.x+25;
			rico.y = spr2.y+2;
			rico.width=5;
			rico.height=45;
 
			leco.graphics.beginFill(0x222222, 0.5);
			leco.graphics.drawRoundRect(0, 0, 5, 45, 5, 5);
			leco.graphics.endFill();
			leco.x = spr2.x;
			leco.y = spr2.y+2;
			leco.width=5;
			leco.height=45;
		}
	}
}
Код 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 Movement
	{
		public var collision:Collision;
		public var keyple:Boolean = false;
		public var keypri:Boolean = false;
		public var jump:Boolean = false;
		public var jmpc:Number = 0;
		public var main:Game1;
		public function Movement()
		{
			main.addEventListener(KeyboardEvent.KEY_DOWN, onkey);
			main.addEventListener(KeyboardEvent.KEY_UP, onup);	
		}
		public function onup(event:KeyboardEvent):void
		{
			if(event.keyCode == 39)
			{
				keypri = false;
			}
			if(event.keyCode == 37)
			{
				keyple = false;
			}
		}
 
		public function onkey(event:KeyboardEvent):void
		{
			if((event.keyCode == Keyboard.RIGHT) && (main.spr2.x <= 594) && (collision.colri == false))
			{
				(main.spr2.x=(main.spr2.x+2));
				keypri=true;
			}
			if((event.keyCode == Keyboard.LEFT) && (main.spr2.x >= 0) && (collision.colle == false))
			{
				(main.spr2.x=(main.spr2.x-2));
				keyple=true;
			}
			if((event.keyCode == Keyboard.UP) && (jump == false) && (collision.coldn == true) && (collision.colup == false))
			{
				jmpc=(main.spr2.y-40);
				jump=true;
				jumpanim();
			}
 
			function jumpanim():void
			{
				if((jump == true) && (collision.coldn == true))
				{
					(jmpc=(main.spr2.y-40));
				}
				if((jump == true) && (jmpc>main.spr2.y) && (collision.coldn == true))
				{
					jump=false;
				}
			}
		}
	}
}
Код 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 
	{
		public var main:Game1;
		public var map:Mapcreate = new Mapcreate();
		public var i:int = 0;
		public var coldn:Boolean = false;
		public var colup:Boolean = false;
		public var colri:Boolean = false;
		public var colle:Boolean = false;
		public function Collision()
		{
			super();
		}
		public function collis():void
		{
			i = 0;
			while(i < (map.level.length))
			{
				if(main.dnco.hitTestObject(map.level[i]) == true)
				{
					coldn = true;
				}
				if(main.rico.hitTestObject(map.level[i]) == true)
				{
					colri = true;
				}
				if(main.leco.hitTestObject(map.level[i]) == true)
				{
					colle = true;
				}
				if(main.upco.hitTestObject(map.level[i]) == true)
				{
					colup = true;
				}
				i++;
			}
		}
	}
}
Код AS3:
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.ui.*;
	import flash.utils.*;
 
	public dynamic class Mapcreate extends Sprite
	{
		public var main:Game1;
		public var loop:Loop = new Loop();
		public var level:Array = [];
		public var verwal1:Sprite = new Sprite;
		public function Mapcreate()
		{
			super();
			verwal1.addEventListener(Event.ENTER_FRAME, loop.loop);
			blocks();
		}
			public function blocks():void
			{
			verwal1.graphics.beginFill(0x222222, 0.5);
			verwal1.graphics.drawRoundRect(0, 0, 600, 50, 15, 15);
			verwal1.graphics.endFill();
			verwal1.x=0;
			verwal1.y=350;
			addChild(verwal1);
			level.unshift(verwal1);
			}
	}
}
Код 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 Loop
	{
		public var main:Game1;
		public var mov:Movement;
		public var collision:Collision = new Collision();
		public function Loop()
		{
			super();
		}
			public function loop(event:Event):void
			{
				collision.collis();
 
				if((main.spr2.x > 0) && (collision.coldn == false) && (mov.jump == false))
				{
					main.spr2.y=(main.spr2.y + 4);
				}
				else if((mov.keypri == true) && (main.spr2.x >= 0) && (main.spr2.x <= 620) && (collision.colri == false))
				{
					(main.spr2.x=(main.spr2.x+4));
				}
				else if((mov.keyple == true) && (main.spr2.x >= 0) && (main.spr2.x <= 620) && (collision.colle == false))
				{
					(main.spr2.x=(main.spr2.x-4));
				}
 
				else if((mov.jump == true) && (main.spr2.y<mov.jmpc))
				{
					mov.jump = false;
				}
				else if(mov.jump == true)
				{
					(main.spr2.y=(main.spr2.y-8));
				}
				if(collision.colle == true)
				{
					mov.jump=false;
					mov.keypri=false;
					mov.keyple=false;
					while(collision.colle == false) 
					{
						main.spr2.x=(main.spr2.x+4);
					}
				}
				else if(collision.colri == true)
				{
					mov.jump=false;
					mov.keypri=false;
					mov.keyple=false;
					while(collision.colri == false) 
					{
						main.spr2.x=(main.spr2.x-4);
					}
				}
			}	
		}
	}


Последний раз редактировалось iNils; 11.01.2013 в 14:35.
Старый 11.01.2013, 12:44
gagaga вне форума Посмотреть профиль Отправить личное сообщение для gagaga Найти все сообщения от gagaga
  № 2  
Ответить с цитированием
gagaga
[+1 22.04.13]
[+1 06.03.13]

Регистрация: Apr 2012
Сообщений: 239
Код AS3:
public function onup(event:KeyboardEvent):void
		{
			if(event.keyCode == 39)
			{
				keypri = false;
			}
			if(event.keyCode == 37)
			{
				keyple = false;
			}
		}
вот тут допишите остальные кнопки, и поменяйте на константы

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

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
разве из за дополнительных условий может быть stack owerflow? Я скажу больше , если все эти классы объеденить в в один большой . то движок для будущей игры работает ,а если разбиваю на классы - нет ...

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

Регистрация: Dec 2012
Сообщений: 39
то есть изначально все было написано в одну большую простыню и работало? Как в оригинале было можно глянуть?

Старый 11.01.2013, 14:27
gagaga вне форума Посмотреть профиль Отправить личное сообщение для gagaga Найти все сообщения от gagaga
  № 5  
Ответить с цитированием
gagaga
[+1 22.04.13]
[+1 06.03.13]

Регистрация: Apr 2012
Сообщений: 239
Код AS3:
	while(collision.colle == false) 
{
	main.spr2.x=(main.spr2.x+4);
}
 
while(collision.colri == false) 
{
	main.spr2.x=(main.spr2.x-4);
}
Добавлено через 33 секунды
эти циклы бесконечные

Добавлено через 2 минуты
а нет... он в эти циклы даже не войдет, можете их удалять

Добавлено через 3 минуты
кароче переписывайте все заново, в этом отстое нереально разобраться

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
в Mapcreate создается экземпляр Loop и начинает дергать loop.
в экземпляре Loop создается экземпляр Collision.
Угадаете, что создается в Collision? Правильно! Mapcreate.

А теперь смотрим на стек новым взглядом:
Цитата:
Переполнение буфера at Collision()
at Loop()
at Mapcreate()
at Collision()
at Loop()
at Mapcreate()
Везде указаны конструкторы. В приниципе все просто.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
2temp Можно , даже результат можно увидеть , есть собранный Swf из простыни.
2 gagaga Эти 2 условия являясь циклами исключают застревание ГГ игры в стенах при hitTestObject() откатывая его назад на расстояние где нет коллизии.
2 GBee Спасибо , но это я знал , я зацитирую из своего кода:
Код AS3:
public var loop:Loop = new Loop();
public var collision:Collision = new Collision();
public var map:Mapcreate = new Mapcreate();
Найти суть проблемы было ведь не сложно , вопрос в том , как это всё соединить иначе.

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Думаю Mapcreate должен быть один. Так что можно его кидать в конструктор тем кому он нужен, например.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

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

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
ээ, это ваша программа? Судя по логике, он создается в game1. Потом когда В НЕМ создается ЛУУП, в ЛУУП надо отдать указатель на мапкреате. А там дальше прокинуть его в коллизии. Либо переписать все к чертовой матери.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Теги
stack overflow , stackoverflow , переполнение буфера
Опции темы
Опции просмотра

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

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


 


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


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