忍者ブログ
  • 2025.01
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 2025.03
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2025/02/22 17:38 】 |
ascii文字列描画
先日の数値描画機能を使って、問題番号を表示するようにした。
すると、問題の名前も書きたくなった。
で、アルファベットの大文字を書けるようにした。
数値と文字で別々なのも効率が悪いので、結局、ascii文字コード表全部を描画できる機能を作り、2つは削除した。

void drawAscii(Point_t point, float height, const char *str, enum EAlign = ALIGN_LEFT);

数値を描画したいときは、

char buf[32];
snprintf(buf, 31, "%03d", nVal);
drawAscii(point, height, buf, ALIGN_RIGHT);

のようにする。

itoa()を使えば楽じゃん、と最初は思ったのだが、
itoa()は標準じゃないそうだ。atoi()は標準だけど。
 http://ja.wikipedia.org/wiki/Itoa
itoaを使うと、数値の先頭に0を付けるとかできないし、floatは自分で変換するよりないということなどを考えると、結局snprintf()でやるのが良さそうだ。
PR
【2011/02/09 02:07 】 | 開発日記 | 有り難いご意見(0) | トラックバック()
GLでテクスチャが描画されない
よくある原因、確認すべき事項

・テクスチャサイズ(縦、横)が2の累乗数になっていない。

【2011/02/06 15:57 】 | よくある罠 | 有り難いご意見(0) | トラックバック()
数字の描画機能
問題番号を表すため、数字だけでも自前で描画しようと思い、実装。(文字はいずれ考える必要がある)

//定義
void drawDigitsAlignRight(Point_t point, float height, int num);

ゲーム側からの使い方=================
描画座標と、数字のサイズ(縦のみ指定。横は自動で決める)と、表示する数値を指定。
右寄せで描画する。point で指定した座標が、一の位の数字の右上にあたる。
右寄せにしたのは、実装しやすかったのと、実際に使う回数がこちらのほうが多そうだったから。
 int型変数の10進数での桁数を求める関数って用意されていないんだろうか。

この関数の定義は、DrawHelperという機能群の中に入れることにした。
描画機能自体にこの便利機能が入っているのはおかしいからだ。
ゲーム開始時に、DrawHelperの初期化を呼ぶコードを追加。


実装=======================
uv座標を指定して描画できる機能をGL描画機構に追加。
テクスチャは、 0123456789-+., と等間隔に描いたもの。サイズは縦横ともに2の累乗数。
桁の下から順に右から描画していく。
難しいことは特にない。

【2011/02/06 15:56 】 | 開発日記 | 有り難いご意見(0) | トラックバック()
ゲームステート間の情報渡しのやり方
ゲームステートの遷移の際に、必要な情報をどう渡すか

例えば、タイトル画面で問題番号を選択し、ゲーム画面に遷移してその番号をロードするような場合。
問題番号を渡す必要がある。

1.リザルト構造体を生成し、そのまま渡す

void CGameMain::execState()
{
getGame().init();
Title::Result res = getTitle().getResult();
getGame().setTitleResult(res);
}

これだと、GameクラスがTitleクラスを知っていなければならない。
そこは互いに独立していたい。

2.リザルト構造体を生成し、バラして渡す

void CGameMain::execState()
{
getGame().init();
Title::Result res = getTitle().getResut();
getGame().setProbNo(res.probNo);
getGame().setMode(res.mode);
}

これだと、TitleクラスとGameクラスにいちいちアクセサ関数を用意しなければならないので面倒。

3.フレンドクラスにして、すべてが見えているクラスが個々に渡す

void CGameMain::execState()
{
getGame().init();
getGame().probNo = getTitle().probNo;
getGame().mode = getTitle().mode;
}

class Title{
friend class CGameMain;
};
class Game{
friend class CGameMain;
};

このあたりが一番良さそう。
Gameクラスにもちゃんと同じ変数を用意して、値コピーするというところがポイント。
毎回Titleクラスに参照しにいくのは良くない。Titleクラスがないと動作しなくなる可能性があるから。

Titleクラス、Gameクラスにおいては、CGameMainクラスは前方宣言だけしていれば良く、インクルードの必要は無い。だから新たな依存関係も生まれない。
【2011/02/06 13:10 】 | 開発日記 | 有り難いご意見(0) | トラックバック()
Inputクラス・実装
第2版を参照のこと


Inputクラスの実装。

現状対応しているのは、大きさのあるボタンだけ。=つまりタッチスクリーン。

【2011/01/29 15:48 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
デバッグコードの実行時有効化に便利なマクロ
何らかの変数の中身を出力するデバッグコードがあるとする。
Objective-Cでいうと、NSObject の description()関数のような。
毎フレーム出していると、他の出力が流れてしまうため、特定のタイミングでだけ出したい、ということが良くある。

そういうことがすぐできるマクロを用意した。


#define DEBUG_EVERYTIME_BEGIN(b) \
do { \
static bool b = 0; \
if (b) {

#define DEBUG_EVERYTIME_END() \
}\
} while(0)


一回だけ実行したいときはこっち。

#define DEBUG_ONETIME_BEGIN(b) \
do { \
static bool b = 0; \
if (b) {

#define DEBUG_ONETIME_END() \
}\
b = 0; \
} while(0)



使用例はこうなる。

DEBUG_ONETIME_BEGIN(b);
doSomeDebug();
DEBUG_ONETIME_END();



応用して、ヒットカウントが特定の回数のときだけ実行とか、
ある変数を監視しておいて、特定の値のときだけ実行とかが考えられる。

当然、リリースビルドのときにはデバッグコードが消えるようにしておきたいのだが、
その方法がまだ思いつかない。
【2011/01/29 14:53 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
可変引数とPOD
可変引数には、POD型の変数しか渡せない。
ワーニングが表示され、そのまま実行すると実行時エラーが発生してしまう。
va_arg()の第2引数もPOD型しか使えない。

○可変引数
myPrintf( const char*, ...);
の「...」の部分。

○POD型
Plain Old Dataの略。
バイト列だけで表現できる変数型のこと。
int, floatなどのプリミティブ型や、
以下の条件を満たす構造体(struct, class, union)もPODに含まれる。
--
ユーザが定義するコンストラクタを持たない
ユーザが定義するデストラクタを持たない
ユーザが定義するコピーコンストラクタを持たない
仮想関数を持たない
基底クラスを持たない
private または protected のnon-staticメンバ変数を持たない
参照であるnon-staticメンバ変数を持たない
--
生成や代入がデフォルトの通りだとか、
つまり、何も考えずにプリミティブと同じように使える構造体ならPOD、ということ。


参考ページ
http://www.game-create.com/archives/302

【2011/01/28 01:20 】 | C/C++ | 有り難いご意見(0) | トラックバック()
OpenGL周りのコード
OpenGLを使用する際の大まかな流れ。
最低限必要なことだけ抜き出しています。
エラーチェックなどは一切省いてあります。

XCodeで、OpenGLプロジェクトとして作成すると自動で作られるコードです。


ViewController
シェーダ周りの初期化を行う。
シェーダの中身に何が書いてあるか、ゲーム側でどう描画するかなどは関知しない。
【2011/01/23 15:59 】 | 開発日記 | 有り難いご意見(0) | トラックバック()
iPadアプリにする方法
普通にXCodeでアプリを作っていると、iPhoneアプリケーションになります。
iPad実機やiPadシミュレータで動かした場合、iPhoneサイズの画面での表示になります。(右下に、2倍表示のボタンがある)

iPadで動くアプリケーションにしたい場合は、プロジェクトの設定を変更する必要があります。

---
プロジェクト→プロジェクト設定を編集
でプロジェクト設定ウィンドウを開き、

ビルドタブ→Deployment→Targeted Device Family
の項目を選択します。

この項目は以下のどれかを選択します
iPhone
iPad
iPhone/iPad


【2011/01/23 14:28 】 | iPhone | 有り難いご意見(0) | トラックバック()
日本でいちばん大切にしたい会社
「日本でいちばん大切にしたい会社」




企業規模も大きいわけではない、業績だって大企業に比べたら全然小さい。
でも、社員や顧客の満足度が高く、世の人や社会のためになる経営に取り組んでいる会社を取り上げた書籍。

著者が中小企業の研究・支援をしているそうで、今まで見てきた企業の中から特に大切にしたいと思う会社5社(+9社)を取り上げている。


知的障害者に働く環境を提供するために採用を続けている会社では、
仕事や設備の方を社員に合わせ、材料と道具を同じ色でそろえたり、目盛りが読めなくても測れるように重りや砂時計を使ったりしている。

会社や工場の敷地に一般の人が入れて、公園や通学路にしている寒天メーカーがあったり、
地元から離れないでやっていっている義肢装具会社や菓子メーカーなどなど。


利益を出すということ以上の使命感があることと、
原因を外のせいにしない、自分の内に求めるということ、
他には無い工夫を凝らしていることが共通点かな。

大型スーパー撤退でシャッター通りになった商店街で、贈り物需要に特化した果物屋。
ぎりぎりの利益だけ残し、あとはヨーロッパから職人を呼び寄せていいものだけを作って徐々に評判をあげていった菓子メーカー。
TVで紹介されたための一時のブームにすぎない、と大量注文を断り続けた寒天メーカー。

社員の通勤時の右折禁止はやり過ぎじゃないかとも思うけど、
地域の人たちをこんなに考えてる会社があるんですねえ。

でも、顧客や社会の前に、まず社員の満足が大事、社員の満足がなければ顧客に満足は与えられない、とも言っており、
そこは同感。
【2011/01/10 12:11 】 | 書評 | 有り難いご意見(0) | トラックバック()
<<前ページ | ホーム | 次ページ>>