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

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

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

Регистрация: Nov 2010
Сообщений: 21
По умолчанию Проблема с записью переменной в массив

Код AS3:
stop();
 
var randomize:Number = 1;
var Max:int = 1;
 
// Характеристики персонажа
var strange:int = 10;
var agility:int = 12;
var endurance:int = 8;
var hits:int = 100;
var weapon:int = 5;
var armour:int = 3;
var HeroTime:int = (10-agility);
var damage:int = strange;
strange_fld.text = String(strange);
agility_fld.text = String(agility);
endurance_fld.text = String(endurance);
hits_fld.text = String(hits);
 
// Характеристики врага
var eStrange:int = 12;
var eAgility:int = 10;
var eEndurance:int = 15;
var eHits:int = 100;
var eWeapon:int = 3;
var eArmour:int = 1;
var EnemyTime:int = 8;
var eDamage:int = eStrange;
eStrange_fld.text = String(eStrange);
eAgility_fld.text = String(eAgility);
eEndurance_fld.text = String(eEndurance);
eHits_fld.text = String(eHits);
 
// ********************** Массивы ******************************
var TimeLine:Array = new Array();	// Общая шкала времени
var HeroAction:Array = new Array();	// Массив, содержащий сведения о следующем действии героя 
var EnemyAction:Array = new Array(); // Массив, содержащий сведения о следующем действии врага 
 
HeroAction[0] = "Яростная атака";
HeroAction[1] = "Рубящий удар";
HeroAction[2] = "в корпус";
 
// Тип удара	HeroAction[0]
var CombatStyle:Array = new Array("Яростная атака", "Глухая оборона", "Держать дистанцию");
 
// Тип удара  HeroAction[1]
var HitType:Array = new Array("Рубящий удар", "Колющий удар", "Пинок", "Удар щитом", "Толчек", "Обманный удар");
 
// Место удара	HeroAction[2]
var HitPlace:Array = new Array("в голову", "в корпус", "в правую руку", "в левую руку", "по ногам");
 
// ******************* Выводим тип атаки (HitType) ******************************
// Слушатели событий
nextattack_btn.addEventListener(MouseEvent.CLICK, nextattack);
previousattack_btn.addEventListener(MouseEvent.CLICK, previousattack);
 
hittype_fld.text = String(HitType[0]); 
var i:Number = 0;
 
function nextattack(event:MouseEvent):void
{
	if (i < 5) {i=i+1;}
	hittype_fld.text = String(HitType[i]);
	HeroAction[1] = HitType[i];		// Заносим тип удара в HeroAction
	}
 
function previousattack(event:MouseEvent):void
{
	if (i > 0) {i=i-1;}
	hittype_fld.text = String(HitType[i]);
	HeroAction[1] = HitType[i];		// Заносим тип удара в HeroAction
}
 
// ********************* Выводим тип поведения в бою (CombatStyle) ************************
// Слушатели событий
furyattack_btn.addEventListener(MouseEvent.CLICK, furyattack);
silentdefence_btn.addEventListener(MouseEvent.CLICK, silentdefence);
distance_btn.addEventListener(MouseEvent.CLICK, distance);
 
var tempState1:DisplayObject = furyattack_btn.upState;
var tempState2:DisplayObject = silentdefence_btn.upState;
var tempState3:DisplayObject = distance_btn.upState;
 
function furyattack(event:MouseEvent):void
{
	furyattack_btn.upState = furyattack_btn.downState;
	silentdefence_btn.upState = tempState2;
	distance_btn.upState = tempState3;
	attacktype_fld.text = CombatStyle[0];
	HeroAction[0] = CombatStyle[0];
	}
 
function silentdefence(event:MouseEvent):void
{
	silentdefence_btn.upState = silentdefence_btn.downState;
	furyattack_btn.upState = tempState1;
	distance_btn.upState = tempState3;
	attacktype_fld.text = CombatStyle[1];
	HeroAction[0] = CombatStyle[1];
	}
 
function distance(event:MouseEvent):void
{
	distance_btn.upState = distance_btn.downState;
	furyattack_btn.upState = tempState1;
	silentdefence_btn.upState = tempState2;
	attacktype_fld.text = CombatStyle[2];
	HeroAction[0] = CombatStyle[2];
	}
 
// **************** Выводим место удара (HitPlace) *********************************
// Фильтр свечения
import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.filters.GlowFilter;
 
var dropShadow:GlowFilter = new GlowFilter(0xFF0000,1,100,100,1,15,true,true);
var filtersArray:Array = new Array(dropShadow);
 
// Слушатели событий
head_btn.addEventListener(MouseEvent.CLICK, head);
body_btn.addEventListener(MouseEvent.CLICK, body);
RightArm_btn.addEventListener(MouseEvent.CLICK, rightArm);
LeftArm_btn.addEventListener(MouseEvent.CLICK, leftArm);
legs_btn.addEventListener(MouseEvent.CLICK, legs);
 
// Функции указания удара
var checkOn:Boolean = false; //Выбрано куда бить или нет
 
function head(event:MouseEvent):void
{
	if (checkOn == false)
	{
	head_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[0];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function body(event:MouseEvent):void
{
	if (checkOn == false)
	{
	body_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[1];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function rightArm(event:MouseEvent):void
{
	if (checkOn == false)
	{
	RightArm_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[2];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function leftArm(event:MouseEvent):void
{
	if (checkOn == false)
	{
	LeftArm_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[3];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function legs(event:MouseEvent):void
{
	if (checkOn == false)
	{
	legs_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[4];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
// Функция удаления фильтров
function deleteFilters():void
{
	head_btn.filters = null;
	body_btn.filters = null;
	RightArm_btn.filters = null;
	LeftArm_btn.filters = null;
	legs_btn.filters = null;
	checkOn = false;
	}
 
// ************************* TimeLine ***************************
// Подсчет времени на удар врага
function EnemyTime_fnc():void
{
	EnemyTime = (10-eAgility);
 
	EnemyAction[0] = rnd(2);
	EnemyAction[1] = rnd(5);
	EnemyAction[2] = rnd(4);
	switch (EnemyAction[0])
	{
	case 0: EnemyTime = EnemyTime + 0; EnemyAction[0] = "Яростная атака"; eDamage = eDamage+(eDamage/4); break;
	case 1: EnemyTime = EnemyTime + 3; EnemyAction[0] = "Глухая оборона"; eDamage = eDamage-(eDamage/4); break;
	case 2: EnemyTime = EnemyTime + 2; EnemyAction[0] = "Держать дистанцию"; break;
	}
 
	switch (EnemyAction[1])
	{
	case 0: EnemyTime = EnemyTime + 5; EnemyAction[1] = "Рубящий удар"; break;
	case 1: EnemyTime = EnemyTime + 3; EnemyAction[1] = "Колющий удар"; break;
	case 2: EnemyTime = EnemyTime + 2; EnemyAction[1] = "Пинок"; break;
	case 3: EnemyTime = EnemyTime + 3; EnemyAction[1] = "Удар щитом"; break;
	case 4: EnemyTime = EnemyTime + 5; EnemyAction[1] = "Толчек"; break;
	case 5: EnemyTime = EnemyTime + 10; EnemyAction[1] = "Обманный удар"; break;
	}
 
	switch (EnemyAction[2])
	{
	case 0: EnemyAction[2] = "в голову"; break;
	case 1: EnemyAction[2] = "в корпус"; break;
	case 2: EnemyAction[2] = "в левую руку"; break;
	case 3: EnemyAction[2] = "в правую руку"; break;
	case 4: EnemyAction[2] = "по ногам"; break;
	}
if (EnemyTime <= 0) {EnemyTime = 1;}
EnemyAction[3] = eDamage;
 
}
 
// Подсчет времени на удар героя
function HeroTime_fnc():void
{
	HeroTime = (10-agility);
 
	switch (HeroAction[0])
	{
	case "Яростная атака": HeroTime = HeroTime + 0; damage = damage+(damage/4); break;
	case "Глухая оборона": HeroTime = HeroTime + 3; damage = damage-(damage/4); break;
	case "Держать дистанцию": HeroTime = HeroTime + 2; break;
	}
 
	switch(HeroAction[1])
	{
	case "Рубящий удар": HeroTime = HeroTime + 5; break;
	case "Колющий удар": HeroTime = HeroTime + 3; break;
	case "Пинок": HeroTime = HeroTime + 2; break;
	case "Удар щитом": HeroTime = HeroTime + 3; break;
	case "Толчек": HeroTime = HeroTime + 5; break;
	case "Обманный удар": HeroTime = HeroTime + 10; break;
	}
HeroAction[3] = damage;
if (HeroTime <= 0) {HeroTime = 1;}
}
 
// ******************************** Присваевает TimeLine значение действия ******************
var ti:Number = 0;
var triggerTi:Boolean = true;
 
function Action():void
{
	if (triggerTi == true) 
		{
		HeroTime_fnc(); EnemyTime_fnc();
		TimeLine[HeroTime] = HeroAction;
		TimeLine[EnemyTime] = EnemyAction;
		}
 
	do { ti=ti+1; }
	while (TimeLine[ti] == undefined); // Проверяем цикл по массиву TimeLine, до первого действия
 
if (triggerTi == false){
	if (TimeLine[ti] == HeroAction) {HeroTime_fnc(); TimeLine[HeroTime+ti] = HeroAction; }
	else { EnemyTime_fnc(); TimeLine[EnemyTime+ti] = EnemyAction; }
}
 
triggerTi = false
 
	trace("ti="+ti);
	trace("HeroTime="+HeroTime);
	trace("EnemyTime="+EnemyTime);
	trace("TimeLine="+TimeLine);
}
 
// ************************************ Обработка действия (WorkAction)***************************
function WorkAction():void
{
	if (TimeLine[ti] == EnemyAction) {hits = hits-EnemyAction[3]; hits_fld.text = String(hits);
	eDamage = eStrange; }
	else {eHits = eHits-HeroAction[3]; eHits_fld.text = String(eHits); damage = strange; }
}
 
// ******************* Следующий ход *******************************
var turn:Number = 0;
turn_fld.text = String(turn);
 
nextturn_btn.addEventListener(MouseEvent.CLICK, nextturn);
 
function nextturn(e:MouseEvent):void
{
Action();			// Записываем удары в TimeLine и находим ближайший удар
turn_fld.text = String(ti);		// Счетчик ходов
NextMovement_fld.text = String(TimeLine[ti]);
WorkAction();		// Обрабатываем действие
}
 
// ********************************* Функция случайного числа ********************************
function rnd(Max):int
{
var randomize:Number = (Math.floor(Math.random() * (Max+1))-Math.floor(Math.random() * (Max+1)));
if (randomize < 0)
	{
		randomize = 0;
		}
	return randomize;
	}
Знаю, что огромный кусок кода, но я уже голову сломал - не могу понять причину, почему в TimeLine на втором ходу записывается 2 раза EnemyAction, на 3-ем - 3 раза и т.д.
Может подскажете где ошибка? Помимо моего ДНК Я только начал разбираться в АС3.

файл для Adobe Flash CS5, в котором дело и происходит, прилагается.
Вложения
Тип файла: rar HeroFight New.rar (80.2 Кб, 69 просмотров)

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

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Поставил брикпоинт на строчку
Код AS3:
EnemyAction[0] = rnd(2);
Один ход = одна операция присвоения.
В чем ошибка то?

Старый 12.12.2010, 15:06
cfanya вне форума Посмотреть профиль Отправить личное сообщение для cfanya Найти все сообщения от cfanya
  № 3  
Ответить с цитированием
cfanya

Регистрация: Nov 2010
Сообщений: 21
Насколько я понимаю, ошибка где-то в районе функции Action(); которая вызывается из функции nextturn(); что в конце кода...
Проблема в том, что в массив TimeLine несколько раз подряд записывается массив EnemyAction.

Если на втором ходу вывести trace (TimeLine); то пишет так:
TimeLine=,,,Яростная атака,Рубящий удар,в корпус,12,,Яростная атака,Удар щитом,в голову,18,,,Яростная атака,Удар щитом,в голову,18

А если на третьем:
TimeLine=,,,Яростная атака,Рубящий удар,в корпус,12,,Держать дистанцию,Удар щитом,в голову,12,,,Держать дистанцию,Удар щитом,в голову,12,,,,,Держать дистанцию,Удар щитом,в голову,12

Четвертый:
TimeLine=,,,Яростная атака,Рубящий удар,в корпус,12,,Яростная атака,Рубящий удар,в голову,15,,,Яростная атака,Рубящий удар,в голову,15,,,,,Яростная атака,Рубящий удар,в голову,15,,,,,Яростная атака,Рубящий удар,в голову,15

И так далее...

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

Регистрация: Dec 2010
Адрес: Воронеж
Сообщений: 26
Отправить сообщение для Aber с помощью ICQ
Может быть дело в переменной ti? Я что-то не разобрался в этом месте
Код AS3:
do { ti=ti+1; }
	while (TimeLine[ti] == undefined); // Проверяем цикл по массиву TimeLine, до первого действия
Но думаю что ты хотел произвести проверку от 0, тогда надо обнулить ti или занести объявление переменной в функцию.
Это просто предположение, я сам вторую неделю изучаю as.
У меня стоит CS4, проверить не могу.

Старый 12.12.2010, 16:33
cfanya вне форума Посмотреть профиль Отправить личное сообщение для cfanya Найти все сообщения от cfanya
  № 5  
Ответить с цитированием
cfanya

Регистрация: Nov 2010
Сообщений: 21
Не совсем так... Проверка TimeLine идет до того момента, когда в этом массиве встречается ближайшая запись. По умолчанию, пустая ячейка массива содержит значение "undefined". Т.е. цикл выполняется до тех пор, пока не встретит значение отличное от "undefined", т.е. любую запись.

Старый 12.12.2010, 16:59
Aber вне форума Посмотреть профиль Отправить личное сообщение для Aber Найти все сообщения от Aber
  № 6  
Ответить с цитированием
Aber
 
Аватар для Aber

Регистрация: Dec 2010
Адрес: Воронеж
Сообщений: 26
Отправить сообщение для Aber с помощью ICQ
Всё равно не понял зачем ты это делаешь, есть же функции которые выводят длину массива, функции записи в начало или конец.

Старый 12.12.2010, 17:12
cfanya вне форума Посмотреть профиль Отправить личное сообщение для cfanya Найти все сообщения от cfanya
  № 7  
Ответить с цитированием
cfanya

Регистрация: Nov 2010
Сообщений: 21
Массив неопределенной длинны TimeLine - время.
Массивы HeroAction и EnemyAction - содержат действия героя и врага соответственно.
Они заносятся в массив TimeLine в месте на которое указывает переменная ti.
HeroTime и EnemyTime - переменные, которые обозначают временные затраты на удар.
Проверка делается для того, что бы узнать кто бьет первым и когда.

Например:
Действие героя занимает 5 единиц времени (HeroTime = 5)
А врага - 8 единиц времени (EnemyTime = 8)

В в пятую ячейку TimeLine заносится HeroAction, а в 8-ю EnemyAction.

Цикл do/while проверяет массив TimeLine до первого найденного действия.

Старый 12.12.2010, 17:50
cfanya вне форума Посмотреть профиль Отправить личное сообщение для cfanya Найти все сообщения от cfanya
  № 8  
Ответить с цитированием
cfanya

Регистрация: Nov 2010
Сообщений: 21
Переписал код таким образом:

Код AS3:
stop();
 
var randomize:Number = 1;
var Max:int = 1;
 
// Характеристики персонажа
var strange:int = 10;
var agility:int = 12;
var endurance:int = 8;
var hits:int = 100;
var weapon:int = 5;
var armour:int = 3;
var HeroTime:int = (10-agility);
var damage:int = strange;
strange_fld.text = String(strange);
agility_fld.text = String(agility);
endurance_fld.text = String(endurance);
hits_fld.text = String(hits);
 
// Характеристики врага
var eStrange:int = 12;
var eAgility:int = 10;
var eEndurance:int = 15;
var eHits:int = 100;
var eWeapon:int = 3;
var eArmour:int = 1;
var EnemyTime:int = 8;
var eDamage:int = eStrange;
eStrange_fld.text = String(eStrange);
eAgility_fld.text = String(eAgility);
eEndurance_fld.text = String(eEndurance);
eHits_fld.text = String(eHits);
 
// ********************** Массивы ******************************
var TimeLine:Array = new Array();	// Общая шкала времени
var HeroAction:Array = new Array();	// Массив, содержащий сведения о следующем действии героя 
var EnemyAction:Array = new Array(); // Массив, содержащий сведения о следующем действии врага 
 
HeroAction[0] = "Яростная атака";
HeroAction[1] = "Рубящий удар";
HeroAction[2] = "в корпус";
 
// Тип удара	HeroAction[0]
var CombatStyle:Array = new Array("Яростная атака", "Глухая оборона", "Держать дистанцию");
 
// Тип удара  HeroAction[1]
var HitType:Array = new Array("Рубящий удар", "Колющий удар", "Пинок", "Удар щитом", "Толчек", "Обманный удар");
 
// Место удара	HeroAction[2]
var HitPlace:Array = new Array("в голову", "в корпус", "в правую руку", "в левую руку", "по ногам");
 
// ******************* Выводим тип атаки (HitType) ******************************
// Слушатели событий
nextattack_btn.addEventListener(MouseEvent.CLICK, nextattack);
previousattack_btn.addEventListener(MouseEvent.CLICK, previousattack);
 
hittype_fld.text = String(HitType[0]); 
var i:Number = 0;
 
function nextattack(event:MouseEvent):void
{
	if (i < 5) {i=i+1;}
	hittype_fld.text = String(HitType[i]);
	HeroAction[1] = HitType[i];		// Заносим тип удара в HeroAction
	}
 
function previousattack(event:MouseEvent):void
{
	if (i > 0) {i=i-1;}
	hittype_fld.text = String(HitType[i]);
	HeroAction[1] = HitType[i];		// Заносим тип удара в HeroAction
}
 
// ********************* Выводим тип поведения в бою (CombatStyle) ************************
// Слушатели событий
furyattack_btn.addEventListener(MouseEvent.CLICK, furyattack);
silentdefence_btn.addEventListener(MouseEvent.CLICK, silentdefence);
distance_btn.addEventListener(MouseEvent.CLICK, distance);
 
var tempState1:DisplayObject = furyattack_btn.upState;
var tempState2:DisplayObject = silentdefence_btn.upState;
var tempState3:DisplayObject = distance_btn.upState;
 
function furyattack(event:MouseEvent):void
{
	furyattack_btn.upState = furyattack_btn.downState;
	silentdefence_btn.upState = tempState2;
	distance_btn.upState = tempState3;
	attacktype_fld.text = CombatStyle[0];
	HeroAction[0] = CombatStyle[0];
	}
 
function silentdefence(event:MouseEvent):void
{
	silentdefence_btn.upState = silentdefence_btn.downState;
	furyattack_btn.upState = tempState1;
	distance_btn.upState = tempState3;
	attacktype_fld.text = CombatStyle[1];
	HeroAction[0] = CombatStyle[1];
	}
 
function distance(event:MouseEvent):void
{
	distance_btn.upState = distance_btn.downState;
	furyattack_btn.upState = tempState1;
	silentdefence_btn.upState = tempState2;
	attacktype_fld.text = CombatStyle[2];
	HeroAction[0] = CombatStyle[2];
	}
 
// **************** Выводим место удара (HitPlace) *********************************
// Фильтр свечения
import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.filters.GlowFilter;
 
var dropShadow:GlowFilter = new GlowFilter(0xFF0000,1,100,100,1,15,true,true);
var filtersArray:Array = new Array(dropShadow);
 
// Слушатели событий
head_btn.addEventListener(MouseEvent.CLICK, head);
body_btn.addEventListener(MouseEvent.CLICK, body);
RightArm_btn.addEventListener(MouseEvent.CLICK, rightArm);
LeftArm_btn.addEventListener(MouseEvent.CLICK, leftArm);
legs_btn.addEventListener(MouseEvent.CLICK, legs);
 
// Функции указания удара
var checkOn:Boolean = false; //Выбрано куда бить или нет
 
function head(event:MouseEvent):void
{
	if (checkOn == false)
	{
	head_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[0];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function body(event:MouseEvent):void
{
	if (checkOn == false)
	{
	body_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[1];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function rightArm(event:MouseEvent):void
{
	if (checkOn == false)
	{
	RightArm_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[2];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function leftArm(event:MouseEvent):void
{
	if (checkOn == false)
	{
	LeftArm_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[3];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
function legs(event:MouseEvent):void
{
	if (checkOn == false)
	{
	legs_btn.filters = filtersArray; checkOn = true; 
	HeroAction[2] = HitPlace[4];
	}
	else {	deleteFilters(); delete HeroAction[2]; }
}
 
// Функция удаления фильтров
function deleteFilters():void
{
	head_btn.filters = null;
	body_btn.filters = null;
	RightArm_btn.filters = null;
	LeftArm_btn.filters = null;
	legs_btn.filters = null;
	checkOn = false;
	}
 
// ************************* TimeLine ***************************
// Подсчет времени на удар врага
function EnemyTime_fnc():void
{
	EnemyTime = (10-eAgility);
 
	EnemyAction[0] = rnd(2);
	EnemyAction[1] = rnd(5);
	EnemyAction[2] = rnd(4);
	switch (EnemyAction[0])
	{
	case 0: EnemyTime = EnemyTime + 0; EnemyAction[0] = "Яростная атака"; eDamage = eDamage+(eDamage/4); break;
	case 1: EnemyTime = EnemyTime + 3; EnemyAction[0] = "Глухая оборона"; eDamage = eDamage-(eDamage/4); break;
	case 2: EnemyTime = EnemyTime + 2; EnemyAction[0] = "Держать дистанцию"; break;
	}
 
	switch (EnemyAction[1])
	{
	case 0: EnemyTime = EnemyTime + 5; EnemyAction[1] = "Рубящий удар"; break;
	case 1: EnemyTime = EnemyTime + 3; EnemyAction[1] = "Колющий удар"; break;
	case 2: EnemyTime = EnemyTime + 2; EnemyAction[1] = "Пинок"; break;
	case 3: EnemyTime = EnemyTime + 3; EnemyAction[1] = "Удар щитом"; break;
	case 4: EnemyTime = EnemyTime + 5; EnemyAction[1] = "Толчек"; break;
	case 5: EnemyTime = EnemyTime + 10; EnemyAction[1] = "Обманный удар"; break;
	}
 
	switch (EnemyAction[2])
	{
	case 0: EnemyAction[2] = "в голову"; break;
	case 1: EnemyAction[2] = "в корпус"; break;
	case 2: EnemyAction[2] = "в левую руку"; break;
	case 3: EnemyAction[2] = "в правую руку"; break;
	case 4: EnemyAction[2] = "по ногам"; break;
	}
if (EnemyTime <= 0) {EnemyTime = 1;}
if (HeroTime == EnemyTime){EnemyTime_fnc();}
EnemyAction[3] = eDamage;
}
 
// Подсчет времени на удар героя
function HeroTime_fnc():void
{
	HeroTime = (10-agility);
 
	switch (HeroAction[0])
	{
	case "Яростная атака": HeroTime = HeroTime + 0; damage = damage+(damage/4); break;
	case "Глухая оборона": HeroTime = HeroTime + 3; damage = damage-(damage/4); break;
	case "Держать дистанцию": HeroTime = HeroTime + 2; break;
	}
 
	switch(HeroAction[1])
	{
	case "Рубящий удар": HeroTime = HeroTime + 5; break;
	case "Колющий удар": HeroTime = HeroTime + 3; break;
	case "Пинок": HeroTime = HeroTime + 2; break;
	case "Удар щитом": HeroTime = HeroTime + 3; break;
	case "Толчек": HeroTime = HeroTime + 5; break;
	case "Обманный удар": HeroTime = HeroTime + 10; break;
	}
HeroAction[3] = damage;
if (HeroTime <= 0) {HeroTime = 1;}
}
 
// ******************************** Присваевает TimeLine значение действия ******************
var ti:Number = 0;
var triggerTi:Boolean = true;
 
function Action():void
{
	if (triggerTi == true) 
		{
		HeroTime_fnc(); EnemyTime_fnc();
		TimeLine[HeroTime] = HeroAction;
		TimeLine[EnemyTime] = EnemyAction;
 
	do { ti=ti+1; }
	while (TimeLine[ti] == undefined); // Проверяем цикл по массиву TimeLine, до первого действия
		}
 
if (triggerTi == false){
	if (TimeLine[ti] == HeroAction) {delete TimeLine[ti]; HeroTime_fnc(); TimeLine[HeroTime+ti] = HeroAction; }
	else { delete TimeLine[ti]; EnemyTime_fnc(); TimeLine[EnemyTime+ti] = EnemyAction; }
	do { ti=ti+1; }
	while (TimeLine[ti] == undefined); // Проверяем цикл по массиву TimeLine, до первого действия
}
 
triggerTi = false;
 
	trace("EnemyAction="+EnemyAction);
	trace("EnemyTime="+EnemyTime);
	trace("HeroTime="+HeroTime);
	trace("ti="+ti);
	trace("HeroTime+ti="+(HeroTime+ti));
	trace("EnemyTime+ti="+(EnemyTime+ti));
	trace("TimeLine="+TimeLine);
}
 
// ************************************ Обработка действия (WorkAction)***************************
function WorkAction():void
{
	if (TimeLine[ti] == EnemyAction) {hits = hits-EnemyAction[3]; hits_fld.text = String(hits);
	eDamage = eStrange; }
	else {eHits = eHits-HeroAction[3]; eHits_fld.text = String(eHits); damage = strange; }
}
 
// ******************* Следующий ход *******************************
var turn:Number = 0;
turn_fld.text = String(turn);
 
nextturn_btn.addEventListener(MouseEvent.CLICK, nextturn);
 
function nextturn(e:MouseEvent):void
{
Action();			// Записываем удары в TimeLine и находим ближайший удар
turn_fld.text = String(ti);		// Счетчик ходов
NextMovement_fld.text = String(TimeLine[ti]);
WorkAction();		// Обрабатываем действие
}
 
// ********************************* Функция случайного числа ********************************
function rnd(Max):int
{
var randomize:Number = (Math.floor(Math.random() * (Max+1))-Math.floor(Math.random() * (Max+1)));
if (randomize < 0)
	{
		randomize = 0;
		}
	return randomize;
	}

Старый 12.12.2010, 17:51
cfanya вне форума Посмотреть профиль Отправить личное сообщение для cfanya Найти все сообщения от cfanya
  № 9  
Ответить с цитированием
cfanya

Регистрация: Nov 2010
Сообщений: 21
Но проблема все еще осталась - в функции Action(); просто в какой-то момент перестает срабатывать часть этого кода:

Код AS3:
if (triggerTi == false){
	if (TimeLine[ti] == HeroAction) {delete TimeLine[ti]; HeroTime_fnc(); TimeLine[HeroTime+ti] = HeroAction; }
	else { delete TimeLine[ti]; EnemyTime_fnc(); TimeLine[EnemyTime+ti] = EnemyAction; }
	do { ti=ti+1; }
	while (TimeLine[ti] == undefined); // Проверяем цикл по массиву TimeLine, до первого действия
}
Иногда не работает вот эта часть:
Код AS3:
if (TimeLine[ti] == HeroAction) {delete TimeLine[ti]; HeroTime_fnc(); TimeLine[HeroTime+ti] = HeroAction; }
А иногда вот эта:
Код AS3:
else { delete TimeLine[ti]; EnemyTime_fnc(); TimeLine[EnemyTime+ti] = EnemyAction; }
Но ведь должно же работать! Должно!

Добавлено через 43 минуты
Интересно, что если вместо:
Код AS3:
if (TimeLine[ti] == HeroAction) {delete TimeLine[ti]; HeroTime_fnc(); TimeLine[HeroTime+ti] = HeroAction; }
	else { delete TimeLine[ti]; EnemyTime_fnc(); TimeLine[EnemyTime+ti] = EnemyAction; }
Написать:
Код AS3:
if (TimeLine[ti][1] == HeroAction[1]) {delete TimeLine[ti]; HeroTime_fnc(); TimeLine[HeroTime+ti] = HeroAction; }
if (TimeLine[ti][1] == EnemyAction[1]) { delete TimeLine[ti]; EnemyTime_fnc(); TimeLine[EnemyTime+ti] = EnemyAction; }
То выдает слудующее:
Цитата:
TypeError: Error #1010: Термин не определен и не имеет свойств.
at HeroFightNew_fla::MainTimeline/Action()
at HeroFightNew_fla::MainTimeline/nextturn()
К чему бы это?

Добавлено через 6 часов 41 минуту
Все, оно работает. Ошибку нашел. Спасибо за внимание.


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

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

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


 


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


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