From eeb0dc8a63e18badb6696805ba81f4341bc0cbf5 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Mon, 28 Mar 2016 19:39:16 +0200 Subject: [PATCH] Implement TextEntryObject for Cocos2d --- Extensions/TextEntryObject/JsExtension.cpp | 5 +- .../textentryruntimeobject-cocos-renderer.js | 37 +++++++++++ .../textentryruntimeobject-pixi-renderer.js | 65 ++++++++++++++++++ .../TextEntryObject/textentryruntimeobject.js | 66 +++++-------------- 4 files changed, 122 insertions(+), 51 deletions(-) create mode 100644 Extensions/TextEntryObject/textentryruntimeobject-cocos-renderer.js create mode 100644 Extensions/TextEntryObject/textentryruntimeobject-pixi-renderer.js diff --git a/Extensions/TextEntryObject/JsExtension.cpp b/Extensions/TextEntryObject/JsExtension.cpp index 5f6bb0a0bb..f876c8ae49 100644 --- a/Extensions/TextEntryObject/JsExtension.cpp +++ b/Extensions/TextEntryObject/JsExtension.cpp @@ -34,7 +34,10 @@ public: DeclareTextEntryObjectExtension(*this); - GetObjectMetadata("TextEntryObject::TextEntry").SetIncludeFile("TextEntryObject/textentryruntimeobject.js"); + GetObjectMetadata("TextEntryObject::TextEntry") + .SetIncludeFile("TextEntryObject/textentryruntimeobject.js") + .AddIncludeFile("TextEntryObject/textentryruntimeobject-pixi-renderer.js") + .AddIncludeFile("TextEntryObject/textentryruntimeobject-cocos-renderer.js"); GetAllActionsForObject("TextEntryObject::TextEntry")["TextEntryObject::String"].SetFunctionName("setString").SetGetter("getString"); GetAllConditionsForObject("TextEntryObject::TextEntry")["TextEntryObject::String"].SetFunctionName("getString"); diff --git a/Extensions/TextEntryObject/textentryruntimeobject-cocos-renderer.js b/Extensions/TextEntryObject/textentryruntimeobject-cocos-renderer.js new file mode 100644 index 0000000000..6cdd9ecdb7 --- /dev/null +++ b/Extensions/TextEntryObject/textentryruntimeobject-cocos-renderer.js @@ -0,0 +1,37 @@ +gdjs.TextEntryRuntimeObjectCocosRenderer = function(runtimeObject, runtimeScene) +{ + this._object = runtimeObject; + this._textField = new cc.TextFieldTTF('', cc.size(500,150), cc.TEXT_ALIGNMENT_LEFT,"Arial", 32); + this._textField.setOpacity(0); + + var renderer = runtimeScene.getLayer("").getRenderer(); + renderer.addRendererObject(this._textField, runtimeObject.getZOrder()); + + this.updateString(); +}; + +gdjs.TextEntryRuntimeObjectRenderer = gdjs.TextEntryRuntimeObjectCocosRenderer; //Register the class to let the engine use it. + +gdjs.TextEntryRuntimeObjectCocosRenderer.prototype.ownerRemovedFromScene = function() { + this.activate(false); +}; + +gdjs.TextEntryRuntimeObjectCocosRenderer.prototype.exposeRendererObject = function(cb) { + cb(this._textField); +}; + +gdjs.TextEntryRuntimeObjectCocosRenderer.prototype.getString = function() { + return this._textField.getString(); +} + +gdjs.TextEntryRuntimeObjectCocosRenderer.prototype.updateString = function() { + this._textField.setString(this._object.getString()); +} + +gdjs.TextEntryRuntimeObjectCocosRenderer.prototype.activate = function(enable) { + if (enable) { + this._textField.attachWithIME(); + } else { + this._textField.detachWithIME(); + } +} diff --git a/Extensions/TextEntryObject/textentryruntimeobject-pixi-renderer.js b/Extensions/TextEntryObject/textentryruntimeobject-pixi-renderer.js new file mode 100644 index 0000000000..16f8f2c0f7 --- /dev/null +++ b/Extensions/TextEntryObject/textentryruntimeobject-pixi-renderer.js @@ -0,0 +1,65 @@ +gdjs.TextEntryRuntimeObjectPixiRenderer = function(runtimeObject) +{ + this._object = runtimeObject; + this._pressHandler = function(evt) { + if (!runtimeObject.isActivated()) { + return; + } + + evt = evt || window.event; + var charCode = evt.which || evt.keyCode; + var charTyped = String.fromCharCode(charCode); + + if (charTyped !== undefined && //Skip some non displayable characters + charCode !== 8) { //On Firefox, backspace is considered as a character + runtimeObject.setString(runtimeObject.getString() + charTyped); + } + + if (evt.preventDefault) evt.preventDefault(); + return false; + }; + this._upHandler = function(evt) { + if (!runtimeObject.isActivated()) { + return; + } + + evt = evt || window.event; + var charCode = evt.which || evt.keyCode; + if (charCode === 8) { //Backspace + runtimeObject.setString(runtimeObject.getString().slice(0, -1)); + } + + if (evt.preventDefault) evt.preventDefault(); + return false; + }; + this._downHandler = function(evt) { + evt = evt || window.event; + var charCode = evt.which || evt.keyCode; + + //Prevent backspace from going to the previous page + if (charCode === 8) { + if (evt.preventDefault) evt.preventDefault(); + return false; + } + }; + + document.addEventListener('keypress', this._pressHandler); + document.addEventListener('keyup', this._upHandler); + document.addEventListener('keydown', this._downHandler); +}; + +gdjs.TextEntryRuntimeObjectRenderer = gdjs.TextEntryRuntimeObjectPixiRenderer; //Register the class to let the engine use it. + +gdjs.TextEntryRuntimeObjectPixiRenderer.prototype.ownerRemovedFromScene = function() { + document.removeEventListener('keypress', this._pressHandler); + document.removeEventListener('keyup', this._upHandler); + document.removeEventListener('keydown', this._downHandler); +}; + +gdjs.TextEntryRuntimeObjectPixiRenderer.prototype.updateString = function() { + //Nothing to do. +} + +gdjs.TextEntryRuntimeObjectPixiRenderer.prototype.activate = function(enable) { + //Nothing to do. +} diff --git a/Extensions/TextEntryObject/textentryruntimeobject.js b/Extensions/TextEntryObject/textentryruntimeobject.js index dad9317743..4792ef601b 100644 --- a/Extensions/TextEntryObject/textentryruntimeobject.js +++ b/Extensions/TextEntryObject/textentryruntimeobject.js @@ -4,7 +4,7 @@ */ /** - * The TextEntryRuntimeObject allow to capture . + * The TextEntryRuntimeObject allows to capture text typed on the keyboard. * * @class TextEntryRuntimeObject * @extends RuntimeObject @@ -16,52 +16,10 @@ gdjs.TextEntryRuntimeObject = function(runtimeScene, objectData) this._str = ""; this._activated = true; - var that = this; - this._pressHandler = function(evt) { - if (!that._activated) { - return; - } - - evt = evt || window.event; - var charCode = evt.which || evt.keyCode; - var charTyped = String.fromCharCode(charCode); - - if (charTyped !== undefined && //Skip some non displayable characters - charCode !== 8) { //On Firefox, backspace is considered as a character - that._str += charTyped; - } - - if (evt.preventDefault) evt.preventDefault(); - return false; - }; - this._upHandler = function(evt) { - if (!that._activated) { - return; - } - - evt = evt || window.event; - var charCode = evt.which || evt.keyCode; - if (charCode === 8) { //Backspace - that._str = that._str.slice(0, -1); - } - - if (evt.preventDefault) evt.preventDefault(); - return false; - }; - this._downHandler = function(evt) { - evt = evt || window.event; - var charCode = evt.which || evt.keyCode; - - //Prevent backspace from going to the previous page - if (charCode === 8) { - if (evt.preventDefault) evt.preventDefault(); - return false; - } - }; - - document.addEventListener('keypress', this._pressHandler); - document.addEventListener('keyup', this._upHandler); - document.addEventListener('keydown', this._downHandler); + if (this._renderer) + gdjs.TextEntryRuntimeObjectRenderer.call(this._renderer, this, runtimeScene); + else + this._renderer = new gdjs.TextEntryRuntimeObjectRenderer(this, runtimeScene); }; gdjs.TextEntryRuntimeObject.prototype = Object.create( gdjs.RuntimeObject.prototype ); @@ -70,9 +28,15 @@ gdjs.TextEntryRuntimeObject.thisIsARuntimeObjectConstructor = "TextEntryObject:: gdjs.TextEntryRuntimeObject.prototype.onDeletedFromScene = function(runtimeScene) { gdjs.RuntimeObject.prototype.onDeletedFromScene.call(this, runtimeScene); - document.removeEventListener('keypress', this._pressHandler); - document.removeEventListener('keyup', this._upHandler); - document.removeEventListener('keydown', this._downHandler); + if (this._renderer.ownerRemovedFromScene) { + this._renderer.ownerRemovedFromScene(); + } +}; + +gdjs.TextEntryRuntimeObject.prototype.updateTime = function(elapsedTime) { + if (this._renderer.getString) { + this._str = this._renderer.getString(); + } }; gdjs.TextEntryRuntimeObject.prototype.getString = function() { @@ -81,6 +45,7 @@ gdjs.TextEntryRuntimeObject.prototype.getString = function() { gdjs.TextEntryRuntimeObject.prototype.setString = function(str) { this._str = str; + this._renderer.updateString(); }; gdjs.TextEntryRuntimeObject.prototype.isActivated = function() { @@ -89,4 +54,5 @@ gdjs.TextEntryRuntimeObject.prototype.isActivated = function() { gdjs.TextEntryRuntimeObject.prototype.activate = function(enable) { this._activated = enable; + this._renderer.activate(this._activated); };