Нужна помощь

26 сентября 2016 17:54 #12113
mac os (safari), винда (IE или хром). но двое уже было знакомых, которых я просил посмотреть модель на предмет скорости загрузки и они жаловались, что давят на wasd и у них не двигается персонаж.
Алексей
27 сентября 2016 10:02 #12137
Доброго времени суток.


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

Я правильно вас понял, у вас есть два написанных вами модуля. В одном из них вы написали логику управления камерой клавишами клавиатуры, используя create_sensor_manifold. Так же вы создали два HTML-элемента, по клику на которые вызывается enable_camera_controls или disable_camera_controls. И работает это не правильно: клик на disable_camera_controls ломает логику управления, написанную через create_sensor_manifold

Вызов функции disable_camera_controls приводит к удалению служебных манифолдов со следующими именами:

"FORWARD", "BACKWARD", "ROT_UP", "ROT_DOWN",
            "ROT_LEFT", "ROT_RIGHT", "UP", "DOWN", "LEFT", "RIGHT",
            "MOUSE_WHEEL", "TOUCH_ZOOM", "ZOOM_INTERPOL", "MOUSE_X", "MOUSE_Y",
            "TOUCH_X", "TOUCH_Y", "ROT_TRANS_INTERPOL", "CHANGE_MOVE_STYLE"


Обратите внимание, может быть вы использовали для манифолда одно из этих имён?


Второй вопрос: как в консоли после того, как сцена загрузилась, получить доступ к модулям, чтобы вручную поковыряться с объектами? В настоящее время у меня большая часть переменных и модулей после загрузки сцены стали недоступны.

Можно это осуществить через глобальный объект b4w:


Если у вас затруднения с использованием манифолдов, вы могли бы прислать ваш проект на саппорт почту. В таком случае получилось бы более продуктивное общение.
Разработчик Blend4Web
27 сентября 2016 10:03 #12138
mac os (safari), винда (IE или хром). но двое уже было знакомых, которых я просил посмотреть модель на предмет скорости загрузки и они жаловались, что давят на wasd и у них не двигается персонаж.

Что ж, потестим перед релизом
Разработчик Blend4Web
27 сентября 2016 11:43 #12146
Роман, спасибо за пояснения.
Да, действительно, у меня этими именами названы манифолды.

По процессам в памяти компьютера, подскажите, если в load_cb у меня есть две функции:
s_interface.setup_interface(); //делает dev, созадает кнопки, на onclick вешает enable_camera_controls и disable…,соответственно,
s_movs.setup_movement(); //делает ручное управление.

У меня при первичном проходе программы видим запускаются все события onclick, потому что console.log выводит тестовое события "якобы был onclick" в консоль уже при загрузке сцены.

Это специфика интерпретации javascript - что он при назначении переменных все функции по разу запускает?
Какой бы Вы посоветовали более грамотный способ: не напрямую включать управляющие функции от кнопок, а переключать какое-нибудь значение в tmp, которое потом будет отслеживаться в функции с манифолдами и переключать куски управления через if? Или еще как-нибудь?

Насчет b4w - понял, спасибо. Подскажите теперь насчет модулей, хочу например что-нибудь из scenes запустить потестить на результат, а консоль пишет, что не находит такого имени, хотя при назначении breakpoint такие переменные находятся, но смысла в них при отсутствии сцены нет…. (с js и прочей "web разработкой" ковыряюсь третий день, поэтому хочу максимально быстро для себя все это понять и перейти к полноценной работе).

Заранее спасибо.
Алексей
27 сентября 2016 13:08 #12150
При загрузке модели на медленном канале (5мбит) приходится долго ждать пока даже счетчик загрузки появится - как можно сразу включить какую-нибудь развлекашку для пользователя, чтобы он не подумал, что все зависло????
Алексей
27 сентября 2016 13:21 #12151
Все, функции внутри b4w нашел - супер!
Алексей
27 сентября 2016 14:08 #12158
При загрузке модели на медленном канале (5мбит) приходится долго ждать пока даже счетчик загрузки появится - как можно сразу включить какую-нибудь развлекашку для пользователя, чтобы он не подумал, что все зависло????

Вы имеете ввиду прелоудер? Вставить какую-нибудь css-анимацию, пока идёт загрузка?
Если да: в SDK есть примеры (в демках) как реализованы прелоудеры
Если нет: прелоудер стартует по вызову функции m_data.load, которая вызывается из скрипта по завершению инициализации, которая очень быстрая (мгновенная) и которая вызывается по завершению загрузки скрипта (.js - файла). Таким образом, всё упирается во время загрузки скриптов (.js - файлов). Если использовать обфускацию (в менеджере проектов называется компиляцией) то размер скриптового файла станет меньше, загрузка ускорится. Если этого всё равно не достаточно, то можно сделать из html-элементов какую-нибудь подсказку, что сейчас начнётся загрузка и потом это удалить при инициализации.
Разработчик Blend4Web
27 сентября 2016 14:10 #12159
Все, функции внутри b4w нашел - супер!

На скриншоте выше привёл вам пример, видимо, надо было выделить логику использования объекта b4w
Разработчик Blend4Web
27 сентября 2016 14:13 #12160
Это специфика интерпретации javascript - что он при назначении переменных все функции по разу запускает?
Какой бы Вы посоветовали более грамотный способ: не напрямую включать управляющие функции от кнопок, а переключать какое-нибудь значение в tmp, которое потом будет отслеживаться в функции с манифолдами и переключать куски управления через if? Или еще как-нибудь?

JS не вызывает обработчиков событий, пока эти события не произойдут. Не могли бы вы привести пример назначения обработчика событий?

К примеру:
var callback = function(event) {
console.log("click")
}
var html_elem = document.getElementById("my_element_id_from_html_file");
html_elem.addEventListener("mousedown", callback, false);
Разработчик Blend4Web
27 сентября 2016 14:24 #12163
Это код в основном js файле:
function load_cb(data_id, success) {

if (!success) {
console.log("b4w load failure");
return;
}

// m_app.enable_camera_controls(true,true);

console.log(s_movs.setup_movement, s_interface.setup_interface);
s_interface.setup_interface();
s_movs.setup_movement();

}


код в s_interface:
b4w.register("interface", function(exports, require) {

var m_app = require("app");

exports.setup_interface = function () {

function init_interface() {
var controls_container = document.createElement("div");
controls_container.id = "controls_container";

var func_one = create_button("FUNCTION_ONE");
func_one.onclick = console.log('Turned on freelook');
controls_container.appendChild(func_one);

var func_two = create_button("FUNCTION_TWO");
func_two.onclick = console.log('Turned on freelook');
controls_container.appendChild(func_two);

document.body.appendChild(controls_container);
}

function create_button(caption) {
var button = document.createElement("div");
button.className = "button_container";
….и так далее по созданию кнопок…

Код в s_movs:
b4w.register("movements", function(exports, require) {

var m_ctl = require("controls");
var m_scs = require("scenes");
var m_phy = require("physics");
var m_cons = require("constraints");
var m_cam = require("camera");
var m_cont = require("container");
var m_mouse = require("mouse");

var _vec2_tmp = new Float32Array(2);


exports.setup_movement = function() {


var camobj = m_scs.get_active_camera();
console.log(camobj);
var character = m_scs.get_first_character();
console.log(character);
if (character) {
var angles = m_cam.get_camera_angles_char(camobj, _vec2_tmp);
console.log(_vec2_tmp);
m_phy.set_character_rotation(character, angles[0], angles[1]);
}
m_cons.append_stiff_trans(camobj, character, [0, 0.7, 0]);
…и далее там манифолы и т.д.

Так вот, сообщения 'Turned on freelook' выводятся при загрузке модели, хотя на кнопки я не нажимал еще. (см.приложение)

Вопрос: почему и как сразу понять корректную структуру работы со всеми настройками в контексте b4w окружения (колбэков, регистраций модулей и глобальных объектов)
Алексей
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.