- 1 名前:名前は開発中のものです。 mailto:sage [03/05/25 17:57 ID:UyCopla6.net]
- よろしく
- 60 名前:名前は開発中のものです。 mailto:sage [2005/06/15(水) 15:58:31 ID:J79aeXl5.net]
- >>59
昔のゲームを逆アセンブルで解析してみて参考にするのは、どうだろう… 私は、解析したことがないので、どうなっているのか分かりませんが、 少し昔の2Dアクションゲーム(ロックマン、マリオ、魔界村、ソニック、スペランカー、etc) のマップは、おそらく32×32ドット(24×24ドット)程度の大きさで区切られたマスの組み合わせで 表現されていると思われます。 それを、2次元配列でint Map[300][300]={ {0,0,0,1,0,1,…のように表して 0を当たり判定なし、0以外の値(1など)を当たり判定ありとすれば、マップデータは完成。 ●そのマップデータを画面に表現するには、 sx,syをx,y方向別のスクロール管理変数 画面の解像度を320×240とすると void DrawMap() { int stx=sx/32;int edx=sx+320/32; int sty=sy/32;int edy=sy+240/32; for(int i=stx;i<edx;i++) { for(int j=sty;i<edy;j++) { DrawMapChip(map[i][j],i*32-sx,j*32-sy) } } }
- 61 名前:名前は開発中のものです。 mailto:sage [2005/06/15(水) 16:02:04 ID:J79aeXl5.net]
- ●スクロールは、常にメインキャラクターを画面の中心に置いておきたい訳だから
void CalcScroll(int *sx,int *sy) { *sx=mx-320/2; *sy=my-240/2; if (sx<0) sx=0; if (sy<0) sy=0; if (sx>32*200) sx=32*200; if (sy>32*200) sy=32*200; } だったかな… ちなみにmx,myはメインキャラクターのx,y座標
- 62 名前:名前は開発中のものです。 mailto:sage [2005/06/15(水) 16:54:50 ID:J79aeXl5.net]
- 当たり判定は、いろいろな方法(ベクトル、三平方、色判定など)があるけども、
メインキャラクターが発射した弾と敵キャラとの当たり判定なら、単純に矩形(くけい)の 当たり判定で済みます。 ●弾の座標を(ax,ay)、敵の座標を(bx,by)とした場合、 if(ax<bx2 && ax2>bx && ay<by2 && ay2>by) { } で当たっているか、否かが分かります。
- 63 名前:名前は開発中のものです。 mailto:sage [2005/06/15(水) 16:55:21 ID:J79aeXl5.net]
- ●メインキャラクターとマップとの当たり判定は、
□x座標の移動処理の直後に //左上と左下 if(Map[x/32][y/32]!=0 || Map[x/32,(y+height)/32]!=0) { x=(x/32+1)*32; } //右上と右下 if(Map[(x+width)/32,y/32]!=0 || Map[(x+width)/32,(y+height)/32]!=0) { x=(x/32)*32; } で □y座標の移動処理の直後に //左上と右上 If(Map[x/32,y/32]!=0 || Map[(x+31)/32,y/32]!=0) { y=(y/32+1)*32; } //左下と右下 If(Map[x/32,(y+31)/32]!=0 || Map[(x+31)/32,(y+31)/32)!=0 { y=(y/32)*32; } とやればできます。どうしてそうなるのかは、 計算式を参考に図を書いてみれば分かると思います。
|

|