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

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

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

Регистрация: Mar 2015
Сообщений: 64
По умолчанию новый экземпляр с новыми свойствами

Доброго времени суток.

Прошу прощения за дурацкий вопрос, но долблюсь уже сутки - решить не получается.
Есть функция вызываемая таймером несколько раз. Функция добавляет с помощью addChild на сцену экземпляр следующего объекта:

Код AS3:
var enemy:Enemy = new Enemy();
При добавлении у нового экземпляра меняются характеристики. Проблема в том, что они меняются у всех объектов добавленных до этого. Изменение характеристик находится внутри тела функции, которая и добавляет новый экземпляр.

Как каждый новый экземпляр наделять новыми характеристиками не меняя их у вызванных ранее экземпляров?

Старый 16.04.2015, 19:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Такого просто быть не может, рассказывайте больше и код показывайте.
Может, если у него свойства в классе Enemy объявлены как static

Старый 17.04.2015, 08:28
бакуард вне форума Посмотреть профиль Отправить личное сообщение для бакуард Найти все сообщения от бакуард
  № 3  
Ответить с цитированием
бакуард

Регистрация: Mar 2015
Сообщений: 64
Извиняюсь, сразу ответить не получилось. Вот код:

Код AS3:
//враг и его деятельность
var countAtack:Number = 0;//для замены таймера при подсчете потерь энергии героя при контакте с врагом
var count:Number = 0;//для замены таймера при подсчете потерь энергии врага при контакте с героем
var distanceXYe:Number;//значение расстояния (враг - герой)
var speedEnemy:Boolean;//разрешаем(или запрещаем) перемещение врага
var strongEnemy:Number;//уровень атаки врага (задается случайно)
var healthEnemy:Number;//уровень защиты врага (задается случайно)
var speedXYe:int = 1.2;//скорость врага
var lifeEnemy:uint;//энергия(жизни) врага
function f_enemyAppeared () {
	//добавление врага на сцену
	var enemy:Enemy = new Enemy();
	enemy.x = Math.floor(Math.random() * 400 + 30 );
	enemy.y = Math.floor(Math.random() * 400 + 30 );
	this.lifeEnemy = Math.floor(Math.random() * 22);
	this.strongEnemy = Math.floor(Math.random()*10) + 1;
	this.healthEnemy = Math.floor(Math.random()*10) + 1;
        addChild(enemy);
	//перемещение врага
	enemy.addEventListener(Event.ENTER_FRAME, f_enemyGo);
	function f_enemyGo (e:Event) {
	var enemy:MovieClip = e.currentTarget as MovieClip;
	var distanceXe = hero.x - enemy.x;
	var distanceYe = hero.y - enemy.y;
	var distanceXYe = Math.sqrt(distanceXe*distanceXe + distanceYe*distanceYe);
	var speedXe = speedXYe * distanceXe/distanceXYe;
	var speedYe = speedXYe * distanceYe/distanceXYe;
	if(distanceXYe < 10){
		speedEnemy = false;
	}else{
		speedEnemy = true;
	}
	if(speedEnemy == true){
	   enemy.x += speedXe;
	   enemy.y += speedYe;
	}
	//если у врага кончились жизни или наступил день - удалим его
	    if(day == true || lifeEnemy <= 0){
	       removeChild(enemy);
	       enemy.removeEventListener(Event.ENTER_FRAME, f_enemyGo);
	    }
	//враг атакует
	    if(distanceXYe < 15 && ++countAtack%40 == 0){
		    lifeHero -= strongEnemy/healthHero;
	    }
	//враг получает урон слева
	   if(distanceXYe < 10 && enemy.x <= hero.x && ++count%10 ==0 && heroBeatLeft == true){
			lifeEnemy -= strongHero/healthEnemy;
	   }
	//враг получает урон справа
	   if(distanceXYe < 10 && enemy.x >= hero.x && ++count%10 ==0 && heroBeatRight == true){
		    lifeEnemy -= strongHero/healthEnemy;
	   }
	//анимация жизней врага
	  enemy.gotoAndPlay(Math.floor(11 - lifeEnemy));
    }
}
Да, забыл еще об одном написать: Когда я атакую врага жизни теряют все враги на сцене.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Это не код класса. Это код кадра, судя по всему. Его нужно перенести в класс, и все будет ок

Старый 17.04.2015, 11:32
бакуард вне форума Посмотреть профиль Отправить личное сообщение для бакуард Найти все сообщения от бакуард
  № 5  
Ответить с цитированием
бакуард

Регистрация: Mar 2015
Сообщений: 64
А можно это сделать в кадре. Дело в том , что весь проект написан в кадрах , а переносить в классы нет времени (сроки поджимают).

Добавлено через 31 час 57 минут
Попробовал другой вариант решения проблемы: Создаю объект и помещаю в массив. Затем в ENTER_FRAME
создаю цикл и пробегаю по массиву. Создал тестовую мини-игру (нажимаешь на кнопку появляется кролик в рандомных координатах и движется по оси Х. Затем кликаю по сцене и появляется монстр. Если расстояние
между монстром и кроликом меньше определенной дистанции кролик останавливается), вот код:

Код AS3:
//создадим массив
var myArray:Array = new Array();
 
//добавим в массив объекты
var rabbit:Rabbit;
myArrayAdd.addEventListener(MouseEvent.CLICK, fAdd1);
function fAdd1 (e:MouseEvent) {
	var rabbit:Rabbit = new Rabbit();
	rabbit.x = Math.floor(Math.random() * 11) * 20;
	rabbit.y = Math.floor(Math.random() * 11) * 20;
	addChild(rabbit);
	myArray.push(rabbit);
    rabbit.addEventListener(Event.ENTER_FRAME, fRabbitDo);
	trace(myArray);
}
 
//удалим из массива объекты
myArrayDelete.addEventListener(MouseEvent.CLICK, fDelete1);
function fDelete1 (e:MouseEvent) {
	myArray.splice(length - 1);
	rabbit.removeEventListener(Event.ENTER_FRAME, fGooDo);
	trace(myArray.length);
}
 
function fRabbitDo (e:Event) {
	for (var i:Number = 0; i < myArray.length; i++){
		myArray[i].x += Math.random();
	}
}
 
 
stage.addEventListener(MouseEvent.CLICK, fMonster);
function fMonster (e:MouseEvent) {
		monster.x = mouseX;
		monster.y = mouseY;
}
 
//определим дистанцию (монстр - кролик) и контакт монстра и кролик
var distance:Number;//расстояние (монстр - кролик)
stage.addEventListener(Event.ENTER_FRAME, fDistance);
function fDistance (e:Event) {
    for (var qqq:Number = 0; qqq < myArray.length; qqq++){
		var distanceX = monster.x - myArray[qqq].x;
		var distanceY = monster.y - myArray[qqq].y;
		distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
		if(distance <= 40){
			myArray.splice(myArray[qqq]); 
			trace(myArray.length);
		}
	}
}
Но проблемы остались. Пересекаю одного кролика - останавливаются все.
P.S. Продолжаю работать в кадрах. И вообще - то что я задумал можно сделать в кадрах?

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

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

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


 


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


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