|
|
|||||
Stack Owerflow или Рекурсия
Имею 5 классов в скрипте.
Соединил их воедино взаимодействий между ними ОЧЕНЬ много. но при запуске появилась ошибка Переполнение буфера at Collision() at Loop() at Mapcreate() at Collision() at Loop() at Mapcreate() Я понимаю что я нуб, но всё же , если найдёться кто - нибудь кто разберёт это ... то постарайтесь мне объяснить , что я не так сделал... 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; } } } 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; } } } } } 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++; } } } } 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); } } } 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. |
|
|||||
[+1 22.04.13]
[+1 06.03.13] Регистрация: Apr 2012
Сообщений: 239
|
вот тут допишите остальные кнопки, и поменяйте на константы
|
|
|||||
разве из за дополнительных условий может быть stack owerflow? Я скажу больше , если все эти классы объеденить в в один большой . то движок для будущей игры работает ,а если разбиваю на классы - нет ...
|
|
|||||
Регистрация: Dec 2012
Сообщений: 39
|
то есть изначально все было написано в одну большую простыню и работало? Как в оригинале было можно глянуть?
|
|
|||||
[+1 22.04.13]
[+1 06.03.13] Регистрация: Apr 2012
Сообщений: 239
|
while(collision.colle == false) { main.spr2.x=(main.spr2.x+4); } while(collision.colri == false) { main.spr2.x=(main.spr2.x-4); } эти циклы бесконечные Добавлено через 2 минуты а нет... он в эти циклы даже не войдет, можете их удалять Добавлено через 3 минуты кароче переписывайте все заново, в этом отстое нереально разобраться |
|
|||||
в Mapcreate создается экземпляр Loop и начинает дергать loop.
в экземпляре Loop создается экземпляр Collision. Угадаете, что создается в Collision? Правильно! Mapcreate. А теперь смотрим на стек новым взглядом: Цитата:
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
2temp Можно , даже результат можно увидеть , есть собранный Swf из простыни.
2 gagaga Эти 2 условия являясь циклами исключают застревание ГГ игры в стенах при hitTestObject() откатывая его назад на расстояние где нет коллизии. 2 GBee Спасибо , но это я знал , я зацитирую из своего кода: Найти суть проблемы было ведь не сложно , вопрос в том , как это всё соединить иначе. |
|
|||||
А если его в Game1 засунуть при создании последнего спрайта?
|
|
|||||
ээ, это ваша программа? Судя по логике, он создается в game1. Потом когда В НЕМ создается ЛУУП, в ЛУУП надо отдать указатель на мапкреате. А там дальше прокинуть его в коллизии. Либо переписать все к чертовой матери.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
Часовой пояс GMT +4, время: 17:03. |
|
« Предыдущая тема | Следующая тема » |
Теги |
stack overflow , stackoverflow , переполнение буфера |
Опции темы | |
Опции просмотра | |
|
|