きょこみのーと

技術に関係ないほうのブログ

Cocos Studio v2をCocos2d-x3.3rc0で使ってみたメモ

ただのメモです。 あとで追記とかするかもです。

Cocos Studio v2.0.0.0beta0(for Mac)を使ってハマったことや、バグってるぽい箇所、v1.6.0.0で出来たことができないとかのメモ。

.csbと.csdをcocos2d-xで読み込む方法

  • .csd: CocosStudio ドキュメント?(XMLっぽいファイル)
    • CocosStudioでイジるのはこっち
  • .csb: CocosStudio バイナリ?(バイナリmsgパック?)
    • Publishすると吐出されるのがこっち

検証したのは、cocos2d-x3.3rc0です。

.csd

cocos2d::Node *node = CSLoader::getInstance()->createNodeFromXML("HogeScene.csd");
this->addChild(node);

.csb

cocos2d::Node *node = CSLoader::getInstance()->createNodeFromProtocolBuffers("HogeScene.csb");
this->addChild(node);

良くなった点

  • Macで作ったやつがcocos2d-xを改造しなくても読み込める
  • 色々バグってたのが直ってる(Labelまわりとか)

色々あるんだけど、ぱっと思いつかない。。。

v1.6.0.0で出来たのに〜

  • ListViewが使えない
    • Node配置して自分でListView::createして〜ってやってみたけど設定多すぎて辛い。現実的じゃない
    • 2014/12/30追記:一応v2.0.6からListViewが配置可能になった。しかし、ソースコードで動的にListViewの中身に配置する際にListの要素がWidgetクラスじゃないとダメなので結局そこはv1.6を使わないといけない・・・
  • ルートノードにAdaptive Resolutionを指定できない
  • Sizeに%を指定してもCocosStudio上で指定した画面サイズの%にしかならない
    • Cocos2d-xで実際のDesignResolutionSizeを使用してくれない

バグっぽい

  • publishしたcsbを読み込むとLabelに設定したOptionsがui::Text反映されない
  • SceneのサイズがcontentSizeに反映されない(昨日PRして今日マージ済み)
  • CocosStudioプロジェクト下にディレクトリを作成して、ディレクトリ内のNodeから別のcsdを参照するとパスがおかしくなる
    • hoge/HogeParts.csdからfuga/FugaParts.csdを参照する場合、hoge/fuga/FugaParts.csdを探してみつからない感じになってる
  • LabelのAutoAdjustがうまく効いてない時がある(最後の1文字が消える)
    • とりあえず、AutoAdjustやめてSizeを設定すれば大丈夫

2014/11/23追記:

  • CocosStudio v1.6の時とかは設定できたZOrderがv2では設定不要になっているが、v1.6をimportすると隠しパラメータとして設定されているため、Layerの順番をどうやって変えても重なってしまう問題が起こる
    • Vimとかで直接.csdを開いてZOrder=1とかを全部削除すれば解消されます

注意点

  • %でPositonやSizeを指定したNodeやPanelをコピペすると%が解除されてpxになる
    • ひどいお。。。
  • .csd間でNodeとかPanelをコピペできない(辛い)
    • Vimとかで直接開いて〜ってやればできそうなので、次バージョンで対応オナシャス!!!
    • 2014/12/7追記: Cut&Pasteを右クリックで行うと擬似コピー可能という裏ワザを発見
    • 2015/1/12追記: v2.0.6で擬似コピー裏ワザ使えなくなった。。。バグ扱いで消えたか...
  • UIEditorでつくったプロジェクトをv1.6.00のimportできるが、全部Node扱いになる(変更できない)
    • 厳密にいうと直接.csdファイルをvimとかで開いてSceneにすればOK
    • NodeのままだとAnchor周りの問題がおきる
  • new Fileで作ったLayerは途中でサイズ変更できない
    • vimとかで直接csdを開いてSizeをいじればなんとかなる
  • Mac版だけかもしれないけど、名前入力中に勝手に半角スペースが挿入される時がある

メモ

  • Scale 9 Gridの設定の仕方が変わってる
    • 引き伸ばさない部分のRectをpxで指定する感じになってる(Top, Bottom, Left, Right)
  • マウスのスクロールで拡大縮小制御するには、「Preferences」 -> 「Mouse」 -> Disable mouse wheel zoomのチェックを外す
  • AnimationEditorで作ったやつのimportもできる
    • SpriteFrameの切り替えが、それぞれSpriteが追加されてvisibleで切り替えたtimelineが作られる
  • plistとpngのセットになったSpriteSheetもResourcesにimportできる

その他

publish先変える方法Qiitaに書いたけど、上記のバグ?でTextのOptionが読めてないから使ってない。2014/12/6追記: Cocos2d-x3.3rc1では直ってます)

今はプロジェクト直下にpublis.shを作って、CocosStudioで編集したら実行して.csdを自分でrsyncしてる。2014/12/6追記: Cocos2d-x3.3rc1では直ってるので、普通にpublishしてます)

publish.sh

rsync -a --delete cocosstudio/ Resources/

ちょいちょい追記します。

Cocos2d-xで縦横いい感じのDesignResolutionSizeを指定する

以前の記事「Cocos2d-xでいい感じのDesignResolutionSizeを指定する」が縦画面の時にいい感じにならなかったので、調整しました。

環境

  • Cocos2d-x3.3rc0
  • CocosStudio 1.6.0.0(windows
  • Xcode6.1

ソースコード

使い方

上記のソースを丸コピーもしくはダウンロードしてプロジェクトに追加し、AppDelegate.cppで呼び出します。

AppDelegate.cpp

#include "AppDelegate.h"

#include "GLViewUtil.h"

USING_NS_CC;

// 〜省略〜

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::create("My Game");
        director->setOpenGLView(glview);
    }

    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // ★横640は維持して640x960比率でフィットした画面にする(縦横の黒棒をなくす)
    auto fitSize = GLViewUtil::calcFitDesignResolutionSize(640, 960, GLViewUtil::FitType::WIDTH);
    glview->setDesignResolutionSize(fitSize.width, fitSize.height, ResolutionPolicy::SHOW_ALL);

    // create a scene. it's an autorelease object
    auto scene = HelloWorld::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

// 〜省略〜

CocosStudio側の配置

拡大時もいい感じの位置に配置するためには、以下を行います。

  • RootNodeのPanelでAdaptive ResolutionチェックボックスをONにする
  • CocosStudio上で全部%でposition指定する

Adaptive ResolutionをONにする

Adaptive ResolutionチェックボックスをONにするとWidget作成時にLayoutReader.cppの183行目辺りのLayoutReader::setPropsFromJsonDictionaryで、ContentSizeにCCDirector::getInstance()->getWinSize()を設定してくれます。

f:id:kyokomi:20141028071750p:plain

CocosStudio上で全部%でposition指定する

f:id:kyokomi:20141028071803p:plain

結果

横 iPhone6+

f:id:kyokomi:20141028065142p:plain

iPhone4s

f:id:kyokomi:20141028065348p:plain

縦 iPhone6

f:id:kyokomi:20141028065413p:plain


※2014/10/31 追記

上記の式を使うと(例: 640x960)で極稀にiPadAirなどが横幅(640px)を維持すると縦幅(960px)を維持できなくなるケースがあります。

その場合を考慮して、以下を用意しました。 基本はFitType::WIDTHでwidth640を維持する形でいい感じのSizeに設定し、極稀なケースでheightが維持できなくなったら(960以下になる場合)FitType::HEGIHTにしてのheight960維持する形に切り替わります。

auto fitSize = GLViewUtil::getFitDesignResolutionSize(640, 960, GLViewUtil::FitType::WIDTH);
glview->setDesignResolutionSize(fitSize.width, fitSize.height, ResolutionPolicy::SHOW_ALL);

中でいい感じに計算した結果がもともとのhegith960以下になったらFitTypeをFitType::HEGIHTに変更して再計算します。 こうするとwidthがおそらく640以上になるので、もともと画面の中央にSceneを配置するような工夫とかが必要です。

(よくある、vislbleSize.width /2 - layout->getContentSize().width /2 的なやつです)

かなり暫定的な処置なので、Androidの一部の端末だとダメなパターンとかあるかも・・・


こんな感じになります。

iPhone6

f:id:kyokomi:20141031165622p:plain

iPhone5s

f:id:kyokomi:20141031165634p:plain

iPhone4s

f:id:kyokomi:20141031170307p:plain

iPad Air

f:id:kyokomi:20141031170315p:plain

iPad2

f:id:kyokomi:20141031170324p:plain

nanapi勉強会 vol4に行ってきた感想

nanapi勉強会 vol4 - 【nanapi x はてな】はてなとnanapiの開発フロー

最近、感想ブログばかりになってます(笑

確かに・・・このツイートみて書く気持ちが湧いてきたので、「blog書いてください」って言うの大事だなーと思いました。(す、すみません・・・)

内容

内容のまとめはこちらが参考になります。

めも帖 - nanapi 勉強会 vol.4 #nanapi_study に参加してきました

感想

というわけで、感想メインです。 (他の参加者で感想書かない人も自分と同じような感想で書きにくいのかなーとか思ってたり)

正直、この手の話は眩しすぎて 自分の関わってる業務とは別世界のように感じてしまう というのがざっくりした感想です。

もちろん色々導入したいですし、色々提案したりもしてるんですけどね・・・

以降、もうちょっと詳細な感想。


色々話を聴いていて、nanapiさん、はてなさんのどちらの方も、 そもそもの前提としてほとんどのメンバーが 新しい技術や取り組みに前向きな人が多いのかな? と感じました。(違ったらすみません

自分の業務環境だと、こういった取り組みや新しい技術をいれることに 抵抗拒絶を示すメンバーがほとんどで逆に自分だけで異端児のようになります。(Githubなにそれ?何がいいの?とかとか

ゴリ押しで導入しても、「じゃあ好きにやってくれ」スタンスのメンバと一緒では、 どうやっても上手くいかないのでその辺の知見って需要ないのかな。。。 (上司の説得だけでも疲れる・・・本来の業務進捗に影響が出る)

自分としてはそういうツールとかを導入してもっと楽したいとか効率よくやりたいって考えが強いので、 その導入でプロジェクトの成功を〜とかその行動自体に意義を持ってる人に比べて、興味を持ってもらうように動いたりするのに労力を割くだけのリターンを得るのが難しい。

その辺、理解ある後輩が1人だけ居るので話してみると、 「実際、興味ないものを無理に勧められる側も辛そう」という結論。

なので、興味を持ってもらうように色々動くのも逆効果になるパターンも多そうでやっぱ難しい。。。

そして、「たぶん、先輩早いうちに辞めたほうがいいですね。。。」というお言葉を頂きました。

ぐぬぬ。。。


とりあえず、何となく理解したつもりだったScrum本をちゃんと読んでおこうと思います。

SCRUM BOOT CAMP THE BOOK

SCRUM BOOT CAMP THE BOOK

あと、リモートやる機会があれば、以下も読んでテンションあげたい。

強いチームはオフィスを捨てる

強いチームはオフィスを捨てる

YAPC::Asia Tokyo 2014行ってきました。

YAPC::Asia Tokyo 2014への参加は今回初めてなんですが、 何気に前夜祭〜2日目まで居ました。

まずスタッフの皆様の対応の良さに驚きました。ネットワーク環境も良く最後まで楽しめました。

本当にありがとうございました!!!!!!!!

そしてすみません、かき氷4つが限界でした・・・

あとは簡単にですが、 印象に残ったセッションなどざっと感想を述べたいと思います。

詳しい内容とかは、 各スピーカの方々の「〜話してきた」的なブログとかスライドを見たほうがよさそうなのであまり触れずに感想オンリーです。

前夜祭のLT10連発

初参加もあって雰囲気もわからなかったので、 勤務先が渋谷ということもありそこそこ近かったので物見遊山気分で行ったんですがめっちゃ面白かったです。

ビール飲みながらツマミ食いながらw(最強すぎる

コマンドラインツールについて語るときに僕の語ること

コマンドラインツールについて語るときに僕の語ること #yapcasia // Speaker Deck

以前、何度かGoの勉強会で別の発表を聴いていたんですが、さすがというか今回もスライドの内容や発表の仕方も上手くインパクトすごかったです。 ghrもcli-initもいつも使わせて頂いてます!!!

懇親会でチラッと話せてよかったです!

ベストトーク賞3位おめでとうございます。

初心者が Web エンジニアのコミュニティに触れてみて感じたこと - ゆとりエンジニアの成長戦略

YAPC::Asia 2014 でエモいトークをした - 404 Engineer Logs

去年までは業務多忙を言い訳にあまり参加できてなかったのですが、今年くらいから勉強会とか参加するようになり、 まったく同じようなことを最近思っていたのでとても共感できました。

ただ自分と違って、ここまで行動できていてすごい・・・自分ももっと頑張らないとな思いました。

@deeeetさんと同じく懇親会でチラッと話せてよかったです。

Twitterフォローもしていただけて恐縮です!!

Perlあるある

Yapc::Asia 2014 Perlあるある

Perl初心者なので、もしかしたら・・・と思ってたのですが、全然そんなこともなく。

エンジニアあるあるっぽい感じで、面白かったですしめっちゃ気合入りました!

Keynote

@typestarさんのエンジニア道を貫き通してる感じがすごい伝わるKeynoteでした。

色々と熱いものを頂いたので、帰ってからも今日もずっとコード書いてました。

あとIngress始めましたw

次は自分もLTとかやって、もうちょっとコミュ力あげて行こう。

golangでjson用のstructを生成するGo製ツール(gojson)

Goでjsonのデータを扱う機会は多いのですが、 その度にjson:"hogehoge"を書くのがめんどくさいなーと思ってました。

jsonのI/Fが決まってるならそこからgoのコード生成すればいいかなと思い、作る前に類似ツールがないか調べていたら、すでに丁度いいのがあって便利だったので紹介したいと思います。

ChimeraCoder/gojson

ChimeraCoder/gojson · GitHub

install

$ go get github.com/ChimeraCoder/gojson

使い方

大きく2パターン?もっとありそうです。

  • catとかでローカルのjsonを渡す
  • curl等で受け取ったjsonレスポンスを渡す

ローカルにjsonがある場合

hoge.json

{
    "id": 1111111111,
    "name": "kyokomi",
    "full_name": "kyokomi/kyokomi"
}

普通にcat等でパイプで渡してやるといい感じです。

$ cat test/star.json | gojson -pkg=main -name=Starred > starred.go

引数の意味

  • -pkg パッケージ名
  • -name structの名前

出力結果

実行結果は標準出力されるので、そのまま.goとかに書き込めばいい感じになります。

package main

type Hoge struct {
    FullName string  `json:"full_name"`
    ID       float64 `json:"id"`
    Name     string  `json:"name"`
}

curlでパイプするのも可能

便利です。他にも色々使えそう。

curlする

$ curl https://api.github.com/users/kyokomi | gojson -pkg=main -name=GitHubUser

実行結果

package main

type GitHubUser struct {
    AvatarURL         string      `json:"avatar_url"`
    Bio               interface{} `json:"bio"`
    Blog              string      `json:"blog"`
    Company           string      `json:"company"`
    CreatedAt         string      `json:"created_at"`
    Email             string      `json:"email"`
    EventsURL         string      `json:"events_url"`
    Followers         float64     `json:"followers"`
    FollowersURL      string      `json:"followers_url"`
    Following         float64     `json:"following"`
    FollowingURL      string      `json:"following_url"`
    GistsURL          string      `json:"gists_url"`
    GravatarID        string      `json:"gravatar_id"`
    Hireable          bool        `json:"hireable"`
    HtmlURL           string      `json:"html_url"`
    ID                float64     `json:"id"`
    Location          string      `json:"location"`
    Login             string      `json:"login"`
    Name              string      `json:"name"`
    OrganizationsURL  string      `json:"organizations_url"`
    PublicGists       float64     `json:"public_gists"`
    PublicRepos       float64     `json:"public_repos"`
    ReceivedEventsURL string      `json:"received_events_url"`
    ReposURL          string      `json:"repos_url"`
    SiteAdmin         bool        `json:"site_admin"`
    StarredURL        string      `json:"starred_url"`
    SubscriptionsURL  string      `json:"subscriptions_url"`
    Type              string      `json:"type"`
    UpdatedAt         string      `json:"updated_at"`
    URL               string      `json:"url"`
}

新しい言語で基礎学んだ後にやってはいけないこと/やるべきこと

新しい言語のHelloWorldが終わって、有名な人のライブラリとかもある程度使ってみた。 さて、いよいよどうするか。。。って時のメモです。

ちなみ自分がこの記事を書くときにイメージしたのはgolangです。

絶対にやってはいけないこと

本質は、新しい言語でガンガン開発することなので、 その他の要因で萎えたりしないようにする。

なんか新しいツールWebサービスをつくる!

  • アイディアが沸かない
  • webアプリは、作り始めても結局フロントのcssとかjsとか書くのが必要になって萎える

基礎覚えたけど、忙しくなってちょっとやらなくなる

  • 再開しようとしたけど全く覚えてない

え、また入門から・・・?そりゃ萎えるわー


これなら萎えないでいけそうな、やったほうがいいこと

※個人差はあります。参考程度にしていただけると

別言語で作った既存ライブラリやツールWebサービスを書き直す

自分で作ったものがあると、まずこれをやるのがベターっぽい。 他人や有名なライブラリやツールは、すでに作られてるパターンが多いので、 そうじゃないものを探すのに疲れるからオススメしない。

別言語の書籍サンプルを実装してみる

自分は結構これが良いと思ってる。 Webアプリのサンプルとかもcssとかjsは大体あるので、そのまま使える。 サーバーサイドの新しく学ぶ言語だけ集中して取り組める。

練習問題っぽいやつ問いてみる

paizaとか

Goのbeta版あったけど、チェックスキルのやつでまだ選択できなかったのでやってない。

なんか問題読むのがだるい感じだったので、向いてないかも?

WebAPIのラッパーライブラリとかツールを書いてみる

自分は、業務で使ってるSlackとかGitlabとかのAPIのラッパーとか簡単なツールを作った。 GithubAPIもちょっと触った。

これは、すでに類似ツールあるかもしれないけど、100%自分にあったツールは大体ない。 自分しか使わないくらいの気持ちでサクッとつくってしまうと丁度よかった。

とりあえず自分が毎日使ってるWebサービスがいいと思う。使ってないWebサービスは萎える・・・

業務とかですぐ使えそうなプチツールを作る

WebAPIの話に近いけど、 自社の業務ですぐ使えそうなプチツールとかをサクッと作るのも良さそう。

  • 1、2回しか使わないかもでもいい
  • 自分だけしか使わない感じでもいい

その他萎えるのを防止する支援ツール

基礎学んでから、どれくらいサボってるかを可視化する。

Googleスプレッドシートで色つき星取り表をつける

色つき星取り表

f:id:kyokomi:20140810182819p:plain

やべぇ、今週ローグ開発やってないな。。。

ソースコードgithubにpushして草を生やす

github.com

誰かが見てるとかはあまり気にしないで、ガンガンあげればいいと思う。

f:id:kyokomi:20140810183140p:plain

露骨なHelloWorldはSandbox的なOragnizationsを用意したりする。

ご意見ください

自分はこうしてるな〜とか、こういう萎える罠ハマったなーとかあれば教えていただけると。

そんな悩みないって人はスルーしてください・・・

Go lang勉強会に参加した感想

http://connpass.com/event/7814/

はじめに

Goはまだ入門して1〜2ヶ月くらいで、まだまだ初心者な感じで参加して大丈夫かなーと思ってましたが、とてもためにな話をたくさん聞けて参加できてよかったです。

場所や軽食などをご提供頂いたHDE様にも感謝です!

印象に残った発表を抜粋で紹介とポエムっぽい感想など述べたいと思います。

※各発表のスライドはちょっと全部拾いきれなかったので、connpass側にまとめられると期待して感想だけになります

Ship your CLI tool build by Golang

@deeeet さんの発表

Goで作ったツールとかをサクッと配布するツールを使って、ツールを使う人の障壁をとにかく減らすという話。 自分も最近は社内開発用ツールとかGoで書いてるので、参考にさせていただいてます!

cli-initすごく使ってます!!Githubスター100おめでとうございます。

同期的にプレゼンテーションするツール作った

@zoncoen さんの発表

発表者のスライドを手元のPCで同期して表示するDEMOを実際に体験しましたが、結構良かったです。 チラッと話してたかもしれませんが、 スライドの横とかにハッシュタグTweetとかが表示されると楽しいかも〜と思いました。

ngrokというlocalhostを公開する便利なサービスも知りました。 こんな便利なものがあったとは・・・

インタフェースの実装パターン

@tenntenn さんの発表

Goの黒魔術っぽいテクニックがすごい衝撃的でした。 実際に実用すべき時が来るかはわかりませんが、 知識としてこういうこともできるというのを知っておけたのは良かったです。

Goとライセンス

@nabeken さんの発表

普段Goを書いてる時にあまり気にしてなかった政治的な話をガッツリ調べてわかりやすく説明いただけて、 とても勉強になりました。

How To Think Go

@lestrrat さんの発表

YAPCでの発表の前哨戦的な位置づけ?らしいです。資料の公開はYAPCまでお預けとのこと。

他の言語と同じような感覚(オブジェクト指向など)でGoプログラミングした際の地雷や注意点、考え方や例外処理の扱いなど目からウロコな話をたくさん話していただけました。

自分はinterfaceや埋め込み等の使い所が、まだまだ理解できていなかったのですが、埋め込みは継承ではなく移譲といった考え方などライブコーディングを交えた説明だったので、とてもわかり易かったです。

カンファレンスというよりは、学校の授業っぽい感じでなんか新鮮な感じでした。

YAPCで改めて聴くのが楽しみです。