Forum

User posts -Vampire-
04 May 2015 03:13
Всем привет! Вот решил рискнуть и выложить на эшафот то, что ваяю.

В последнее время, я с веб-программирования переключился на электронику и программирование микроконтроллеров. Штука очень забавная и интересная, знаете ли =))) Ну и мастерим мы с другом по этому поводу светодиодный куб. Что это такое, объяснять, думаю, не надо. Если что, видео на ютубе куча.

Нутк вот. Программ моргания у кубика по хорошему должно быть много и все они разные и красивые. Но составлять их ручками и смотреть какой бит в какой момент должен быть ноликом, а какой единичкой - жутко утомительное занятие.

Лень - двигатель прогресса. Дабы не загружать себя этой рутинной фигнёй, я решил запилить код, который за меня всё сделает. А так как это куб, так как опенжыэль я не знаю, и так как blend4web вполне себе мощный и юзер-френдли, вопрос "на чем мы это запилим?" отпал сразу.

Не судите строго, на прям пипец какую крутизну этот проект не претендует, но мне вот захотелось вам об этом рассказать. Ощем, вот так это выглядит сейчас. Под фото ссылочки на видео как ето работает.


Пока как-то так
03 May 2015 21:09

Как мне определить с каким объектом произошло столкновение?
Если мне не изменяет память, я это реализовал, повесив манифолд не на объект, который сталкивается, а на обект, с которым мой обект (в данном случае я так понимаю пуля) должен столкнуться. В этом случае в колбэке мы будем иметь ссылку на "обект-препятствие", а сенсор сработает у пули. То есть
m_ctl.create_sensor_manifold({Тут тот в кого стреляем}, "COLLISION", m_ctl.CT_TRIGGER, sensors,
        logic_func, trigger_pula);


ну и как следствие, мы можем получить координаты объектов в момент столкновения простым transform.get_translation(). Так же, если не ошибаюсь, я как-то в колбэк передавал 4 параметром объект, у которого можно спросить "а где?". И заморочка у меня была тож с collision'ами. Только вот не помню как я это делал. Пошарю по проектам, если найду скину.
02 May 2015 23:01
Круто!!!!! Спасибо, ребята!!
02 May 2015 17:20
Всем привет!!!!

Давненько меня тут не было =)) Смотрю, кучу всего нового и полезного запили… Молодцы, так держать!!!
Ну и вот как раз по этому новому (для меня) у меня и возник вопрос.

Есть у меня меш, и есть у этого меша материал. Таких мешей у меня в приложении должно быть много. И дабы не громоздить большую сцену, я решил воспользоваться замечательным модулем objects и замечательным методом этого модуля copy.

Всё отработало прекрасно, но… =((( При попытке изменить свойство материала (например diffuse_color) какого-то из скопированных мешей, новое значение этого свойства присваивается всем скопированным мешам.

Правильно ли я понимаю, что что объект содержит в себе не копию экземпляра материала, а всего лишь ссылку на него? Если это так, то всё в принципе понятно и ожидаемо, но возможно ли (и если да, то с помощью чего) реализовать желаемое мной поведение?

З.Ы. Простите если спрашиваю как прочесть букварь… =))) Еще не весь changelog прочитал.. И спасибо большое!! Вы делаете очень крутую штуку
08 December 2014 04:56
а что надо сделать чтоп на бэйдже было мое имя?
06 December 2014 20:46
Ответ на сообщение пользователя Юрий Ковеленов
Здесь могло быть ваше имя
ээээээ!!!!! а уже поздно? я поеду!!!
03 December 2014 16:16
Солидарен с вами по всем пунктам. За линк на RequireJS спасибо, ознакомлюсь. Единственное, наверное, что хочу добавить: при подходе "один модуль - один файл", ориентироваться в коде гораздо проще. ИМХО для dev - самое оно. Особенно если приложение большое (у меня вот фантазия богатая, я могу много чего понапридумывать) и код постоянно дописывается\переписывается. А на продакшне, да - единственный склеенный минимизированный файл
03 December 2014 08:27
UPD Решил проще.

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


exports.import = function(moduleName, callback){
if(!imported[moduleName]){
console.log('first import ' + moduleName);
imported[moduleName] = {cb:[callback], status:STATUS_LOADING};
var s = document.createElement('script');
s.src = '/' + moduleName + '.js';
s.onload = function(){
imported[moduleName].status = STATUS_READY;
console.log('imported ' + moduleName);
for(var i = 0; i < imported[moduleName].cb.length; i++)
imported[moduleName].cb[i](require(moduleName));
}
document.body.appendChild(s);
}
else{
if(imported[moduleName].status === STATUS_LOADING){
console.log('pushing while loading ' + moduleName);
imported[moduleName].cb.push(callback);
}
else{
console.log('calling existing ' + moduleName);
callback(require(moduleName))
}
}
}
03 December 2014 05:36
Здравствуйте.

Поправьте меня, если я ошибаюсь.
На данный момент, если я хочу использовать написанный мною модуль, то я должен ручками тэгом script подключить его к странице, и после этого я уже могу его require(). Но допустим, у меня в приложении 50 таких модулей, в каждом по 5000 строк кода и каждый из которых усердно трудится. Соответственно, мой многострадальный браузер будет смиренно грузить все эти модули независимо от того, будут они использоваться далее или нет. Как следствие - ненужные обращения к серверу, лишний траффик. Для домашних рабочих станций с хорошим каналом это будет не так заметно, но вот на мобильных устройствах скорость оставляет желать лучшего.

Как вы смотрите на то, чтоб модуль загружался браузером всего один раз и только при первом require() этого модуля? Можно было бы ввести соглашение имен, как это сделано в nodejs - все пользовательские модули лежат в определенной директории, имя директории модуля должно совпадать с именем модуля, а исходный текст должен лежать например в module.js…


В принципе, это конечно можно оставить и на откуп разработчикам…. Я это реализовал вот так Код не претендует на эталон, но принцип понятен. Тут есть загвоздка с потоками. Если попытаться импортировать один и тот же модуль через небольшой интервал времени, то этот скрипт поведет себя непредсказуемо т.к. неизвестно, успеет ли загрузиться файл до второго вызова или нет. Должно решиться синхронизацией.


/* Собственно сам импорт */
b4w.register('importer', function(exports, require){
var imported = {};
var modulesDir = '/'; // Ну пусть пока будет корень… =)
exports.import = function(moduleName, callback){
if(!imported[moduleName]){
var s = document.createElement('script');
s.src = modulesDir + moduleName + '.js';
s.onload = function(){
/*Не факт, что это случится ДО второго импорта этого же модуля*/
imported[moduleName] = require(moduleName);
callback(imported[moduleName]);
}
document.body.appendChild(s);
}
else{
/*Вот здесь возникнут проблемы*/
callback(imported[moduleName]);
}
}
});

/* Вызов импорта */
var importer = b4w.require('importer');
var test;
importer.import('test_module', function(module){
test = module;
test.init('hello world');
});



Простите, если несу ересь в массы
28 November 2014 10:30
спасибо!