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

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

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

Регистрация: 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()

Код AS3:
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;
		}
	}
}
Добавлено через 22 минуты
хотя по поводу мувиков есть предположение, я в двух местах программы добавляю в массив новые пульки(в одной для главного корабля, во второй для врагов), а удаляю лишь одном месте, что если в одной части программы удаляется пулька, а в другой создаётся и если это произошло одновременно, пульки путаются и режется не тот мувик, думаю завтар попробовать

Добавлено через 10 часов 30 минут
тупо поменял местами

Код AS3:
		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.
Старый 20.08.2014, 01:52
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
А отдебажиться? Хотя стек хоть что-то даёт, какой-то из этих объектов при вызове XY_vrag_1 из boll_action не существует:
1) vrag_1_Array - вроде есть
2) stage - ставлю на него, отсюда могут быть и глюки с "отставанием"
3) FireArray - вроде есть
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 20.08.2014, 02:00
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: 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) добавляется в массив снаряд для кораблей противника и выводит на сцену
Код AS3:
 
 
		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);
2) сам игрок при нажатии клавиши добавляет снаряд в массив и выводит на сцену
Код AS3:
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;
	}
}
3) собственно сама обработка полёта снаряда и его удаление из сцены
Код AS3:
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.
Старый 20.08.2014, 14:01
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 4  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Вы пропустили вариант, когда пуля ушла по диагонали. И сработали оба условия. После удаления, можно дальше не проверять и запускать следующую итерацию.
Код AS3:
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;
		}
	}
}
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Регистрация: Jun 2014
Сообщений: 558
GBee вы полностью правы, сменил условие и всё норм стало, спасибо
к тому же почему то быстрее стала работать, хотя на фпс влияние не должно быть

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

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

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


 


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


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