Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Новые обьекты 
:(
    Опции темы
neoks
Дата 10.9.2013, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Пишу редактор для создание новых объектов в игре, в чем суть, нужно создать обьект, посмотреть какие скрипты у него есть и по надобности запустить.
К примеру как это делается в unity 3D в скриптах.

Код

var hl = 100, weapons = 1;

function createObject(){
     // создаю обьект со всеми параметрами и тд
     .....
}
function update(){
    //наступает из основного скрипта и тут происходит обновления обьекта
}
function destroy(){
     ....
}


не могу сообразить теперь как этот скрипт подгружать, к примеру основной скрипт выполняет функцию 

Код

var id  = 'ID обьекта в базе';
var object = new gameObject(id);

object.createObject({......});

.....


также не могу врубить как ID подгружать, к примеру есть массив с этими ID и в них есть те самые скрипты, вопрос в том как их выполнить ? знаю что можно через eval() но потом найти ошибку как иголку в стоге сена.
Есть идее как это можно реализовать ? smile
PM MAIL   Вверх
neoks
Дата 10.9.2013, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Намудрил вот такое, не знаю, правильно ли решение ?

Код

var fileString = 'var rf = "test"; obj.prototype.bi = function(){ return rf; }';
            var fileString2 = 'var rf = "test2"; obj.prototype.bi = function(){ return rf; }';
            
            var obj;
            
            function loadScript(string){
                obj = null;
                
                obj = function(){
                    
                }
                
                jQuery.globalEval( "try { " + string +"} catch(e) { alert(\"Error: '\"+e.toString()+\"'\"); }");
                
                
                return new obj();
            }
              
            jQuery(document).ready(function(){
                var obj = loadScript(fileString);
                var obj2 = loadScript(fileString2);
                
                console.log(obj.bi());
                console.log(obj2.bi());
            });


Добавлено через 2 минуты и 17 секунд
а блин, значение одинаковое почему то))
PM MAIL   Вверх
skyboy
Дата 10.9.2013, 22:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



я нифига не понял :(
PM MAIL   Вверх
neoks
Дата 10.9.2013, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



skyboy пытаюсь загружать скрипт из файла, суть в том что каждый игровой обьект имеет свой скрипт, игровой движок запускает события типа onCreate(), onUpdate(),onDestroy() и тд. например при создание обьекта чет нуно сделать или добавить что-та в карте или еше что-та сделать.
Поэтому нечего проще не придумал как сделать вот такие вот скриптики для взаимодействия с обьктом, но долго думал как сделать так чтобы игровой движок запускал события в обьекте.

Намудрил так, вроде пашет правильно, просто и со вкусом))

Код

            /**массив загруженных файлов**/
            
            var gameObjs = {
                house:'var hl = 100; this.create = function(){ /*создать на карте чет */ return hl; }',
                car:'var hl = 40; this.create = function(){ return hl; }',
            };
            
            
            function gameObject(id){
                if(gameObjs[id]) eval( "try { " + gameObjs[id] +"} catch(e) { alert(\"Error: '\"+e.toString()+\"'\"); }");
            }
            
            
            var obj = new gameObject('house');
            
            console.log(obj.create());

PM MAIL   Вверх
skyboy
Дата 10.9.2013, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



окей.
1. каждый объект(конструктор?) — в отдельном файле.
2. надо подгружать файлы динамически(нельзя сразу все файлы подключить и потом просто вызывать те или иные блоки?)
3. после окончания загрузки надо как-то выполнять код в них(про requirejs слыхал? почему б не использовать такой же подход?)

Цитата

Намудрил так, вроде пашет правильно, просто и со вкусом))

запуск кода из строки — та еще боль.
PM MAIL   Вверх
neoks
Дата 11.9.2013, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



skyboy не особо та понял что делает requirejs ? пока вдуплил что оно скрипты подгружает, вроде также можно сделать и свою функцию через тег <script>
2. не обязательно динамически, можно через php все подгрузить, все равно они все будут загружены


Цитата(skyboy @  10.9.2013,  23:55 Найти цитируемый пост)
запуск кода из строки — та еще боль.

но requirejs также загружает скрипт в строку и я им потом пользуюсь, не так ли ?

PM MAIL   Вверх
ksnk
Дата 11.9.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(neoks @  11.9.2013,  11:22 Найти цитируемый пост)
requirejs также загружает скрипт в строку и я им потом пользуюсь, не так ли ?

Оно загружает скрипты, а не кусочки кода.
Код

/** bot #2 realisation */
{
   onCreate: function(engine){ 
      engine.addObject(this);
   },
   onAction: function(){
       var self = this;
       /* look at closest enemy and destroy him */
       if(!engine.lookAtClosesObject(this,  200, function(obj,dist){
              if(!this.isEnemy(obj)) return true;
              if(dist<100) 
                     this.shootAt(obj);
              else
                     this.goTo(obj);
              return false;
       })) { // no enemy found at range 200
            this.goTo(random_direction);
       };
   },
   onDestroy: function(engine){ 
      engine.removeObject(this);
   }
}

Если после загрузки объекта поменять ему prototype на нужный объект, то дополнительного eval'а больше не понадобится. 

Это сообщение отредактировал(а) ksnk - 11.9.2013, 12:15


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 11.9.2013, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk я пока вообще не врубаюсь как это чудо работает, читал доки, примеры, какие там примеры? вот он умеет загружать а что загружать хз что он может)) поэтому я пока вообше не вкуриваю как оно работает, как мне к примеру конструктор писать? и какой скрипт писать в файл? специальный для requirejs или мона свой писать? аля что угодно и оно будет работать?))

Этот пример то что ты мне дал я снова не вкурил, это типа в файле должен быть скрипт? или где?, и как потом им пользоваться с движка?

На примере запуск конструктора с движка;

Код

var object = new gameObject(); // нуно как-то получить конструктор объекта

//а дальше движок уже пользуется объектом, создает, обновляет, удаляет

object.onCreate(x,y);
object.onUpdate();
object.setValue();
object.getValue();
object.onDestroy();
......


Сори за стока вопросов) я не гуру в скрипте вот и не понимаю как оно работает) мне пример бы чтобы понять что к чему)

Это сообщение отредактировал(а) neoks - 11.9.2013, 14:44
PM MAIL   Вверх
ksnk
Дата 11.9.2013, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Код

var object = require('bot.2.object'); // нуно как-то получить конструктор объекта
//а дальше движок уже пользуется объектом, создает, обновляет, удаляет
object.onCreate(x,y);
object.onUpdate();
object.setValue();
object.getValue();
object.onDestroy();
......


C requireJs не работал, но осуждаю  smile 
Вот наколенная грязная реализация. Вероятно, что-то подобное делает и requireJs.

Код

function require(name){
   var result=null;
   $.ajax({
      method:'get',
      url:'/object/scripts/'+name+'.js'
      async :false, // не асинхронный
      success:function (data){
          result=new Function(' return '+data);
      }
   });
   if(result) {
      try {  
         /** @var proto - ОБЩИЙ ПРОТОТИП ДЛЯ ВСЕХ ОБЪЕКТОВ*/;
       
          result.prototype=proto;
          result=new result();
      } catch( e) {
          console.log('Oops!', e);
          result=false;
      }
   }
   return result;
}


Что то такое. Ключевые моменты - асинхронный запрос тут только для того, чтобы первоначальный пример работал. Должна существовать функция-прототип всех объектов, чтобы не писать все возможные методы во всех скриптах. Писано на коленке, возможны ашипки.

ajax от jquery- это просто демонстрация неасинхронного аякса.

P.S. Надо бы проверить что тут такое написалось ...

Это сообщение отредактировал(а) ksnk - 11.9.2013, 16:13


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 11.9.2013, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Попробовал, поменял вместо ajax сразу на строку http://jsfiddle.net/QTwQc/ выбил вот такую вот ошибку Uncaught SyntaxError: Unexpected token var , что теперь писать в строке ? 

Это сообщение отредактировал(а) neoks - 11.9.2013, 17:59
PM MAIL   Вверх
ksnk
Дата 11.9.2013, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Вот
Не было определения функции proto и так, по мелочи...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 11.9.2013, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk Спасибо! как всегда выручил) еще бы придумать как бы так сделать чтоб когда метода такого нет не вылетала ошибка))
PM MAIL   Вверх
ksnk
Дата 11.9.2013, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(neoks @  11.9.2013,  22:03 Найти цитируемый пост)
как бы так сделать чтоб когда метода такого нет не вылетала ошибка)) 

Ну, как всегда на JS

Код

object.onCreate && object.onCreate(x,y);
object.onUpdate && object.onUpdate();
object.setValue && object.setValue();
object.getValue && object.getValue();
object.onDestroy && object.onDestroy();

Хотя иногда луше в прототипе определить затычки


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 11.9.2013, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(neoks @  11.9.2013,  21:03 Найти цитируемый пост)
 еще бы придумать как бы так сделать чтоб когда метода такого нет не вылетала ошибка)) 

какой смысл вызывать метод, если не уверен, что он есть?
взять за прототип объект с пустыми методами-заглушками.
вызывать, не боясь.
PM MAIL   Вверх
neoks
Дата 12.9.2013, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Все, вопрос решен, сделал заглушки, еще раз спасибо всем)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.