2015年10月

1. サンプルコード

まだ昨日の分のコード攻略が終わってないけど、次のコードです。
昨日のコードの攻略は昨日の記事の中で終わらせられればそれでいいのです。1日で終わらせる必要はないのです。
終わらない内から次のコードの攻略を始めてもいいのです。
そういうことなのです。


MainScene.hより
ーーーーーーーーーー
#ifndef __KawazCatch__MainScene__
#define __KawazCatch__MainScene__

#include "cocos2d.h"

class MainScene :public cocos2d::Layer
{

〜省略〜

    /** 画面にフルーツを新たに配置して、それを返します
     *  @return 新たに作成されたフルーツ
     */
    cocos2d::Sprite* addFruit();

    /** マップからフルーツを取り除きます
     *  @param  fruit 削除するフルーツ
     *  @return 正しく削除されたか
     */
    bool removeFruit(cocos2d::Sprite *fruit);

};

#endif /* defined(__KawazCatch__MainScene__) */
ーーーーーーーーーー「cocos2d-xではじめるスマートフォンゲーム開発」から引用

作成したフルーツはそのままじゃなくて、一定時間が経ったら削除してあげないとダメだよね?
たぶんそのための関数の宣言なんじゃない?たぶんだよ。


とりあえず休憩。



27:24
2. コード攻略

サクッといこう。
まだ前回のコードの攻略は終わってないんだけどさw
長いんだもの。面倒くさいんだもの。

今回は一行ポッキリ。ナイスだね。


さてコードは bool removeFruit(cocos2d::Sprite *fruit);。
bool型removeFruit()関数の宣言で引数はcocos2d::Sprite *fruit。
終了!
と言いたいとこだけど、少しは解説しとかないとね。

まずbool型についてはもう説明不要だね。
removeFruit()関数は宣言だけで実装はまだだよ。次回がこの関数の実装だろうね。やだなあ。
んで引数の cocos2d::Sprite *fruit なんだけど、マジでこういうのなんなんだろうね?
cocos2d::Spriteクラス型のfruitポインタ変数??

もう何なんだよこういうやつさあ。帰れよ。
わからんゆーとろーが。聞いちょらんのか?
一応さ、前も似たような疑問を感じてて、解決できてないんだけどさ、、
ーーーーーーーーーー
どうしようも何もないよね。ありのままを受け入れるしかない。〜を受け入れるはacceptだよね。あいacceptありのまま。
つまり「クラスをポインタにしていい」「クラスを関数の型にしていい」って考えるしかない。
じゃなかったら static cocos2d::Scene* createScene() ってコードが成り立たないわけでさ。
ーーーーーーーーーーここの1項目

「クラスを型にしていい」ってのはもう決定だよね。そうとしか考えられないし実際にそうやって使ってる。
たださ、cocos2d::Sprite ってどういう意味なんだろう?
「cocos2dクラスのSpriteクラス」ってこと?なんか変じゃない?
別に変じゃないのか?やっぱ変なのか?それすらも分からん。
それともやっぱ「cocos2d::Sprite」って名前の一つのクラスなのか?
っていうかそもそもcocos2d::Spriteはクラスなのか?
そもそもなんで僕はこいつをクラスだと考えたんだっけな?
変数の前にあるから?ってことはそれって "型" であるのはわかるけど、だからってイコール "クラス" ってことにもなるのか?なんでそう思ったの?
ーーーーーーーーーー
「::」はただの "名前の一部" なんだよ。「スコープ解決演算子」ではない。その働きはしない。
継承元のクラス名が「cocos2d::Layer」ってことなわけよ。それで辻褄が合う。たぶん。

〜省略〜

んでもって cocos2d::Scene* createScene() なんだけど、うーん、、これもよくわかんないなあ。
cocos2d::SceneっていうクラスのcreateScene()関数ってことなのかなあと思ったんだけど、それならクラスと関数の間に「::」が必要なはずだよねえ?ここでやったはず。でも間にあるのはポインタを表す「*」。
ーーーーーーーーーーここの3,4項目

よしよし、なんでクラスと考えたのかは分かったね。
しかしそれが正しいという保証はない。推測でしかない。


はあ、もうどうでもいいよ。
なんかゴチャゴチャしてきた。何が分からないのかどこが分からないのかすらも分からなくなってきたよ。

今回はこの辺で。
さいならっきょ。

ってか前回のコードの攻略も終わらせなきゃじゃん。
ヤバい。苦痛うううう、、
う、う、う、、



11:35
ファミリーマートにて
黒酢ドリンク クレカ-108

今日は食べ放題に来たよ。
死ぬまで食ったるぎゃー!


12:30
小尾羊 巣鴨店にて
ランチ食べ放題 財布-600

腹パンパンだよ。死んじゃうよ。
っていうか食べ放題600円って安くない?いいとこ見つけちゃった。
ただ二郎みたく「メッチャ美味い!」ってほどの料理はなかったよ。どれもまあまあだった。
でもとにかく安く死ぬほど食べたいって時には最高だろうね。


13:11
スーパーマイバスケットにて
バナナアイス クレカ-99



さてさてそろそろ暴食も終わりにしないとね。十分にエネルギーの補充はできたし。
また明日からは粗食生活に戻るよ。
その予定だよ。
予定ね。



21:59
スーパージャンボにて
ーーーーーーーーーー
ぶり切り身半額 100
マグロ刺身40%引き 270
ビール350ml 119
じゃがりこ 99
菓子パン 75
ーーーーーーーーーー
財布-716

22:09
ミニストップにて
ーーーーーーーーーー
カール 129
キャベツ太郎 103
飲むヨーグルト 163
ポテチ130g 203
ーーーーーーーーーー
クレカ-598



食欲爆発。
食べ放題で胃袋が膨らんじゃったんだよたぶん。フードファイターだ。
いやマジでシャレになんないって。金銭的にも健康的にも。

今日で最後。マジで。
しばらく暴食禁止。マジで。



〆るぞっしゃオラ!

前回226833-108-99-598=226028 オッケー。


前回1385-600-716=69 オッケー。


<全財産>
口座 17817
財布 69
クレカ 226028
合計 243914

削っていきやがる。
オレの体力をじわりじわりと確実に。



1. サンプルコード

ここの最後で宣言した cocos2d::Sprite* addFruit()関数の実装だね。

今日はかなり長いよ。
やだねったら、やだね。


MainScene.cppより 
ーーーーーーーーーー
#include "MainScene.h"

USING_NS_CC;

/ / /フル ーツの画面上端からのマ ージン ( p x )
const int FRUIT_TOP_MERGIN = 40;

SpriteMainScene:: addFruit()

{

    // 画面 サイズ  取り出す

    auto winSize = Director:: getInstance()->  getWinSize();


    // フルーツ  種類   選択 する

    int fruitType = rand() % static_ cast < int >( FruitType:: COUNT);

    

    // フルーツ  作成 する

    std:: string filename = StringUtils:: format( " fruit% d. png", fruitType);

    auto fruit = Sprite:: create( filename);

    fruit->setTag( fruitType); // フルーツ   種類  タグ として 指定 する

    

    auto fruitSize = fruit->getContentSize(); //  フルーツ  サイズ  取り出す

    float fruitXPos = rand() % static_ cast < int >( winSize. width);  // X   ランダム   位置  選択 する

    

    fruit->setPosition( Vec 2( fruitXPos, winSize. height - FRUIT_ TOP_ MARGIN - fruitSize. height /  2. 0));

    this->addChild( fruit);

    _fruits. pushBack( fruit); // _fruits ベクター   フルーツ  追加する

    

    return fruit; 

}


〜省略〜

ーーーーーーーーーー「cocos2d-xではじめるスマートフォンゲーム開発」から引用

やだねったら、やだねえええ。


休憩。



52:51
2. やるよ

52時ってのはつまり、2日後の午前4時ってことだね。11/1の4:51ってこと。
何時になろうが構わない。終わらせさえすればルール違反ではない。
いや終わらなくとも、「更新」は出来た以上「毎日更新」という制限はクリア出来たわけだよ。
10/31の分の更新もさっき終わらせた。
つまり、宣言は全てクリア出来たってこと。約束は守れたってこと。
例え今回のコードの攻略がどれだけ遅くなろうともね。

卑怯?
無職とはそういうものでしょう。
むしろ「それでこそ」と讃えてほしいもんだ。


さて、じゃあ今からちょっとお菓子買いに行くから。
アデュー!



75:07
3. やるってば

忘れてないよ。
今日はやる気あるよ。


休憩してからね。



108:02
4. がんばろう

100時を超えたらやろうって思ってたんだよ。
ホント。


最初は SpriteMainScene:: addFruit() だね。
ここで宣言した cocos2d::Sprite* addFruit()関数の実装だね。実装なんだけどさ、なんか形が違うね。
型名が cocos2d::Sprite* から Sprite になって、関数名は addFruit() から MainScene:: addFruit() になってる。
これって、どういうことなんだろ?

関数名が変わるのは分かる。
っていうか変わったわけじゃなくて、メンバ関数の実装時はクラス名を書かなきゃダメなんだもんね。C++でやったね。
ーーーーーーーーーー
要はクラス型名とメンバ関数の間に::を書くことで "メンバ関数の中身" を表せるってこと。
ーーーーーーーーーーここの2項目から引用
だから関数名が addFruit() から MainScene:: addFruit() になったのは何も不思議はない。そうしないとダメなわけでさ。
でも型名が cocos2d::Sprite* から Sprite* になるってのが分かんないんだよなあ。

これってさ、createScene()関数もそうなんだよね。
宣言時は static cocos2d::Scene* createScene() なのに、実装時は Scene* MainScene::createScene() なんだよ。
型名が cocos2d::Scene* から Scene* になってる。

つまり、どういうこと?
っていうか「cocos2d::」って何者なんだろう?
僕は前回までに奇妙な理解の仕方をしてるんだけどさあ、
ーーーーーーーーーー
「::」はただの "名前の一部" なんだよ。「スコープ解決演算子」ではない。その働きはしない。
継承元のクラス名が「cocos2d::Layer」ってことなわけよ。それで辻褄が合う。たぶん。
ーーーーーーーーーーここの3項目
「ただの名前の一部」なわけないじゃんねえ。
それじゃあ型名が cocos2d::Scene* から Scene* に変わることに説明がつかない。
宣言時と実装時で型名が変わるはずないもんねえ。

つまり、「cocos2d::」ってのには何かしら意味があるってことだよね。ってそんなの当たり前だろうけどさ。
でもどういう意味なんだろ?ってそれも見たまんまか。
「cocos2dクラスの」って意味だよねえ、たぶん。それ以外に考えられないし。
でもそれでも分かんないものは分かんないだよ。

関数名はさ、「宣言時はそのまま書いて実装時にはクラス名をつける」のにさ、型名は「宣言時にはクラス名をつけて実装時にはクラス名を外す」ってわけなの?
そんなのどっかで勉強したことあったっけ?「ロベールのC++教室」でさ。
ってか「型をクラスで呼び出す」なんてことしたことあったっけ?
ここでいう「型」ってのは「クラス」のことなんだから、「クラスをクラスで呼び出す」ってことになるんだろうか?
ってかそもそも「cocos2d」ってのはクラス名なのか?

うーん、謎だらけじゃん。
どーにも解決できるとは思えない。糸口すら掴めないよ。

とりあえずスルーするしかないんだろねえ。の僕では理解できないもの。
いつか理解できる時が来るんだろうか?
来ると信じよう。


休憩。



11/5 15:56
5. やろう

終わらせたい。
無理だろうけど。


次のコードは int fruitType = rand() % static_ cast < int >( FruitType:: COUNT);。
int型のfruitType変数を rand() % static_ cast < int >( FruitType:: COUNT) で初期化。

うーん、謎。
rand() ってのは rand()関数のことで、ランダムな値を返してくれる関数だとは思うんだけど、その後ろの % static_ cast < int >( FruitType:: COUNT) ってのが分かんないないなあ。何者だよこいつら。

あーあ、せっかくやる気出したのに、2秒で撃沈。


休憩。


1. いいんです

そうなんです。いいんです。こんなんでも、いいんです。



フルーツ画像の "出現位置" を実装するよ。

MainScene.cppより 
ーーーーーーーーーー
#include "MainScene.h"

USING_NS_CC;

/ / /フル ーツの画面上端からのマ ージン ( p x )
const int FRUIT_TOP_MERGIN = 40;

〜省略〜
ーーーーーーーーーー「cocos2d-xではじめるスマートフォンゲーム開発」から引用

かなりサンプルコードが長くなってきたからさ、今後は追加したコードとその周辺のコードしか載せないよ。


さてさて、今回追加したコードは一行のみ。
const int FRUIT_TOP_MERGIN = 40;。

const はC++のここで解説したね。してないけどね。とにかく定数になるんだよね。
んでもってint型のFRUIT_TOP_MERGIN変数に40を代入と。
FRUIT_TOP_MERGIN変数なんぞ宣言した覚えはないけど、こいつもcocos2d.hのどっかですでに宣言されてるんだろうね。たぶん。

いやいや違うな。
FRUIT_TOP_MERGIN変数はこのサンプルゲーム固有の変数であってcocos2dxに元々あるものじゃないから、cocos2d.hには入ってないか。
っていうか const int FRUIT_TOP_MERGIN = 40; って別に難しく考えるまでもなく単純に変数の "初期化" してるだけだよね。
int型のFRUIT_TOP_MERGIN変数を宣言して、それを40で初期化してるだけ。
他のコードがあんまりにイミフなもんだから "諦めモード" に入っちゃって、全てのコードの解説を放棄しようとしちゃってるわけだね。いかんいかん。
冷静に、分かりそうなコードについてはちゃんと理解して解説してかないとね。ホントにサンプルコードをコピペするだけになっちゃう。それじゃ意味なし芳一じゃんね。

このFRUIT_TOP_MERGIN変数はおそらく、フルーツ画像を画面に表示させるコードにおいて "画面の高さからどれだけ離れた場所に表示させるか" を示すための変数として使われるんだと思うよ。
んでその「どれだけ」ってのが40なんだろうね。

ところでさ、この40って "単位" は何なんだろうね?
前にも同じような疑問を持ったよね。
ーーーーーーーーーー
今回のプレイヤー画像の初期位置のy座標は height - 445 なわけだ。
この445って値の単位が分かんないけど、とにかく height - 445 って座標が プレイヤー画像のy座標の初期位置になるわけだね。
ーーーーーーーーーーここの4項目から引用

解決できてないね。
今回もスルーでいいとは思うんだけど、少し考えてみよう。


休憩してから。



24:53
2. ピクセル

ピクセルだろ?って思うじゃん。
単位がさ。40なら40ピクセルのことだろ?って思うじゃん。僕もそう思ったんだよ。


/ / /フル ーツの画面上端からのマ ージン ( p x )」ってコメントに書いてあるもんね。
でもさ、なんか変なんだよね。それじゃあ計算が合わない。

"フルーツの出現位置が画面の高さから40ピクセル" ならさ、まあそんなもんかなあって気もするんだけどさ、プレイヤー画像の初期位置の height - 445 を "ピクセル" って考えるとさ、おかしくない?
heightってさ、iPhoneの画面の縦方向のサイズでしょ?

画面サイズ4インチのiPhoneの画面サイズってさ、縦1136x横640ピクセルじゃんね。ウィキペディア曰くさ。
今僕の作ってるサンプルゲームは3.5インチ用だから、3.5インチなら縦960x横640ピクセル。
ってことは、height = 960ピクセル ってことになるよね?

んでもってプレイヤー画像の初期位置は height-445 ってことは 960-445=515ピクセルってことになっちゃうじゃん。変だよね?
全長が960ピクセルで初期位置が515ピクセルってことは、画面の真ん中より少し上のあたりが初期位置になっちゃう。
でもそうはなってない。

何かがおかしいんだよ。
どっか勘違いしてる。もしくは間違った理解をしてる。
それはどこなのか?

それが分かったら苦労しませんて。


休憩。



26:16
3. ポイント

うーん、何となく分かったような?


どうやらさ、"ピクセル" ではないっぽい。単位ね。
プログラムにおいては "ポイント" なる単位を使うっぽい。超絶たぶん。
はてポイントとはなんじゃらほい?なんだけどさあ、これは説明が難しい。ってか僕も理解できてない。

「iOS View プログラミングガイド」っていうさ、開発者向けのApple公式リファレンスにさ、それっぽい説明があるんだよね。

Apple公式リファレンス集→https://developer.apple.com/jp/documentation/

ーーーーーーーーーー
ポイントとピクセル

iOSでは、すべての座標値および距離を指定するときに、ポイントを単位とする浮動小数点値を使用します。実際のポイントのサイズはデバイスごとに異なり、あまり重要ではありません。ポイントを理解する上で重要な点は、ポイント指定によって描画の基準となる一定の尺度が提供されるということです。

表 1-1に、iOSベースのデバイスの縦長の向きでの画面サイズ(ポイント単位)を示します。値は、画面のサイズを幅、高さの順に示しています。これらの画面サイズに合わせてインターフェイスを設計する限り、ビューはそれぞれ対応するタイプのデバイスで正しく表示されます。


表 1-1 iOSベースのデバイスの画面サイズ

画面サイズ(ポイント単位) デバイス

320×568 4インチのRetinaディスプレイを搭載したiPhoneおよびiPod touch
320×480 その他のiPhoneおよびiPod touchデバイス
768x1024 iPad

それぞれのタイプのデバイスで使用されるポイントベースの計測方法で、ユーザ座標空間が定義されます。これは、ほぼすべてのコードで使用する標準の座標空間です。たとえば、ビューのジオメトリを操作するときや、Core Graphics関数を呼び出してビューのコンテンツを描画するときには、ポイントとユーザ座標空間を使用します。ユーザ座標空間の座標はデバイスの画面上のピクセルに直接マッピングされることもありますが、これが常に当てはまるとは想定しないでください。代わりに、常に次のことに注意してください。

1ポイントは必ずしも画面上の1ピクセルに対応しない

デバイスレベルでは、ビューで指定した座標はすべて、ある時点でピクセルに変換される必要があります。ただし、ユーザ座標空間のポイントをデバイス座標空間のピクセルにマッピングする処理は、通常、システムによって行われます。UIKitとCore Graphicsはどちらも主にベクトルベースの描画モデルを使用し、このモデルではすべての座標値がポイントで指定されます。したがって、Core Graphicsを使用して曲線を描画する場合、基になる画面の解像度にかかわらず、同じ値を使用して曲線を指定します。

イメージの操作や、OpenGL ESなどのその他のピクセルベースのテクノロジーの使用が必要な場合は、iOSがピクセルの管理をサポートします。アプリケーションバンドルにリソースとして格納された静的なイメージファイルについては、イメージを別のピクセル密度で指定するための規則や、現在の画面解像度に最適なイメージをロードするための規則が、iOSで定義されています。ピクセルベースの描画コードを手動で調整して、より解像度の高い画面に対応できるように、ビューは現在の倍率に関する情報も提供します。ピクセルベースのコンテンツを別の画面解像度で処理する手法は、『Drawingand Printing Guide for iOS』の「Supporting High-Resolution Screens In Views」で説明されています。
ーーーーーーーーーー「iOS View プログラミングガイド」から引用

まあイミフなんだけどさ、とりあえず大事なのは赤字の部分だと思うんだよ。
「ポイントを単位とする」、4インチ以外=3.5インチのデバイスのポイント単位の画面サイズは「320×480」、「1ポイントは必ずしも画面上の1ピクセルに対応しない」って部分ね。
ってか僕にはこの部分しか理解できなかった。

んでさ、これを元に考えるとさ、辻褄が合うんだよね。
画面サイズ320×480ってことは縦方向のサイズ=heightが480ポイントってことでしょ?
ってことは height-445 = 480-445 = 35ポイントってことになって、なるほどそんなもんだなあって感じの座標になるんだよね。

でしょ?
これならなんの違和感もない。

違和感がないからって正しいとは限らないけどさ、でも気持ちいいじゃんねえ。
っていうかAppleが公式にそう言ってるんだから正しいに決まってんだけどさ、僕の理解が正しいとは限らない、って話ね。

とにかく、プログラミングする時に座標をイジろうと思うなら、"ポイント" で考えないとダメなんだと思う。
んで、ピクセル=ポイント ではないんだよ。ポイントはポイント。
んでじゃあポイントって何者なのか?って話はナシね。ポイントはポイント。

今はこの程度の理解に留めておくよ。っていうかそれ以上は僕にはムリだからさ。今の僕には。

きっといつか分かる日が来る。いつか。
死ぬ前には来るといいね。冥土の土産としてさ。



昨日記録するの忘れてたよ。写真も撮ったのに。
また悪い病気が始まっちゃってるなあ。


10/28 16:32
スーパー西友にて
ーーーーーーーーーー
袋 2
ポテチ170g 218
ピザ 266
イカフライ 92
唐揚げ串 92
コロッケ 47
ハリボーグミ 199
柿の種 175
タバスコ 189
ビール500ml 155
キャラメルアイス 89
ーーーーーーーーーー
クレカ-1645



完全にタガが外れた状態。
今日も食べまくる予定だよ。好きなだけね。



前回228478-1645=226833 オッケー。


<全財産>
口座 17817
財布 1385
クレカ 226833
合計 246035

記録は出来た。まだ死んだわけじゃない。
エネルギーを充電してるわけよ。
そういうことなわけよ。


↑このページのトップヘ