|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
застревают мувиклипы
задался заставить кораблики свои стрелять, все вроде получилось, но появилась проблема, некоторые снаряды застревают, т.е. просто останавливаются посреди сцены и не исчезают, так же заметил новый косяк, ко всем корабликам привязан мувик работы двигателя, так вот на кораблике героя мувики иногда отстают, а потом появляюся в нужном месте
ещё появляется переодически TypeError: Error #1009: Cannot access a property or method of a null object reference. at global/XY_vrag_1() at global/boll_action() import flash.display.MovieClip; import flash.events.Event; import flash.geom.Point; var FireArray: Array = new Array(); var fireBoolean: Boolean = false; var speedboll: Number = 45; var start: Boolean = false; var bollfire: Boolean = false; stage.addEventListener(KeyboardEvent.KEY_UP, fn_fire); function fn_fire(event: KeyboardEvent): void { if ((start) && (event.keyCode == 90)) { var bollF: boll_ms = new boll_ms(); var p: Point = stage.globalToLocal(ship.localToGlobal(new Point(0, 70))); bollF.x = p.x; bollF.y = p.y; bollF.rotation = ship.rotation; FireArray.push(bollF); this.addChild(bollF); bollfire = true; } } stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_fire2); function fn_fire2(event: KeyboardEvent): void { if ((start) && (event.keyCode == 90) && (bollfire)) { var bollF: boll_ms = new boll_ms(); var p: Point = stage.globalToLocal(ship.localToGlobal(new Point(0, -70))); bollF.x = p.x; bollF.y = p.y; bollF.rotation = ship.rotation; FireArray.push(bollF); this.addChild(bollF); bollfire = false; } } addEventListener(Event.ENTER_FRAME, boll_action); function boll_action(e: Event): void { XY_vrag_1(); //вызов функции корабля var i: int = FireArray.length; while (i--) { var j: boll_ms = FireArray[i]; j.x = j.x - speedboll * Math.cos(j.rotation / 180 * Math.PI); j.y = j.y - speedboll * Math.sin(j.rotation / 180 * Math.PI); if (j.x > stage.stageWidth) { FireArray.splice(i, 1); removeChild(j); } else if (j.x < 0) { FireArray.splice(i, 1); removeChild(j); } if (j.y > stage.stageHeight) { FireArray.splice(i, 1); removeChild(j); } else if (j.y < 0) { FireArray.splice(i, 1); removeChild(j); } var p: Point = stage.globalToLocal(ship.localToGlobal(new Point(190, 0))); var q: Point = stage.globalToLocal(ship.localToGlobal(new Point(190, 30))); var r: Point = stage.globalToLocal(ship.localToGlobal(new Point(190, -30))); vihlop_c.x = p.x; vihlop_c.y = p.y; vihlop_r.x = q.x; vihlop_r.y = q.y; vihlop_l.x = r.x; vihlop_l.y = r.y; vihlop_c.rotation = ship.rotation - 90; vihlop_r.rotation = ship.rotation - 90; vihlop_l.rotation = ship.rotation - 90; if (upPressed) { vihlop_c.visible = true; } else { vihlop_c.visible = false; } if (rightPressed) { vihlop_r.visible = true } else { vihlop_r.visible = false; } if (leftPressed) { vihlop_l.visible = true } else { vihlop_l.visible = false; } } } var vrag_1_Array: Array = new Array(); //массив врагов 1 var max_vrag_1: uint = 5; //максимум врагов 1 var coll_vrag_1: Number = 0; // переменная количества врагов_1 в даннй момент var speed_vrag_1: Number = 10; // скорость врагов var vihlop_r_vrag_1: Array = new Array(); //массив выхлопов левый враг1 var vihlop_l_vrag_1: Array = new Array(); //массив выхлопов правый враг1 function XY_vrag_1(): void { if (start) { var a: vrag_1 = new vrag_1(); var i: Number = Math.random(); if ((coll_vrag_1 <= max_vrag_1) && (i > 0.9)) { if (i >= 0.5) { a.x = Math.random() * 1600; a.y = 0; } if (i <= 0.5) { a.y = Math.random() * 900; a.x = 0; } a.rotation = Math.random() * 180; coll_vrag_1 = coll_vrag_1 + 1; a.scaleY = 0.45; a.scaleX = 0.45; vrag_1_Array.push(a); this.addChild(a); var vih_l: vihlop_r_mc = new vihlop_r_mc(); vihlop_l_vrag_1.push(vih_l); this.addChild(vih_l); var vih_r: vihlop_r_mc = new vihlop_r_mc(); vihlop_r_vrag_1.push(vih_r); this.addChild(vih_r); } var j: int = vrag_1_Array.length; while (j--) { ///////////// var ran_fire: Number = Math.random(); if ((start) && (ran_fire >= 0.95)) { var bollF: boll_ms = new boll_ms(); var p: Point = stage.globalToLocal(t.localToGlobal(new Point(0, 0))); bollF.x = p.x; bollF.y = p.y; bollF.rotation = t.rotation; FireArray.push(bollF); this.addChild(bollF); } /////////////// var t: vrag_1 = vrag_1_Array[j]; //массив врагов t.x = t.x + speed_vrag_1 * Math.cos(t.rotation / 180 * Math.PI); t.y = t.y + speed_vrag_1 * Math.sin(t.rotation / 180 * Math.PI); if (t.x > stage.stageWidth) { t.x = 0; } else if (t.x < 0) { t.x = stage.stageWidth; } if (t.y > stage.stageHeight) { t.y = 0; } else if (t.y < 0) { t.y = stage.stageHeight; } var vih_l_Array: vihlop_r_mc = vihlop_l_vrag_1[j]; var r: Point = stage.globalToLocal(t.localToGlobal(new Point(-55, 30))); vih_l_Array.x = r.x; vih_l_Array.y = r.y; vih_l_Array.rotation = t.rotation + 90; vih_l_Array.scaleY = 0.45; vih_l_Array.scaleX = 0.45; var vih_r_Array: vihlop_r_mc = vihlop_r_vrag_1[j]; var d: Point = stage.globalToLocal(t.localToGlobal(new Point(-55, -30))); vih_r_Array.x = d.x; vih_r_Array.y = d.y; vih_r_Array.rotation = t.rotation + 90; vih_r_Array.scaleY = 0.45; vih_r_Array.scaleX = 0.45; } } } хотя по поводу мувиков есть предположение, я в двух местах программы добавляю в массив новые пульки(в одной для главного корабля, во второй для врагов), а удаляю лишь одном месте, что если в одной части программы удаляется пулька, а в другой создаётся и если это произошло одновременно, пульки путаются и режется не тот мувик, думаю завтар попробовать Добавлено через 10 часов 30 минут тупо поменял местами if (j.x > stage.stageWidth) { removeChild(j); FireArray.splice(i, 1); } else if (j.x < 0) { removeChild(j); FireArray.splice(i, 1); } if (j.y > stage.stageHeight) { removeChild(j); FireArray.splice(i, 1); } else if (j.y < 0) { removeChild(j); FireArray.splice(i, 1); ошибка вылазиет из-за того, что я внутри функции вызываю ещё функцию, но в чём проблема - не понимаю Последний раз редактировалось neonoviiwolf; 19.08.2014 в 16:41. |
|
|||||
А отдебажиться? Хотя стек хоть что-то даёт, какой-то из этих объектов при вызове XY_vrag_1 из boll_action не существует:
1) vrag_1_Array - вроде есть 2) stage - ставлю на него, отсюда могут быть и глюки с "отставанием" 3) FireArray - вроде есть
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
///////////////////////////////////////////////////////////
ну в общем в связи с общим молчание я переписал код 1/3 игры по новой, все глюки, кроме одного прошли. Собственно остался вопрос в коректном удалении снарядов из массива по причине их вылета из игрового поля, правда тип ошибки сменился на ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. at flash.display:isplayObjectContainer/removeChild() at global/boll_action() собственно сами отрывки кода 1) добавляется в массив снаряд для кораблей противника и выводит на сцену var fire_random = Math.random(); if (fire_random > 0.9) { var boll_random: boll_ms = new boll_ms(); var p_vrag_1: Point = stage.globalToLocal(vrag_1_speed_Array.localToGlobal(new Point(0, 0))); boll_random.x = p_vrag_1.x; boll_random.y = p_vrag_1.y; boll_random.rotation = vrag_1_speed_Array.rotation + 180; FireArray.push(boll_random); this.addChild(boll_random); stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_fire2); function fn_fire2(event: KeyboardEvent): void { if ((start) && (event.keyCode == 90) && (bollfire)) { var bollF: boll_ms = new boll_ms(); var p: Point = stage.globalToLocal(ship.localToGlobal(new Point(0, -70))); bollF.x = p.x; bollF.y = p.y; bollF.rotation = ship.rotation; FireArray.push(bollF); this.addChild(bollF); bollfire = false; } } addEventListener(Event.ENTER_FRAME, boll_action); function boll_action(e: Event): void { var i: int = FireArray.length; while (i--) { var j: boll_ms = FireArray[i]; j.x = j.x - speedboll * Math.cos(j.rotation / 180 * Math.PI); j.y = j.y - speedboll * Math.sin(j.rotation / 180 * Math.PI); if (j.x > stage.stageWidth) { removeChild(j); FireArray.splice(i, 1); } else if (j.x < 0) { removeChild(j); FireArray.splice(i, 1); } if (j.y > stage.stageHeight) { removeChild(j); FireArray.splice(i, 1); } else if (j.y < 0) { removeChild(j); FireArray.splice(i, 1); } } } GBee вы первый, кто попытался осилить код, спасиб Последний раз редактировалось neonoviiwolf; 20.08.2014 в 02:30. |
|
|||||
Вы пропустили вариант, когда пуля ушла по диагонали. И сработали оба условия. После удаления, можно дальше не проверять и запускать следующую итерацию.
function boll_action(e: Event): void { var i: int = FireArray.length; while (i--) { var j: boll_ms = FireArray[i]; j.x = j.x - speedboll * Math.cos(j.rotation / 180 * Math.PI); j.y = j.y - speedboll * Math.sin(j.rotation / 180 * Math.PI); if (j.x > stage.stageWidth) { removeChild(j); FireArray.splice(i, 1); continue; } else if (j.x < 0) { removeChild(j); FireArray.splice(i, 1); continue; } if (j.y > stage.stageHeight) { removeChild(j); FireArray.splice(i, 1); continue; } else if (j.y < 0) { removeChild(j); FireArray.splice(i, 1); continue; } } }
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
GBee вы полностью правы, сменил условие и всё норм стало, спасибо
к тому же почему то быстрее стала работать, хотя на фпс влияние не должно быть |
Часовой пояс GMT +4, время: 18:12. |
|
« Предыдущая тема | Следующая тема » |
|
|