『ListView』は、複数のオブジェクトをスクロール付きのリストとして表示することが出来るオブジェクトです。
今回は、『ListView』を使って下図のようなステージ選択画面を作成しました。
『Cocos Studio 2』でオブジェクトの配置とプロパティの設定等を行い、『Cocos Code IDE』でイベントの実装等のコード等を書きます。
目次
- 目次
- 使用環境
- 作成する内容
- 作業手順(Cocos Studio 2)
- 作業手順(Cocos Code IDE)
- ListViewのメソッド
- あとがき
使用環境
- Mac OS X El Capitan Version 10.11.3
- Cocos2d-x Version 3.9(Javascript)
- Cocos Studio 2 Version 2.3.3
- Cocos Code IDE Version Version 1.2.0
作成する内容
実装内容
- 『ListView』で『ImageView』をステージ選択用のパネルとしてリスト表示する
- パネルに、ビットマップフォントでステージの番号、難易度を表示する
- パネルにNewの文字のアニメーションを表示する
- タッチしたパネルのステージ番号を上部の『Label』に表示し、Newの表示を消す
- 『ListView』のスクロール位置をトップに移動させるボタンを作成する
作業手順(Cocos Studio 2)
1.使用するデータを準備
- 下記のリンク先のページ内の『Raw』を右クリックして、『リンク先を別名で保存』をクリック
https://github.com/githubmorley/blog-files/blob/master/160317/resources.zip - ダウンロードした『resources.zip』をダブルクリックで解凍
『resources』フォルダには、下記のファイルが含まれています。
- panel.png
- new_0.png
- new_1.png
- new_2.png
- new_3.png
- new_4.png
- fontCaption.fnt
- fontCaption.png
- fontStage.fng
- fontStage.png
捕捉:『panel.png』の作成方法
下記の記事で、作成方法を説明しています。
捕捉:『font~~.fnt』、『font~~.png』の作成方法
このファイルそのものを作成する方法ではありませんが、下記の記事で、作成するソフトとその使い方を説明しています。
2.Cocos Studio 2を起動
- 『/Applications/Cocos/Cocos Studio 2』を起動
3.新規プロジェクトを作成
- アプリケーションメニューの『File』-『New Project...』をクリック
- 開いたウィンドウで『All』の『Cocos Project』を選択し、『Next』をクリック
- 次のように設定を行った後、『Finished』をクリック
- 『Project Name(プロジェクト名)』:HelloCocos_ListView(任意の名前)
- 『Project Path(プロジェクトの保存先)』:(任意のフォルダ)
- 『Orientation(画面の向き)』:『縦向きの画面のアイコン』を選択
- 『Engine Version(Cocos2d-xのバージョン)』:『cocos2d-x-3.9』を選択
- 『Project Language(使用するプログラミング言語)』:『JavaScript』を選択
4.データのインポート
- 画面左下の『Resources』ウインドウ内で右クリックし、『Import Resources...』をクリック
- 手順1で準備した全てのファイルを選択し、『Open』をクリック
5.スプライトシートの作成
6.ListViewの配置
- 『Canvas』上部の『MainScene.csd』のタブをクリックし、『MainScene.csd』の編集に戻る
- 画面左上の『Objects』ウインドウの『Containers』の『Listview』を『Canvas』にドラッグ&ドロップ
- 画面右の『Properties』ウインドウで『Listview』のプロパティを下記のように変更
*書いていないパラメータは変更していません。グループ プロパティ名 値 - Name ListView Position & Size Anchor Point X 0.5、Y 0.5 Position X 320、Y 480 Size X 500、Y 500 Feature Clipping チェックを入れる Bounce Back チェックを入れる Child Alignment Align Horizontal Center Child Spacing 30 Color #000000
7.パネル用のImageViewを配置
- 『Objects』ウインドウの『Widgets』の『Image』を画面下部の『Animation』ウインドウの『ListView』上にドラッグ&ドロップ
- 『Properties』ウインドウで『Image』のプロパティを下記のように変更
*書いていないパラメータは変更していません。
*『Image Resource』を最初に登録して下さい。(9-Sliceが画像に合わせて調整されます。)グループ プロパティ名 値 - Name ImagePanel_0 Position & Size Size X 480、Y 110 General Touchable チェックを入れる 9-Slice 9-Slice チェックを入れる Feature Image Resource panel.png(『Resources』ウインドウから
ドラッグアンドドロップして登録)
8.ステージ番号表示用のBitmapLabelを配置
- 『Objects』ウインドウの『Widgets』の『BitmapLabel』を『Animation』ウインドウの『ImagePanel_0』上にドラッグ&ドロップ
- 『Properties』ウインドウで『BitmapLabel』のプロパティを下記のように変更
*書いていないパラメータは変更していません。グループ プロパティ名 値 - Name BitmapFontLabelStage Position & Size Position X 330、Y 55 Feature Font File fontStage.fnt(『Resources』ウインドウから
ドラッグ&ドロップして登録)Text ステージ:01
9.難易度表示用のBitmapLabelを配置
- 『Objects』ウインドウの『Widgets』の『BitmapLabel』を『Animation』ウインドウの『ImagePanel_0』上にドラッグ&ドロップ
- 『Properties』ウインドウで『BitmapLabel』のプロパティを下記のように変更
*書いていないパラメータは変更していません。グループ プロパティ名 値 - Name BitmapFontLabelLevel Position & Size Anchor Point X 0、Y 0 Position X 30、Y 22 Feature Font File fontCaption.fnt(『Resources』ウインドウ
からドラッグ&ドロップして登録)Text 難易度:★★★
作業後、『Animation』ウインドウは下図のようになります。
10.パネルの複製
パネルをコピーして全部で6ステージ分のパネルを作成します。
- 『Animation』ウインドウで『ImagePanel_0』を右クリックし、キーボードの『command + c』を押下してコピー
- キーボードの『command + v』を5回押下して、パネルを5つ複製
- 複製してできた『ImagePanel_0_0』〜『ImagePanel_0_4』の名前を『ImagePanel_1』〜『ImagePanel_5』に変更
作業後、『Animation』ウインドウは下図のようになります。
11.選択したステージ番号表示用のラベルを配置
- 『Objects』ウインドウの『Widgets』の『Label』を『Canvas』にドラッグ&ドロップ
- 『Properties』ウインドウで『Label』のプロパティを下記のように変更
*書いていないパラメータは変更していません。グループ プロパティ名 値 - Name LabelStage Position & Size Position X 320、Y 840 Feature Text ステージ:01 Font Style #000000、48
12.トップへ移動用ボタンを配置
13.NodeNew.csdの作成
Newの文字のアニメーションを含んだノードを作成します。
- アプリケーションメニューの『File』-『New File...』をクリック
- 開いたウインドウで、下記のように設定し、『New』をクリック
- 『Type』:Node
- 『Name』:NodeNew
14.アニメーションの作成
- 『Resources』ウインドウで、『new_0.png』〜『new_4.png』の5枚の画像をクリックして同時選択(キーボードの『command』を押しながら選択)して右クリックし、『Create SpriteSheet Animation...』をクリック
- 開いたウインドウで下記のように設定し、『OK』をクリック
- 『Start』:0
- 『Spacing』:1
- 『Append the first frame as end frame』:チェックを入れる
- 『Animation』ウインドウで、『FPS』を10に設定
- 『Animation』ウインドウで、『+』ボタンをクリック
- 開いたウインドウで下記のように設定し、『OK』をクリック
- 『Name』:animation
- 『Start Frame』:0
- 『End Frame』:15
15.保存
これまでの作業を保存します。
- アプリケーションメニューの『File』-『Save All』をクリック
作業手順(Cocos Code IDE)
1.『resource.js』にリソースファイルを登録
- 『Cocos Code IDE』の画面左の『Explorer』で、『srcフォルダ』にある『resource.js』をダブルクリックして開く
- 『resource.js』に、下記のようにリソースファイルを登録
var res = { HelloWorld_png : "res/HelloWorld.png", MainScene_json : "res/MainScene.json", NodeNew_json : "res/NodeNew.json", // Newの文字のアニメーションのノードファイル Plist_plist : "res/Plist.plist", // スプライトシートのplistファイル Plist_png : "res/Plist.png" // スプライトシートの画像ファイル };
2.『app.js』の編集
『HelloWorldLayer』を下記のように編集します。
var HelloWorldLayer = cc.Layer.extend({ // cc.Layerを継承 ctor:function () { // コンストラクタ this._super(); // 親クラスのメソッドを継承 var mainscene = ccs.load(res.MainScene_json); // MainSceneのJSONファイルを読み込む this.addChild(mainscene.node); // レイヤーに追加 // ステージ番号、難易度、Newの表示 var listView = mainscene.node.getChildByName("ListView"); // ListViewを取得 var imagePanel = listView.getItems(); // パネルの配列を取得 for (var int = 0; int < imagePanel.length; int++) { // パネル数分ループ // ステージ番号表示 var labelStage = imagePanel[int].getChildByName("BitmapFontLabelStage"); // ステージ番号表示用のLavelを取得 labelStage.setString("ステージ:" + ("0" + (int + 1)).slice(-2)); // ラベルにステージ番号を表示、slice(-2):右から2文字切り出す // 難易度表示 var labelStage = imagePanel[int].getChildByName("BitmapFontLabelLevel"); // 難易度用のLabelを取得 var strLevel = "難易度:★"; // 難易度の文字列を作成 var count = Math.floor(int / 2); // 2ステージごとに1カウントを増やす for (var int2 = 0; int2 < count; int2++) { // カウント数分ループ strLevel += "★"; // ★を追加 } labelStage.setString(strLevel); // ラベルに表示 // Newのアニメーションを表示 var nodeNew = ccs.load(res.NodeNew_json); // NodeNewのJSONファイルを読み込む nodeNew.node.runAction(nodeNew.action); // アニメーションを設定 nodeNew.action.play("animation", true); // アニメーションを再生 nodeNew.node.setPosition(115, 75); // 位置を設定 nodeNew.node.setTag(10); // タグを設定(後で取得するため) imagePanel[int].addChild(nodeNew.node); // パネルに追加 } listView.addEventListener(function(list, type){ // ListViewのイベントを設定 switch (type) { case ccui.ListView.ON_SELECTED_ITEM_START: // アイテムにタッチ開始時; break; case ccui.ListView.ON_SELECTED_ITEM_END: // アイテム選択時(タッチ後スクロールせずに手を離した場合) labelStage.setString("ステージ:" + ("0" + (list.getCurSelectedIndex() + 1)).slice(-2)); // 選択したステージ番号を表示 var nodeNew = imagePanel[list.getCurSelectedIndex()].getChildByTag(10); // Newのオブジェクトを取得 nodeNew.setVisible(false); // Newを非表示にする break; } }, this); var labelStage = mainscene.node.getChildByName("LabelStage"); // 現在のステージ数ラベルの取得 var buttonTop = mainscene.node.getChildByName("ButtonTop"); // トップへ戻るボタンを取得 buttonTop.addTouchEventListener(function(sender, type){ // ボタンイベントを設定 switch (type) { case ccui.Widget.TOUCH_ENDED: // ボタンを離した時 listView.scrollToTop(0.5, true); // リストのトップにスクロールする(0.5秒、速度減衰有り) break; } }, this); return true; } });
以上で、作成作業は完了です。
実行して動作を確認してください。
ListViewのメソッド
メソッドの一部です。
『ListView. setDirection(スクロール方向)』
機能 | ListViewの内部の表示位置を一番上にスクロールします。 |
---|---|
引数 | スクロール方向:次の定義済みの値を設定 ccui.ScrollView.DIR_VERTICAL:縦方向 ccui.ScrollView.DIR_HORIZONTAL:横方向 |
『ListView. setGrabity(項目の位置)』
機能 | ListViewの内部の項目の位置(右寄せ等)を設定します。 |
---|---|
引数 | スクロール方向:次の定義済みの値を設定 ccui.ListView.GRAVITY_LEFT:左寄せ ccui.ListView.GRAVITY_RIGHT:右寄せ ccui.ListView.GRAVITY_CENTER_HORIZONTAL:中央寄せ |
『ListView.jumpToTop()』
機能 | ListViewの内部の表示位置を一番上に移動します。 同様にjumpToBottom ()、jumpToLeft ()、jumpToRight ()が有ります。 |
---|
『ListView. scrollToTop(移動移動時間[秒], 速度の減衰の有無)』
機能 | ListViewの内部の表示位置を一番上にスクロールします。 同様にscrollToBottom ()、scrollToLeft ()、scrollToRight ()が有ります。 |
---|---|
引数1 | 移動時間[秒]:浮動小数点値 |
引数2 | 速度の減衰の有無:boolean値(true:減衰有り、false:減衰無し) |
あとがき
今回は、以前このブログで作成方法を紹介した画像を使用しました。
Newの文字のアニメーションは、最初に下記の方法でやってみたのですが、表示がおかしくなるので諦めました。
mmorley.hatenablog.com