プログラムメモ
プログラマーの雑記帳みたいなもの
- メモ
MeganeProject
・Main
-index.h
-Main.cpp
-Main.h
-SceneControl.cpp
-SceneControl.h
-Title.cpp
-Title.h
-Option.cpp
-Option.h
-MapSelect.cpp
-MapSelect.h
-PlayAction.cpp
-PlayAction.h
-GameOver.cpp
-GameOver.h
-Ending.cpp
-Ending.h
・ZMap
-index.h
-ZMapDraw.cpp
-ZMapDraw.h
-ZMapLoader.cpp
-ZMapLoader.h
-ZMapDecoder.cpp
-ZMapDecoder.h
・ZData
-index.h
-ZDataSave.cpp
-ZDataSave.h
-ZDataLoad.cpp
-ZDataLoad.h
・ZPlayer
-index.h
-Tyobi.cpp
-Tyobi.h
-Erina.cpp
-Erina.h
-Rize.cpp
-Rize.h
・ZEnemies
-index.h
-Piyo.cpp
-Piyo.h
-Chiki.cpp
-Chiki.h
・ZTraps
-index.h
-Spring.cpp
-Spring.h
-Ladder.cpp
-Ladder.h
-Needle.cpp
-Needle.h
-- チキチータ (2005-10-12 20:35:18) - - yaneSDKの画像読み込み
CFastPlane::Load(const string& strBitmapFileName)
InnerLoad()をよぶ
ファイル名を格納する
CFastPlane::InnerLoad(const string& strFileName)
Release() 初期化みたいな感じ?
ISurface::LoadByType(const string&strBitmapName,int nSurfaceType)
ファイルを読み込んで画像の種類を判別
サーフェースの作成
CFile::Read(const string& strFileName)
InnerRead()をよぶだけ
CFile::InnerRead(const string& filename)
filename[0] == '!'のときm_lpFileMemPosにm_lpFileAdrを格納
メモリからのロードとする。
ファイルのとき
m_lpFileAdrにGlobalAllocでメモリ確保
::ReadFile()でm_lpFileAdrにファイルを格納
CGraphicLoader::LoadPicture(const CFile& file)
CGraphicLoader::LoadPictureByOwn1(const CFile& file)
ビットマップを読み込むときによばれる
CFile::GetMemory()
m_lpFileAdrを返す。
メモリ上に配置したデータを、以下のようにして「!」で始まり、16進数の文字列でメモリの先頭アドレスと、そのブロックのサイズをファイル名として指定して読み込ませることができる。
wsprintf(buf,"!%x,%x",lpsz,strlen(lpsz)+1);
-- 質屋 (2005-10-07 17:00:54) - 今map配列はBYTE型で定義しています。
よって一つの32×32ブロック内に
2^8=256種類の情報を格納することができます
とりあえず思いつく分だけの情報の種類を定義していきましょう。
0;何もない(素通りすることができる)
1;壁(さわったり乗ったりすることが出来る)
2;壊せるもの(ブロック)
3;壊せるもの(爆弾ブロック)
10;ダメージを受けるもの(通ることが出来る、吹き飛ばない)
11;ダメージを受けるもの(通ることが出来る、吹き飛ぶ)
12;ダメージを受けるもの(触ったり乗ったりできる、吹き飛ばない)
13;ダメージを受けるもの(触ったり乗ったりできる、吹き飛ぶ)
19;触れると即死する
20;上昇気流1(落下スピードが少し遅くなる)
25;下降気流1(落下スピードが少し速くなる)
-- チキチータ (2005-08-24 15:43:45) - BOOL,BOOLEAN:1ビット論理型変数、TRUEまたはFALSEを格納する。
BYTE:8ビットの符号なし整数
WORD:16ビットの符号なし整数
LONG:32ビットの符号付き整数
DWORD:32ビットの符号なし整数
LONGLONG:64ビットの符号付き整数
ULONGLONG:64ビットの符号なし整数
-- チキチータ (2005-08-14 10:00:09) - windowsプログラムのデータ型について
マシンによってはint型などのビット幅が異なる可能性がある。
サイズが異なるだけでなく、ビット演算などで障害が起こる可能性がある。
これを解決するためにwindows.hが確立したデータ型を定義している
上記に、それを示す -- チキチータ (2005-08-14 09:56:40) - 当たり判定についてヤネさんのHPからの返答
1185 ナマエ:m_isDefense 2005/08/13(土) 04:21
たぶん、当たり判定や矩形判定でGoogleで検索したと思いますが、
チキチータさんの四角形判定で十分速いと思います。
円や他の複雑な判定の場合は、大小様々な四角形で近似します。
肝心なのは、ピーク時の処理時間で処理落ちしなければ良いので、
十分なマージンを確保するようにコード生成で最適化ください。
最適化については、やね先生、PEACE CODE様のところがとても役に立ちました。 http://www.sun-inet.or.jp/~yaneurao/intensive/tips3.html http://www.aya.or.jp/~sanami/peace/memorial/code11-20.html 自分で処理時間を計測することが大切よ。ちゅ。
1186 ナマエ:やねうらお 2005/08/13(土) 07:23
画面上にある障害物が動かないのであれば、マップ配列
たとえば map[1024][30]のようなものを用意して、その配列を
調べるだけでヨロチイ。
自分のキャラがスクリーン座標の(x,y)に居て、
スクリーン座標(0,0)が仮想画面(vx,vy)を表しているとすれば
自分のキャラは仮想画面上では(x+vx,y+vy)に居ることになる。
マップチップ1つが32×32だとすれば、↑の座標を32で割って
mx = (v+vx)/32; my = (v+vy)/32
足元 = map[mx][my+1];
のようにすれば自分の足元のマップチップが調べられる。
地形上で移動しているものがある場合。
画面外にあるものは、はしょれるとして..
画面内に移動しているものが10個以下なら、それぞれ
当たり判定を調べても大した計算量ではないので
それぞれ調べるとヨロチイ。
画面内と画面外を移動しているものが数百あって、かつ、
そいつらと当たり判定を調べないといけないのが自キャラのみ
ならず敵キャラも..という場合は、map配列と同じ趣旨の配列
(仮にここではsmapと名づける)を用意してそいつに移動物の
情報を書き込んでいくとヨロチイ。
たとえば移動物が32種類あるなら、それぞれ1,2,4,8,16,..というように
2のn乗の数値を割り当てといて、それをsmap配列に書き込んでいく。
smap配列は、毎フレームまずゼロクリアしたあと、以下のようにビットORで
書き込んでいく。書き込むときは、その障害物より、ひとまわり大きめの
矩形を考えて書き込む。ひとまわり大きな矩形とは、マップチップサイズが
32*32だとしたら、32でalignすることと同値なので、ビット演算で出来る。
例)
32で繰り下げのalign : x = x & ~32;
32で繰り上げのalign : x = (x+31) & ~ 32;
で、ひとまわり大きな矩形が求まったら、それをsmap配列に書き込む。
smap[sx][sy] |= 2;
あとは、主人公の足元 = smap[mx][my+1]で足元の状態が調べられる。
仮に 5という数字が書いてあったとしたら、これは1という障害物と4という障害物
があるんじゃね?という意味なので、1という障害物すべてと4という障害物すべてに
ついて正確に調べなおす。たいていは障害物がないほうが普通なのでこれで
大幅に衝突判定を回避できる。
この↑正確に調べなおす というのが大変だと思えば、32種類ではなく、
その障害物のオブジェクトナンバー(例:オブジェクトへのポインタ等)を
smap配列に書き込んでおく方法もある。これなら、該当オブジェクトだけ
調べに行くことが出来る。また、smap配列に書き込むときに、すでに
他のオブジェクトナンバーが書き込まれていれば、その右隣に書き込む。
(hash tableで、hash値がすでに書き込まれているときの処理を想像すればヨロチイ)
などなど。
-- チキチータ (2005-08-13 09:11:57)