Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

51
Cocos2d-x(JS) ハンズオン #8 様々な画像描画方法 株式会社TKS2 清水友晶

Transcript of Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Page 1: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Cocos2d-x(JS)ハンズオン #8

様々な画像描画方法

株式会社TKS2 清水友晶

Page 2: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

清水 友晶 株式会社TKS2

アプリ開発コンサルCocos2d-xサポートスマホアプリ開発TECH.C.非常勤講師

プライベートでもCocos2d-xに関するゲーム開発講演活動執筆活動

マイブーム: ゲームエンジン調査

チラ裏開発メモ: http://tks2.net/memo

SlideShare: http://www.slideshare.net/doraemonsss

Facebook: http://www.facebook.com/doraemonsss

Page 3: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Page 4: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

http://line.me/S/sticker/1085672

Page 5: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像表示

画像描画クラス

テクスチャアトラス

Scale9Spriteクラス

Sprite Porygonクラス

非同期読み込み

Page 6: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像のダウンロード 今回使用する画像をダウンロードしてください

http://tks2.net/techc/images2.zip

Page 7: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

resource.js

var res = {

HelloWorld_png : "res/HelloWorld.png",

Apple_png : "res/apple.png",

Bug_png : "res/bug.png",

Frame_png : "res/frame.png",

Apple_And_Bug_plist : "res/AppleAndBug.plist"

};

Page 8: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像描画クラス

Page 9: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

デバッグ情報

Page 10: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

デバッグ情報

GL verts … 頂点数

GL calls … ドローコール

FPS / フレーム時間

Page 11: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像描画this._super();

//画面サイズ取得var size = cc.winSize;

//リンゴの表示var apple = new cc.Sprite(res.Apple_png);

apple.setPosition(size.width / 3, size.height / 2);

this.addChild(apple);

//虫の表示var bug = new cc.Sprite(res.Bug_png);

bug.setPosition(size.width * 2 / 3, size.height / 2);

this.addChild(bug);

return true;

Page 12: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite描画

Page 13: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像描画

GL verts: 12

GL calls: 2

画像を表示することで、頂点数・コール数が増える

Page 14: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像描画

Page 15: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

同一画像による複数スプライト

this._super();

//画面サイズ取得var size = cc.winSize;

//50個のリンゴを表示for (var i = 0; i < 50; i++) {

var x = cc.random0To1() * 960;

var y = cc.random0To1() * 640;

var apple = new cc.Sprite(res.Apple_png);

apple.setPosition(x, y);

this.addChild(apple);

}

return true;

Page 16: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

複数スプライト描画

Page 17: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

複数スプライト描画

GL calls: 1

異なる画像を表示するとコール数が増えるが、同一画像の場合は、コール数は増えない

Cocos2d-x v3.xよりバッチノードが自動で適用されるようになったため

Page 18: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

ディズニーツムツム

https://www.youtube.com/watch?v=e9ei52IOs9Y

Page 19: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラス

Page 20: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャに使用する画像 画像を画面に表示するとき、画像はビデオメモリ上

(VRAM)に展開される

GPUメモリ上に展開される画像のサイズ

2のべき乗1, 2, 4, 8, 16, 32, 64, 128,256, 512, 1024, 2048, 4096, …

例:画像 960px * 640px

VRAM上 1024px * 1024px

Page 21: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラス 複数の画像を1つにまとめたもの

メモリの節約

CPUの処理が高速

Cocos2d-xの場合、設定ファイル(plist)とセット

Page 22: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラスの注意 同じグループの画像を1つにまとめる

1つの画面で使用するパーツ画像

アニメーションで使用する複数画像

無関係な画像を1つにまとめない

場合によっては、1枚の小さな画像を読み込むだけなのに、大きなテクスチャアトラスを読み込む必要がある

カードゲームなどの場合、カードをテクスチャアトラスにまとめない

最大サイズは2048px * 2048pxが適切

古い端末の場合、4096pxを読み込めない

Page 23: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラス生成

Page 24: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラス生成

Page 25: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラスによる描画this._super();

//画面サイズ取得var size = cc.winSize;

//テクスチャアトラスの読み込みcc.spriteFrameCache.addSpriteFrames(res.AppleAndBug_plist);

//リンゴの表示var apple = new cc.Sprite();

apple.initWithSpriteFrameName("apple.png");

apple.setPosition(size.width / 3, size.height / 2);

this.addChild(apple);

//虫の表示var bug = new cc.Sprite();

bug.initWithSpriteFrameName("bug.png");

bug.setPosition(size.width * 2 / 3, size.height / 2);

this.addChild(bug);

return true;

Page 26: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

テクスチャアトラスによる描画

Page 27: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像描画

GL verts: 12 12

GL calls: 2 1

テクスチャアトラスの利用により、コール数が減っている

Page 28: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

SpriteFrameCacheクラス テクスチャアトラスを管理する

テクスチャアトラスの読み込み

addSpriteFramesWithFile関数

テクスチャアトラスの解放

removeSpriteFrames関数

removeSpriteFrameWithFile関数

注意

Spriteクラスによるテクスチャの変更には注意すること

Page 29: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Texture Packer

Page 30: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Scale9Spriteクラス

Page 31: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像拡大

this._super();

//画面サイズ取得var size = cc.winSize;

//フレームの表示var frame = new cc.Sprite(res.Frame_png);

frame.setPosition(size.width / 2, size.height / 2);

frame.setScale(40, 10);

this.addChild(frame);

return true;

Page 32: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

画像拡大

Page 33: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Scale9Spriteクラス

Page 34: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Scale9Spriteクラスによる画像拡大

this._super();

//画面サイズ取得var size = cc.winSize;

//フレームの表示var frame = new cc.Scale9Sprite(res.Frame_png);

frame.setPosition(size.width / 2, size.height / 2);

frame.setContentSize(size.width / 2, size.height / 2);

this.addChild(frame);

return true;

Page 35: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Scale9Spriteクラスによる画像拡大

Page 36: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite Polygon

Page 37: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite Polygon 画像をポリゴン化し、描画コストを少なくする

Page 38: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite Polygonクラスthis._super();

//画面サイズ取得var size = cc.winSize;

//リンゴの表示var pinfo1 = jsb.AutoPolygon.generatePolygon(res.Apple_png);

var apple = new cc.Sprite(pinfo1);

apple.setPosition(size.width / 3, size.height / 2);

this.addChild(apple);

//虫の表示var pinfo2 = jsb.AutoPolygon.generatePolygon(res.Bug_png);

var bug = new cc.Sprite(pinfo2);

bug.setPosition(size.width * 2 / 3, size.height / 2);

this.addChild(bug);

return true;

Page 39: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite描画

Page 40: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite描画

Page 41: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Texture Packer

Page 42: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Texture Packer

Page 43: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

非同期読み込み

Page 44: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

大型プロジェクトの場合

テクスチャアトラスを用い、テクスチャロード時間の短縮を行っても、テクスチャアトラスの枚数が多ければ、ユーザビリティは悪いまま

しかし画像を読み込み終えなければ、その画像を表示することはできない

テクスチャアトラスを使ってもなおユーザビリティが改善されない場合、画像の非同期読み込みの導入が要求される

ただし非同期読み込みを行う場合、設計の変更が発生する可能性があるため、事前に非同期読み込みの仕組みを理解し、設計に影響を与えないような作りとする

Page 45: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

ドラゴンスラッシュ

https://www.youtube.com/watch?v=mIT7qqYp68s

Page 46: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

非同期読み込みによる描画

this._super();

//画像の読み込みcc.textureCache.addImageAsync("res/apple.png",

this.loadingCallback, this);

cc.textureCache.addImageAsync("res/bug.png",

this.loadingCallback, this);

return true;

Page 47: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

非同期読み込みによる描画

loadingCallback:function (texture) {

//画面サイズ取得var size = cc.winSize;

//画像の表示var x = cc.random0To1() * 960;

var y = cc.random0To1() * 640;

var sprite = new cc.Sprite(texture);

sprite.setPosition(x, y);

this.addChild(sprite);

}

Page 48: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

Sprite描画

Page 49: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

作業はここまで

Page 50: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

参考になるサイト

Cocos公式Wikihttp://www.cocos2d-x.org/wiki/Cocos2d-JS

Cocos2d-JS APIリファレンスhttp://cocos2d-x.org/wiki/Reference

Qiita(tag: cocos2d-js)https://qiita.com

Page 51: Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」

おわり

ありがとうございました