Я работаю с limeJS, пытаясь найти лучший способ поместить графический интерфейс поверх limeJS. Вот лучшее объяснение:GUI Layer on limeJS
Я создал два класса, один из которых называется «SceneWithGui», а другой называется «GuiOverlay». Мое намерение состоит в том, что наследует 'SceneWithGui' от '' lime.Scene, добавив свойство и два метода:
- guiLayer (который является объектом GuiOverlay)
- setGuiLayer
- getGuiLayer
В следующем порядке:
//set main namespace
goog.provide('tictacawesome.SceneWithGui');
//get requirements
goog.require('lime.Scene');
goog.require('tictacawesome.GuiOverlay');
tictacawesome.SceneWithGui = function() {
lime.Node.call(this);
this.guiLayer = {};
};
goog.inherits(tictacawesome.SceneWithGui, lime.Scene);
tictacawesome.SceneWithGui.prototype.setGuiLayer = function (domElement){
this.guiLayer = new tictacawesome.GuiOverlay(domElement);
};
tictacawesome.SceneWithGui.prototype.getGuiLayer = function(){
return this.guiLayer;
};
Целью «GuiOverlay» является удержание элемента DOM таким образом, чтобы при сцена или директор меняются, это тоже произойдет. Для этого я просто унаследовал от lime.Node, надеясь, что на нем уже что-то уже установлено. Мой код:
//set main namespace
goog.provide('tictacawesome.GuiOverlay');
//get requirements
goog.require('lime.Node');
tictacawesome.GuiOverlay = function(domElement){
lime.Node.call(this);
this.setRenderer(lime.Renderer.DOM);
this.domElement = domElement;
};
goog.inherits(tictacawesome.GuiOverlay, lime.Node);
И это в основном идея всего этого. Для лучшей визуализации, вот пример использования:
//set main namespace
goog.provide('tictacawesome.menuscreen');
//get requirements
goog.require('lime.Director');
goog.require('lime.Scene');
goog.require('lime.Layer');
goog.require('lime.Sprite');
goog.require('lime.Label');
goog.require('tictacawesome.SceneWithGui');
tictacawesome.menuscreen = function(guiLayer) {
goog.base(this);
this.setSize(1024,768).setRenderer(lime.Renderer.DOM);
var backLayer = new lime.Layer().setAnchorPoint(0, 0).setSize(1024,768),
uiLayer = new lime.Layer().setAnchorPoint(0, 0).setSize(1024,768),
backSprite = new lime.Sprite().setAnchorPoint(0, 0).setSize(1024,768).setFill('assets/background.png');
backLayer.appendChild(backSprite);
this.appendChild(backLayer);
lime.Label.installFont('Metal', 'assets/metalang.ttf');
var title = new lime.Label().
setText('TicTacAwesome').
setFontColor('#CCCCCC').
setFontSize(50).
setPosition(1024/2, 100).setFontFamily('Metal');
uiLayer.appendChild(title);
this.appendChild(uiLayer);
this.setGuiLayer(guiLayer);
};
goog.inherits(tictacawesome.menuscreen, tictacawesome.SceneWithGui);
Все это выглядит довольно на код, но он просто не работает (сцена, даже не получить отображается больше). Вот ошибки я получаю через Chrome консоль:
Uncaught TypeError: Cannot read property 'style' of undefined director.js:301
Uncaught TypeError: Cannot read property 'transform_cache_' of undefined
Я не очень опытный в JS, так что единственный ключ я нашел, что это происходит, когда «tictacawesome.menuscreen» goog.base достигает»(это)'.
ОБНОВЛЕНИЕ: После некоторого испорчения кода я могу передать предыдущие проблемы, которые у меня были (до этого редактирования), и теперь я натыкаюсь на те, которые были упомянуты выше. Когда он достигает directior.js:301
, линия scene.domElement.style['display']='none';
. scene
есть, но scene.domElement
нет. Я как-то испортил domElement своим guiOverlay?
Любые идеи? Какие-либо очевидные недостатки в моем дизайне? Я на правильном пути?
Спасибо.
Я не знаю, как использовать linme, но вы используете эту несвязанную? Если да, то почему у вас есть требование к lime.director в tictacawesome.menuscreen? Я не вижу, чтобы ты использовал режиссера. Если какой-либо из других классов использует его, но, как я понимаю, он должен загружать его, когда это необходимо. При закрытии google вы должны поместить все требования в один блок кода (на странице html), прежде чем требовать их в своих js-файлах. Вы не можете требовать и использовать его в одном и том же блоке кода (его без компиляции). – HMR