みゆにゃんぶろぐ

ゲーム(開発)/カラオケ/サイクリング/コーヒーの話題多め。毎週木曜日or金曜日更新

11月19日

木曜と金曜が忙しくて、更新できなかったので、今日更新……

まぁ、たまには不定期でもちゃんと更新したほうが長続きすると思う(笑)

 

bool型へキャストするときの注意

先週、学校の友達がエラーがでてわからないと言っていた

どんな内容かというと、int型をbool型に変換すると警告が出て、それをとるにはどうしたらいいのかということだった

要はこういうことである

f:id:clover_0907:20161119121403p:plain

これを実行するとC4800というエラーが出る。強制的に変換しますよ、という内容だった

実はというと自分もC++の課題で全く同じことをしていて、クリーンしてビルドしたら、同じエラーが出た

てなわけでどうしたらいいのかなぁと悩んで調べていたら、解決方法が見つかった

変換したい対象の後ろに「!=0」をつければいいのだ(※MSDNにそう書いてあった)

f:id:clover_0907:20161119122318p:plain

「!=」をつけた結果はboolになるということを利用したものだ

上の例だと「1!=0」(1は0じゃない=true)となって、無事flagにはtrueが入るわけだ

そう考えるとstatic_castしてる意味がないんじゃないかと思ってstatic_castを外してビルドしたら、エラーは出なかった。でもパッと見てこれは何をしてるのかわかりにくいから、コメントを入れておくべきだと思う

ちなみに、「!=0でできるなら、==1でもいけるんじゃない?」と思うかもしれないが、これはできない。なぜなら、仮に変換対象が1じゃなくて2だった場合、「2==1」はfalseになるからだ。false=0、true=0以外なのだから、bool型にキャストしたい場合は「!=0」を使おう

 

Cocos2d-xでスプライトを使い回したいときの注意

昨日、cocosを使った課題をやっていた時のこと

同じ画像を複数の場所に出したかったのだが、それがうまくできなかった

その時の自分はこうやっていた(※今回のは例です)

f:id:clover_0907:20161119125244p:plain

ベースとなる画像を用意して、それぞれのスプライトにコピーしたらいけるんじゃないかなぁと思っていた

がしかし、実行したらこうなる

f:id:clover_0907:20161119125658p:plain

右の画像しかでないのである。左の画像はどこへいったorz

 

ちなみに、同じようなことをDXライブラリでもやってみるとこうなる

f:id:clover_0907:20161119131310p:plain

f:id:clover_0907:20161119131448p:plain

ちゃんと両方出る

 

なんでcocosはできないんだろう、と昨日はずっとうーんと悩んでいた

友だちと先輩にも見せて相談に乗ってもらったら、悩みが解決した

スプライトをコピーしていると思っていたところが、ポインタを渡してるためにコピーされてなかったということだ

要は、catをそれぞれcat_leftとcat_rightにコピーしているのかと思ったら、ポインタだから「cat_left、cat_rightを経由して、結局はcatを操作していた」ということになる

最初はcat_leftを経由したcatに、左のほうの座標を設定する。そのあとで、cat_rightを経由したcatに、右のほうの座標を設定する。さっき左のほうの座標に設定したやつは上書きされるということになる

自分がやっていたのはこういうことである。わかったときには「ポインタのばかぁぁぁ」と思っていた(笑)

DXライブラリだとうまくいったのは、グラフィックハンドルがポインタではないからだと思う。たぶん

結局、同じ画像を2つ用意して同時に表示させることにした(笑)

cocosにはスプライトをコピーする方法がないのかなぁと思ったのだった