神代クロ のすべての投稿

スポーツクラブ16

またスポーツクラブに通うことにしました。なんか周りの人に「太った?」と言われるので。しばらく来てなかったので、器具の配置が変わってたり、マシンが新しくなってたりしてました。

まず最初にバイクをやります。しかし5分やっただけでもう息が上がってきたり。隣りのオバサンなんて雑誌読みながら悠々とやってるというのに。こりゃかなりの運動不足だな。

まあ何とか一通りの器具をやって、ランニングマシンでも少し走りました。かなりグッタリ。まず間違い無く明日は筋肉痛だな。

まぁしかし頑張って続けよう。

ゲームコーディング・コンプリート読了

gamecodingcompleteゲームコーディング・コンプリート 一流になるためのゲームプログラミングを読み終わりました。ウルティマシリーズの開発者が書いた本です。この本は図や表がほとんど無く、文字とソースコードのみなので、読むのに結構苦労しました。理解出来ないところも多々あったり…ちなみに800ページ以上あります。

しかし現場の人が書いた本は有益ですね。実戦的なのは勿論、失敗談や他のプログラマの話とかが書かれたコラムが面白い。

以下自分用メモとして思った事などを…

第2章
ゲームアーキテクチャですが、本書ではアプリケーションレイヤー、ゲームロジック、ゲームビューの3つに分けてました。俺は勝手に基底部分なんて呼んでたけど、アプリケーションレイヤーの方がかっこいいねw

第3章
スマートポインタとかSTLとかの説明があるんだけど、そういえば全然使いこなしてないな…そのうちちゃんと勉強しよう。

第10章
「本書の中で、この第10章が最も重要かもしれない」と書かれたゲームのイベント管理。イベントデータの引き回し面倒だなぁと思ってたんで、この章の考え方は参考になりました。イベントデータを持ち歩くんじゃなくて、イベントマネージャに管理させるという方法。確かにこうしないと大規模なゲーム作るの無理だわ。

第11章
Luaを使ったスクリプティング。自作スクリプトでキャラクタの挙動とかを操るのは知ってたけど、今は既存のスクリプト言語を組み込むんだね。

第15章
物理シミュレーションSDKのBulletを統合する方法。Bulletはオープンソースだから、いつか自作ゲームにも組み込んでみよう。

第17章
ゲームAI。3Dゲームもフィールドを線分で構成して経路探索やってるんだね。A*(スター)とか昔やった気がする。自作ゲームにも、もう少しましな思考ルーチン入れないとなぁ。

第20章
C#によるゲームエディタ。C#はGUI作るの簡単そうだな。これもそのうち触ってみよう。

第21章
ゲームのデバッグ。絶対音感を持ったプログラマのデバッグの話は面白かった。

第22章
海外のゲーム会社は時間的に余裕があって、豊富なリソース使って優雅にゲーム作ってるんだろうなぁと思ったけど、そうでもないらしい。1日18時間作業とか、スタッフがごっそり抜けて新会社設立など、日本でも聞いたような話があったり。

3Dの章とかは流し読みしただけだし、他にも理解できなかった箇所とかあるんで、そのうちまた読み返そう。

ゲーム開発37:フェードイン・フェードアウト

友人に更新が少ないって言われた>挨拶
---

画面切り替え時のフェードイン・フェードアウトを作成しました。これまでもあったんだけど、CGraphicsクラスに入れて全ゲームモードで使い回せるようにしました。

フェードのやり方は色々あると思うけど、俺は一番手前に画面全体を覆う白いスプライトを用意して、それの透過値を変えることで実現してます。

いちいち初期化するのも面倒なので、FadeMove()を呼んだらその中で初期化もループ動作も行ってます。例によって即値が入ってたり、無駄な処理があっても気にしない。

絵を描いたりボスキャラ組んだり、まだやることはたくさんあるな。

//—————————————————————————–
enum {
 FADE_IN,
 FADE_OUT,
 FADE_BLACK,
 FADE_WHITE
};

struct Fade {
 float cnt;  // 移動量
 float now;  // 現在の値
 int  color;  // 色
 int  spr_no;  // スプライトNo
 BOOL complete; // 完了フラグ
};

//—————————————————————————–
// フェード動作
// in_out:フェードインかフェードアウトか
// minutes:フェードする秒数
// color:切り替わる色
BOOL CGraphics::FadeMove(int in_out, float minutes, int color)
{
 RECT workRect;

 // 初期化
 if (fade.spr_no==-1) {
  // フェード用画像登録
  SetRect(&workRect, 0, 0, 47, 47);
  fade.spr_no=CreateSprite("data\graph\status.png", workRect);
  fade.now=1.0f;
  fade.complete=TRUE;
 }

 if (fade.complete) {
  // フェード開始
  if (in_out==FADE_OUT) {
   fade.cnt=1.0f/((float)minutes*60.0f);
   fade.now=0.0f;
  }
  else {
   fade.cnt=-1*(1.0f/((float)minutes*60.0f));
   fade.now=1.0f;
  }
  fade.color=color;
  fade.complete=FALSE;
 }
 else {
  // フェード中
  fade.now+=fade.cnt;
  if (fade.now>=1.0f && fade.cnt>0) {
   fade.now=1.0f;
   fade.complete=TRUE;
  }
  if (fade.now<=0.0f && fade.cntFadeMove(FADE_IN, 0.8f, FADE_WHITE)) {
 // フェード完了後の処理
 ………
}
// みたいにして置いておく

打ち合わせに行く

久しぶりに打ち合わせ行ってきました。

新規の数社と打ち合わせしたんだけど、そのうちの1社は勢いのある会社でした。社長がとにかく即断即決。デモを見たら「わかりました。では契約書を送ります」とその場で成立。「数週間後に説明会開いて年内に開始しましょう」と、トントン拍子で話が進みました。

儲かってる所はスピードが違うね。そういえば知人の儲かってる社長さんも、ワンマン気味だけど、すぐに決めてどんどん進めていく人だった。失敗もするけど、数をこなして成功を増やしてる感じかな。

こういう良い所は見習わないとなぁ。

親の見舞いに行く

親が入院したので、帰省して見舞いに行ってきました。

先週手術したのですが、まだ予断を許さない状態です。現在集中治療室にいて、親族のみ、2人ずつ、30分だけという条件で面会できました。

人工呼吸器が取れたばかりなので、身動きはおろか会話もほとんど出来ない状態でした。良くなる事を祈るしかないですね。

ゲーム開発36:坂道の当たり判定2

当たり判定を全面的に作り直しました。

これまでは「壁に当たったらそれ以上動かない」という処理をしていました。これは簡単に計算できるのですが、移動量が大きいと壁に近づけない、壁に埋まると動けなくなるという欠点がありました。それの対策のために色々と条件式を詰め込んだら、それなりに動くようになったものの、ソースがぐちゃぐちゃになったり。まぁ俺の組み方が悪いんだろうけど。

今回は「壁に埋まったら戻す」にしました。これならとにかく壁に体当りして、埋まってしまったらその分戻すというだけなので、ややこしい計算はいりません。これならラクチンだと思ったのですが…複数の物体にぶつかった際に、どこにどれだけ戻せばいいのかわからない。

これに関してはあまり深く考えずに、複数当たっていても1個ずつ処理していく事にしました。このやり方には欠点があって、処理する順番によって結果が変わる可能性があるんだけど、今のところおかしく見えないからいいか。

…といった前提があって、ようやく坂道の処理です。上記の方法では、当たった場合にどれだけ戻せば良いかを計算する訳ですが、坂道の場合、横から当たろうが上から当たろうが、当たったら必ず上方向に戻します。

下記CheckHitSlope()ではキャラクタの右下と左下の点で坂道と当たっているかを計算し、当たっていたら戻りの大きい方を実際に使う値として返しています。slopeを変えることで上り坂も下り坂も、急な坂もなだらかな坂もこの関数で計算出来ます。ちょっと効率が悪かったり、intとLONGが混在してたりするのは気にしないw

思った以上に当たり判定作り直すのに時間かかってしまったので、スケジュール的にやばくなってきました(汗)

//—————————————————————————–
// 当たり判定(坂)
// charaRect:キャラクタの矩形
// myRect:坂道の矩形
// slope:坂道の傾き
// *ret_x:X方向に戻す値
// *ret_y:Y方向に戻す値
// 戻り値:接地したか
//—————————————————————————–
int CField::CheckHitSlope(RECT charaRect, RECT myRect, float slope, int *ret_x, int *ret_y)
{
 int  ret=FALSE, work_y=0;
 LONG top=0, left=0, right=0;

 // 左下の高さと戻す量
 if (myRect.left<=charaRect.left && charaRect.lefttop) {
   left=top-charaRect.bottom;
  }
 }
 // 右下の高さと戻す量
 if (myRect.left<=charaRect.right && charaRect.righttop) {
   right=top-charaRect.bottom;
  }
 }
 // 戻す量の大きい方を使う
 if (left>right) {
  work_y=right;
 }
 else {
  work_y=left;
 }

 // 接地している?
 if (work_y<0) {
  ret=TRUE;
 }

 *ret_x=0;
 *ret_y=work_y;

 return ret;
}

JCBザ・クラスを取得する

JCB THE CLASSを取得しました。黒いクレジットカードです。

去年に引き続き今年もザ・クラスのインビテーションが来てたんですよ。去年は放置したんだけど、今年は何となく申し込んでみました。そしたら何事も無くカードが届いたよ。

調べたら、今年の夏くらいから結構ばらまいてるみたいだね。昔は物凄く審査基準が厳しかったみたいだけど、今は俺みたいな不安定な職の人間にも配るんだなぁ。

まぁ、これまで通りAmazonで買い物するくらいにしか使わないんだけどね。

USB液晶ディスプレイでマルチモニタ

前に取引先に行った時、そこのPCのほとんどが液晶ディスプレイ2枚置いてマルチモニタ化してました。使わせてもらって便利だなぁと思ったけど、ウチの部屋では置く場所がない。

そんな訳でUSBで繋がる小さな液晶ディスプレイを買ってみました。こういうの2年くらい前に流行ってたよね。2年くらい前に見たわ。当時はサイズが4インチくらいだったけど。

買ったのはI-O DATAのLCD-USB10XB-Tです。10.1インチ(1024×600)でタッチパネルになってます。普通にノートPCサイズだから、これ単体でも作業できそうだね。俺はアプリの横幅をどれも1000ピクセルくらいにしてるから、そのまま持ってこれます。

実は最初電源入れた時、メインの液晶に比べて発色が悪いんで、失敗したかなぁと思ったけど、どうも視野角が狭いせいで位置によって極端に色見が変わるみたい。写真ではプリンタの上に載せてるけど、下に置いた方が綺麗に見えるかも。まだ位置調整中。

俺は10個くらいアプリ起動したまま作業する事が多いんで、ウィンドウをそれぞれに分散出来るのは良いです。あとデータとデータの比較がやり易くなるな。

色々試してみます。

迷惑電話対策にナンバーディスプレイを導入する

このところ迷惑電話がかかってきてムカツクので、ナンバーディスプレイを導入して拒否することにしました。

迷惑電話というのは不動産の営業です。数カ月おきくらいに「先週お宅を訪問して留守だったので」という決まり文句から始まり、いつも同じ内容の電話をかけてきます。ちなみに俺は自宅作業で日中ずっと家にいるけど、誰も来てないぞ。

断ったり電話切ったりすると怒り出して喚き散らす。しかも1日何回もかけてくる。こんなやり方でマンション買う奴なんていないだろ常考…

ナンバーディスプレイですが、116に電話したら「3~4時間で設定完了します」との事。申し込み1時間後に試してみたら、もう使えるようになってました。早いね。料金は工事費2100円、月額420円です。

電話機に非通知拒否があるのでそれを設定。前に調べたら非通知でかけてきてたので、これで拒否できます。もし番号通知でかけてきても30件まで拒否登録出来るので、まあ大丈夫でしょう。

これで一安心かな。

コミケ79受かりました(3日目東マ-31b)

コミケ受かりました。3日目の同人ソフトジャンルでです。配置は以下のとこ。

12/31(金) 東マ-31b

今回は今まで制作してた横スクロールアクションゲーム「緋袴きりり(仮)」を完成させるつもりで頑張ります。当初の想定よりかなり小じんまりとしたものになると思いますが(汗)

しかし大晦日か…