И снова шаговка и гексы.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

И снова шаговка и гексы.

Сообщение 46165957 20 янв 2013, 11:43

И снова всем привет.

Стоило раскурить массивы и запись ходов как воткнулся в новую проблему. Причем ключевые слова по которым нужно гуглить, представляю слабо :)

Собственно вот картинка:
Untitled-1.jpg

Выделяем желтый гекс, сдираем его координаты, пишем ход в массив, шарик "топает в него", вполне ожидаемо топает по траектории помеченной красным. Касяк. Опять же, не все гексы будут свободны для прохода, но тут скорее всего прикручу навмеш, который будет покрывать свободные. Но опять же, вопрос выравнивания при передвижении. И вопрос с подсчетом ОД на ход, когда он прет по прямой, он пересекает больше гексов чем нужно....

Подскажете что почитать, чтобы понять?
Может какой-нить пример реализации есть, понимаю что борзею, но все же )))

Спасибо!
У вас нет доступа для просмотра вложений в этом сообщении.
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение 46165957 20 янв 2013, 12:22

Пока из мыслей - искать все гексы по тегу и отбирать из них 6 на дистанции в которую попадут их центры, после чего проверять расстояние от этих шести до пункта назначения, и перемещаться в тот у которого меньшее расстояние.... а как быть если гексов тысячи... :(
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение seaman 20 янв 2013, 12:28

Поиск пути - читайте A*
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: И снова шаговка и гексы.

Сообщение 46165957 20 янв 2013, 12:46

Да вот читаю... но пока сложно очень. Особенно в плане применения к юнити.
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение 46165957 21 янв 2013, 13:39

И опять жестокий затуп (((

не могу понять, как в массиве найти ссылку на ГО у которого некая переменная самая маленькая...
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение seaman 21 янв 2013, 13:47

1. Перебирать все элементы массива. Искать тот, у которого переменная самая маленькая.
2. Написать свой метод для сравнения элементов массива. Отсортировать массив с использованием этого метода по возрастанию. Брать первый элемент массива.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: И снова шаговка и гексы.

Сообщение 46165957 21 янв 2013, 17:45

То ли я кофейком траванулся, то ли еще чет ))) но затуп наступил уже окончательный ))) Уже тупо не вижу, как один из косяков побороть. Суть в том, что когда шарик передвигается на следующий гекс, нужно почистить массив и после перемещения шарика, набить его гексами по новой... а с какой стороны ни ткнусь не выходит и все тут. Потому и "поиск пути" у него немного странноват ))))

Сам скрипт, пока без привязки к од итп:

Синтаксис:
Используется javascript
var me : GameObject;

var CurPosX : float ;
var CurPosZ : float ;

static var target : GameObject ;

static var HEXS = new Array();
var DistToTarg : float;
var zz = int;

var TargX : float;
var TargZ : float;


function CHEXS (){
HEXS.Clear();
}


function Start () {
me = gameObject;
target  = GameObject.Find("start");
me.transform.position.x = target.transform.position.x;
me.transform.position.z = target.transform.position.z;
}



function OnTriggerEnter ( other : Collider ) {
        if (other.gameObject.tag == "hex"){
            AN.HEXS.Push(other);
        }
Debug.Log("длина массива" + HEXS.length);
}



function Update () {
DistToTarg = Vector3.Distance(me.transform.position, target.transform.position);       
                if( Input.GetKeyDown( KeyCode.Space)) {
                        for (var i = 0; i < HEXS.length;i++){
                                var temp = Vector3.Distance(HEXS[i].transform.position, target.transform.position);
                                        if (temp < DistToTarg){
                                        TargX = HEXS[i].transform.position.x;
                                        TargZ = HEXS[i].transform.position.z;
                                        }
                        }
                me.transform.position.x = TargX;
                me.transform.position.z = TargZ;
                }
}





function OnGUI() {
        GUI.Label (Rect (10, 50, 400, 40), "гекс Х: " + target.transform.position.x);
        GUI.Label (Rect (10, 70, 400, 40), "гекс Y: " + target.transform.position.x);
        GUI.Label (Rect (10, 100, 400, 40), "лефт Х: " + me.transform.position.x);
        GUI.Label (Rect (10, 120, 400, 40), "лефт Z: " + me.transform.position.z);
       
        GUI.Label (Rect (10, 170, 400, 40), "количество гексов в массиве: " + HEXS.length);
}

 



Ну и то, как эта жуть сейчас выглядит [curved_hands] :

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://46165957.16mb.com/tb.unity3d&w=600&h=400&t=false&preview=1' height='"+(400+30)+"' width='600' frameborder='0' scrolling='no'></iframe>"); </script>


Люди подскажите, как лучше сделать? )))
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение Syberex 22 янв 2013, 13:07

46165957 писал(а):Пока из мыслей - искать все гексы по тегу и отбирать из них 6 на дистанции в которую попадут их центры, после чего проверять расстояние от этих шести до пункта назначения, и перемещаться в тот у которого меньшее расстояние.... а как быть если гексов тысячи... :(

С полем надо работать как с массивом или со структурой данных.

В демке шарик циклится вокруг целевой ячейки ...
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: И снова шаговка и гексы.

Сообщение 46165957 22 янв 2013, 13:51

Вот с работой с массивами и структурами, и провал... увы.
Возможно примеры и есть, но пока знаний не хватает их понять, или просто найти не выходит.
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение seaman 22 янв 2013, 13:59

когда шарик передвигается на следующий гекс, нужно почистить массив и после перемещения шарика, набить его гексами по новой

Может лучше такой массив хранить в самой ячейке? - массив соседей с указанием проходимости.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: И снова шаговка и гексы.

Сообщение BornFoRdeatH 22 янв 2013, 14:08

Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: И снова шаговка и гексы.

Сообщение 46165957 22 янв 2013, 14:40

seaman - Надо будет подумать такую мысль. Но мне кажется от ячейки вообще мало что должно зависеть. Ну разве что какие нить фантики вроде подсветки выделеного гекса, итп. С проходимостью помогает наличие или отсутствие ячейки. С расстоянием до финиша тоже вопрос. Вроде должно динамически определяться, но в то же время вычислять его на карте 50*100 гексов не хочется. Сейчас его считаю в ОнТриггерСтэй "игрока" для 7 клеток, что не правильно, нужно для 6 (кроме той, что под игроком).

ЗЫ Вообще пока писал ответ, нашел хорошую статью про массивы и, кажется, нащупал решение :) Как и преполагал, var HEXS = new Array(); - самый тупой и дубовый вариант...Если пользовать Hashtable, к примеру, появляются интересные варианты... )
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение 46165957 22 янв 2013, 14:42

BornFoRdeatH писал(а):http://tbswithunity3d.wordpress.com/2012/02/23/hexagonal-grid-path-finding-using-a-algorithm/


Это реально круто! СПАСИБО!
Но есть у меня подозрение, что можно утолкать все в один скрипт и сделать проще, буду пробовать )
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение 46165957 23 янв 2013, 10:05

И снова косяк.... дорожку он ищет, но оптимальной ее назвать тяжеловато.

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://46165957.16mb.com/pf2.unity3d&w=960&h=600&t=false&preview=1' height='"+(600+30)+"' width='960' frameborder='0' scrolling='no'></iframe>"); </script>



Синтаксис:
Используется javascript
static var key_i = 1;
var me : GameObject;
static var target : GameObject;
var trail : GameObject;
static var a: Hashtable = new Hashtable();



var hex_to_target : float;
var to_target : float;


function Start () {
me = gameObject;
A.target = GameObject.Find("start");
me.transform.position.x = target.transform.position.x;
me.transform.position.z = target.transform.position.z;

}


function wplus () {
        for (var i=0; i < key_i; i++){
                if(a.ContainsKey(i)){
                hex_to_target = Vector3.Distance(a[i].transform.position, target.transform.position);
                        if (hex_to_target+0.3 < to_target){
                        Instantiate(trail, transform.position, transform.rotation);
                        me.transform.position.x = a[i].transform.position.x;
                        me.transform.position.z = a[i].transform.position.z;
                                                }
                }
        }
       
}



function Update () {
to_target = Vector3.Distance(me.transform.position, target.transform.position);
wplus ();
}


function OnGUI() {

        GUI.Label (Rect (10, 50, 400, 40), "длина массива " + a.Count);
        GUI.Label (Rect (10, 70, 400, 40), "всего гексов " + key_i);

}
 


То что живет в гексе:

Синтаксис:
Используется javascript

var key : int;
var InArray = 0;
var InTrigger = 0;
private var distance_hero : float;
private var distance_target : float;

function Start () {
A.key_i += 1;
key = A.key_i;
renderer.material.color = Color(0.44, 0.44, 0.44);

function OnTriggerStay ( other : Collider ) {
distance_hero = Vector3.Distance(gameObject.transform.position, GameObject.Find("HERO").transform.position);
distance_target = Vector3.Distance(gameObject.transform.position, A.target.transform.position);

if (other.gameObject.tag == "HERO"){
        if (InArray == 0){
        renderer.material.color = Color(0.44, 0.44, 0.44);
                if (distance_hero > 1 && distance_hero < 2){
                        A.a.Add(key, gameObject);
                        InArray = 1;
                        }              
        }
        if (InArray == 1){
        renderer.material.color = Color(1, 0.7, 0);
                if (distance_hero < 1){
                        A.a.Remove(key);
                        InArray = 0;
                }              
        }
        if (InArray == 1){
                if (distance_hero > 2){
                        A.a.Remove(key);
                        InArray = 0;
                }              
        }
}
}
 


Есть подозрение, что такая кривь получается от того, что я сравниваю расстояние от гекса до таргета, с расстоянием от игрока до него же... а нужно искать гекс с меньшим расстоянием, и тут очередная головоломка, как найти гекс с наименьшим расстоянием. Грузить его расстояния в Array - тогда я после сортировки не смогу найти гекс от которого мерял расстояние. Грузить в Hashtable - не смогу отсортировать, просто не могу представить как это сделать. :(
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

Re: И снова шаговка и гексы.

Сообщение 46165957 26 янв 2013, 13:02

Что-т такое получается

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://46165957.16mb.com/pf4.unity3d&w=960&h=600&t=false&preview=1' height='"+(600+30)+"' width='960' frameborder='0' scrolling='no'></iframe>"); </script>


Дьявол скрывался в мелочах...
как то, что по У не совпадали координаты гекса и "игрока".... т.о. замер расстояния от игрока показывал бОльшее значение чем от гекса до гекса.
А еще был прикол с самими гексами, где-то то ли в кореле(когда делал сечения), либо в максе, где пробовал собирать сценки, потянул масштаб, в итоге стрельнула разница в пропорциях на 2%...

И еще момент, не могу придумать, как остановить поиск когда "игрок" начинает "дрожать"... например, сейчас выбирается гекс от которого ближе к цели а после перехода ближним становится тот с которого ушли... и все, туда-сюда на все од. Метить гексы на которых уже был не совсем хорошо получается, будет постоянно застревать в тупиках... посоветуете идею?

Синтаксис:
Используется javascript
static var key_i = 1;
static var target : GameObject;
static var a: Hashtable = new Hashtable();

var OD : int;
var health : int;

var me : GameObject;
var step : GameObject;
var trail : GameObject;

var hex_to_target : float;
var to_target : float;
var targ_min : float;
var t_dist : float;

var dist_key_next : float;
var hex_hex : float;
var koff : float;
 




function Start () {
me = gameObject;
target = GameObject.Find("start");
step = GameObject.Find("start");
me.transform.position.x = target.transform.position.x;
me.transform.position.z = target.transform.position.z;
targ_min = Vector3.Distance(GameObject.Find("hexes01").transform.position, GameObject.Find("hexes02").transform.position)+1;
//OD = ctrl1.p1_OD;
OD = 10;
//health = ctrl1.p1_health;
health = 100;

}




function gogo () {


var t_dist = 1500.00;


if (me.transform.position.x != target.transform.position.x && me.transform.position.z != target.transform.position.z)
{
for (var i=0; i < key_i; i++)
{
                if(a.ContainsKey(i))  
                {
                        hex_to_target = Vector3.Distance(a[i].transform.position, target.transform.position);
                       

                                if (hex_to_target < t_dist)
                                {
                                        step = a[i];
                                        t_dist = Vector3.Distance(a[i].transform.position, target.transform.position);

                                }


                        }

}
}


me.transform.position.x = step.transform.position.x;
me.transform.position.z = step.transform.position.z;
Instantiate(trail, transform.position, transform.rotation);

}



function Update () {

to_target = Vector3.Distance(me.transform.position, target.transform.position);

//control();
gogo ();

}


function OnGUI() {


        GUI.Label (Rect (10, 10, 400, 40), "Длина массива " + a.Count);
        GUI.Label (Rect (10, 30, 400, 40), "Всего гексов :" + key_i);
        GUI.Label (Rect (10, 60, 400, 40), "(!)Действий :"  + OD);
        GUI.Label (Rect (10, 80, 400, 40), "(!)Здоровье :"  + health);
       
     
}

 
46165957
Старожил
 
Сообщения: 835
Зарегистрирован: 13 май 2011, 12:14

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 20