Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Stack Owerflow или Рекурсия (http://www.flasher.ru/forum/showthread.php?t=192271)

fd96 11.01.2013 12:20

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);
                                        }
                                }
                        }       
                }
        }


gagaga 11.01.2013 12:44

Код AS3:

public function onup(event:KeyboardEvent):void
                {
                        if(event.keyCode == 39)
                        {
                                keypri = false;
                        }
                        if(event.keyCode == 37)
                        {
                                keyple = false;
                        }
                }

вот тут допишите остальные кнопки, и поменяйте на константы

fd96 11.01.2013 12:48

разве из за дополнительных условий может быть stack owerflow? Я скажу больше , если все эти классы объеденить в в один большой . то движок для будущей игры работает ,а если разбиваю на классы - нет ...

temp 11.01.2013 13:38

то есть изначально все было написано в одну большую простыню и работало? Как в оригинале было можно глянуть?

gagaga 11.01.2013 14:27

Код 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 минуты
кароче переписывайте все заново, в этом отстое нереально разобраться

GBee 11.01.2013 15:49

в Mapcreate создается экземпляр Loop и начинает дергать loop.
в экземпляре Loop создается экземпляр Collision.
Угадаете, что создается в Collision? Правильно! Mapcreate.

А теперь смотрим на стек новым взглядом:
Цитата:

Переполнение буфера at Collision()
at Loop()
at Mapcreate()
at Collision()
at Loop()
at Mapcreate()
Везде указаны конструкторы. В приниципе все просто.

fd96 11.01.2013 16:12

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();

Найти суть проблемы было ведь не сложно , вопрос в том , как это всё соединить иначе.

GBee 11.01.2013 16:21

Думаю Mapcreate должен быть один. Так что можно его кидать в конструктор тем кому он нужен, например.

fd96 11.01.2013 16:25

А если его в Game1 засунуть при создании последнего спрайта?

GBee 11.01.2013 16:39

ээ, это ваша программа? Судя по логике, он создается в game1. Потом когда В НЕМ создается ЛУУП, в ЛУУП надо отдать указатель на мапкреате. А там дальше прокинуть его в коллизии. Либо переписать все к чертовой матери.


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

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