スキップしてメイン コンテンツに移動

cocos2d-js 3.0 rc1 で MenuItemSprite と LabelTTF を組み合わせた簡易ボタンの作成

簡易ボタンの作成関数を作った

cocos2d-js ではボタンを作る際に Menu と MenuItem を使うことがあります。


他にボタンのクラスもありますが、イベント処理の設定など MenuItem のほうが使い勝手が良いように思います。


 


MenuItemImage でボタン用の画像を読み込んで作っていたのですが、いちいちボタンの文字を画像として入力するのはとても面倒でした。


例えば、同じ背景なのに「ヘルプ」と「閉じる」という名前の違いだけで画像を2種類も作らないといけないのは手間がかかります。


 


そこで、背景画像の上にラベルを重ねたボタンを作りました。


f:id:SakuraCrowd:20140901195726p:plain


絵心があまりありませんが、がんばって茶色いボタンの背景画像を書きました。


茶色いボタンの背景として通常(normal), 押下(selected),非活性(disabled)で用意します。


背景画像には「閉じる」のような文字列は書かれていません。


文字列はボタン作成関数で指定します。


サイズも実行時に指定できるので、ひとつベースの背景画像があればいろいろなサイズでいろいろなテキストを付加して利用できます。


var button = mcclib.createImageLabelButton(
function(sender){
window.alert("button pushed");
},
"閉じる", cc.size(50, 30), "Arial", 12, cc.TEXT_ALIGNMENT_CENTER, cc.TEXT_ALIGNMENT_CENTER,
res.gui_button_normal_png, res.gui_button_selected_png, res.gui_button_disabled_png);
this.addChild(button, 10000);
view raw example.js hosted with ❤ by GitHub
/// 画像を読みこみ指定されたサイズのスプライトを作成します。
/// @param {string} path 画像のファイルパスです。
/// @param {cc.Size} size スプライトのサイズです。画像はこのサイズに拡大縮小されます。
/// @returns {cc.Sprite} 作成したスプライトです。
mcclib.createSprite = function(path, size) {
var sprite = cc.Sprite.create(path);
if (size != undefined) {
var beforeSize = sprite.getContentSize();
sprite.setScale(size.width / beforeSize.width, size.height / beforeSize.height);
sprite.setContentSize(size);
}
return sprite;
};
/// ボタン用の背景画像とラベルを組み合わせたボタンを作成します。
/// @param {function} onButton ボタン押下時のイベントです。
/// @param {string} title ラベルに表示する文字列です。
/// @param {cc.Size} size ボタンの大きさです。 undefined ならば読み込んだ画像のサイズです。
/// @param {string} fontName ラベルに表示する文字列のフォント名です。既定値は Arial です。
/// @param {number} fontSize ラベルに表示する文字列の大きさです。既定値は 12 です。
/// @param {number} hAlign ラベルの文字列の水平方向の寄せ方です。既定値は cc.TEXT_ALIGNMENT_CENTER です。
/// @param {number} vAlign ラベルの文字列の垂直方向の寄せ方です。既定値は cc.TEXT_ALIGNMENT_CENTER です。
/// @param {string} normalImagePath ボタンの通常時の画像のファイルパスです。
/// @param {string} selectedImagePath ボタンが押されたときの画像のファイルパスです。
/// @param {string} disabledImagePath ボタンが無効なときの画像のファイルパスです。
/// @returns {cc.Menu} 作成されたボタンです。
/// @example
/// var button = mcclib.createImageLabelButton(
/// function(sender){
/// window.alert("button pushed");
/// },
/// "タイトル", cc.size(200, 100), "Arial", 12, cc.TEXT_ALIGNMENT_CENTER, cc.TEXT_ALIGNMENT_CENTER,
/// res.gui_button_normal_png, res.gui_button_disabled_png, res.gui_button_disabled_png);
/// this.addChild(button);
mcclib.createImageLabelButton = function(onButton, title, size, fontName, fontSize, hAlign, vAlign, normalImagePath, selectedImagePath, disabledImagePath) {
// 引数の調整
fontName = fontName || "Arial";
fontSize = fontSize || 12;
hAlign = hAlign || cc.TEXT_ALIGNMENT_CENTER;
vAlign = vAlign || cc.TEXT_ALIGNMENT_CENTER;
normalImagePath = normalImagePath || res.gui_button_normal_png;
selectedImagePath = selectedImagePath || res.gui_button_selected_png;
disabledImagePath = disabledImagePath || res.gui_button_disabled_png;
// メニューアイテムの作成
var menuitem = new cc.MenuItemSprite();
menuitem.onButton = onButton;
var normalSprite = mcclib.createSprite(normalImagePath, size);
var selectedSprite = mcclib.createSprite(selectedImagePath, size);
var disabledSprite = mcclib.createSprite(disabledImagePath, size);
menuitem.initWithNormalSprite(
normalSprite,
selectedSprite,
disabledSprite,
menuitem.onButton, menuitem);
// ラベルの作成
var label = cc.LabelTTF.create(title, fontName, fontSize, size, hAlign, vAlign);
var menuitemSize = menuitem.getContentSize();
label.setPosition(menuitemSize.width / 2, menuitemSize.height / 2);
label.setContentSize(menuitemSize);
menuitem.addChild(label);
var menu = cc.Menu.create(menuitem);
return menu;
};


gist222c8099d1427be0b905


 


その他の近況

NPC の会話処理は、ある範囲に入ったらプレイヤーが会話を選択できるようにする処理を作りました。


ごちゃごちゃしてきたのでシーケンス図にまとめたいと思っています。


今は会話そのものを表現するための GUI 部品を cocos2d のクラスを継承して作っています。


今日紹介した関数もその一環で作りました。


 


TMX のタイルの隙間に関する対策はまだできていません。


サンプルでは正しく表示されている tmx でも、自分のプログラムに移すと隙間ができてしまうので、プログラムの問題なのですが、位置やサイズを整数にしたりプロジェクションの設定を2Dにしただけではうまくいかず、こちらは気長に少しずつ調べようと思います。


 


コメント

このブログの人気の投稿

QTableView で表を表示してみる

タイトルは駄洒落を狙っているわけではありません。 こんばんわ SakuraCrowd です。 今回は今作っているソフトの経過報告です。 最近のブログのパターンは、 「XXX作ったよ。これがスクリーンショットね。あとこんなこと思ったよ。」 という流れですが、 今日はできていないソフトの部分的な話なので、 いつもよりもプログラムちっくな話になると思います。(´Ծ_Ծ´)メガネノトキハマジメブッテル QTableView は GUIライブラリ Qt のクラスです。 それを Python で使うための PySide というライブラリを使っています。 某表計算ソフト っぽい表の GUI です。 このデータの日付が 09/01 なのでおそらくその日に   QTableView 使うぞ!(`・ω・´) とサンプルデータを作ったのでしょう。 Qt Designer という GUI エディタを使うとポトペタでウィンドウを設計できます。 選択できる GUI の中に QTableView と QTableWidget があります。 どちらも上のような表の GUI です。 QTableWidget は 簡単 に値をいれたりできます。 Qt Designer 上で直接編集 することができるので、 サンプルの表を簡単に作ることができます。 それに対して、 QTableView は Qt Designer 上では値を編集できません。たぶん。 QTableView の強みは MVC の構造 を使えることです。 名前のとおり QTableView は View です。 これにデータを管理している Model オブジェクトを設定して使います。 Model クラスを作る手間がかかりますが、 GUI の細かな操作をしなくても Model に応じた表を表示してくれます。 Model は QAbstractTableModel を 継承 して作ります。 コンストラクタで基底クラスの処理を呼び出し、いくつかの純粋仮想関数をオーバーライドします。 def __init__ ( self , parent= None , *args):...

HSPで画像の重ね合わせをしてみた

あいにくの曇り空だったが、 スーパームーン を少し見ることができた。 なんとなくだが、月明かりがいつもよりも強い気がする。 中秋の名月とほぼ同時に月が地球に 接近するのは稀らしいので何かありがたい(-人-) 先週ブログを書いていたときに、 ハロウィン にちなんだゲームを作りたいなー と思っていて、ふわっとした企画を考えて、少し作り始めた。 まだできるかどうかわからないけど、初めて HSP で絵を出せたのがうれしいのでブログを書いてみる。 HSP 自体はだいぶ前から知っていて、ちょっとしたGUIのツールを作ったりしていた。 GUIアプリケーションをここまで短く実装できる言語は自分の中ではこれが一番だと思う。 もっと短くできるかもしれないが、ビギナーな私でもこのくらい短くかける。 screen 0, 160, 64 // ウィンドウ作成 button "greet", *OnGreet // ボタン作成&イベント関連付け stop *OnGreet // イベント dialog "Hello!" stop バージョンアップして今では WebGL や  iOS や Android でも実行できる。 そのときは HSP3Dish という環境を使うために  #include "hsp3dish.as"  でスクリプトを読み込む。  参照: HSP3Dish プログラミングマニュアル・基本仕様ガイド 制限として、拡張プラグインやCOM/Variant型や外部DLL呼び出しやモジュール変数については未サポートのようだ。 ゲームでスプライトを用いるため es_set などのスプライト用の関数を使いたかったが、これは hspdx という拡張プラグインなので HSP3Dish には対応していないと思う。 そんな理由から、スプライト系の処理を自作しようと思う。 先週ちまちまとドット絵を描いたので、それを HSP のウィンドウに描画してみた。 なんかドット絵を作っている最中は、わりと良く思えたのに、 ウィンドウに出してみると何か微妙 (´・ω・`) ちなみに、キャラは4コマにも描いている大砲ゲーム「お団子キャノン」に出てくるキャラクターだ。 キャラの...

LibreOffice Writer 文書の差分 (WinMerge x TortoiseGit) + 社畜PCの原因と対策

お久しぶりです。皆様におかれましてはお風邪などをひかれてはいませんでしょうか。 春と秋だけあればいいのにヽ(`Д´)ノとつい思ってしまう SakuraCrowd です。 今日はいつものような製作日記ではなく、ちょっとした役立つメモを書きました。 タイトルにもあるとおり、 TortoiseGit への WinMerge の導入の仕方です。 今まではソースコードくらいしか差分で確認しなかったので、 TortoiseGit 標準の Diff ツールで問題なかったのですが、 LibreOffice の Writer が最近自分の中で便利だと話題になっていて、それを差分表示するためにちょっと調べてみました。 #Writer は、文章書いて、ちょっと絵をいれたり表を作るのに便利だと思います。 #リッチテキストのエディタを探していて、これが一番よさそうな気がしたので使ってます。 それとブログを書くときはあまり長く書かないつもりだった、 Win7 PC が社畜PCになってしまった際の原因と対策も後半に書きました。割と有用な情報かもしれませんので、時間がありましたらご覧下さい。 まずは TortoiseGit で Writer の odt ファイルを管理して、差分も普通に表示させる方法です。 WinMerge(+plugin) 導入手順 すでに TortoiseGit はインストールしてある前提ではなします。 1.信頼と実績の窓の杜様から WinMerge 日本語版をダウンロードします。 WinMerge - 窓の杜ライブラリ 私の PC は 64 ビット版なのでそちらを選びました。 2.WinMerge をインストールします。 フォルダを指定し普通にインストールできます。 インストール直前の設定で TortoiseGit をチェックしておくと自動的に TortoiseGit の利用する Diff ツールの設定を置き換えてくれるようです。 これの設定は TortoiseGit の設定の Diff ツールの項目で確認できます。 3.LibreOffice Writer のファイルを読むためのプラグインをダウンロードします。 ぐぐって出てくる英語版のDLサイトは応答がなかったりしましたが、日本...