自由帳:Cページ -2ページ目

自由帳:Cページ

プログラム学習記:このブログは、管理人葉月によるゲーム研究の場です。

ここにあるソースは、実験的な物や研究的なものを多大に含んでいます。

たとえ何か問題が発生しても責任は負いません。



とりあえず小屋が完成しましたw

屋根の作り方で散々悩みましたが無事完成です。


やり方としては、四角い画像(屋根)を縦に2つ並べて自由変形。


int DrawModiGraph( int x1, int y1, int x2, int y2,
          int x3, int y3, int x4, int y4,
          int GrHandle , int TransFlag );

で、上図のように平行四辺形にして完成!


この変形が大変でした。

なんせ数学の出来ない上に、左右の区別ができないプログラマなもんで、

逐一、この位置はどっちだ?

とか、2次関数の教科書引っ張り出してxが横で?ええとyが縦??

とか言いながらあーでもないこーでもないと必死で計算していたわけです。


そしてやっとこさ。

プログラムはもうちっと改良せにゃならんので今回は省きます。


今回は、構造体とポインタを使用しております。

えーちなみに、描画されている線のようなものは、

自作で作った迷路d動かした時に消去されずに残ったメイの起動です。


ちなみにメイってのはついさっき即効で思いついたキャラの名前なのは内緒の方向でお願いしますねw(ぇ



//構造体 zは座標のz
struct z{

    int x;
    int y;

}chara,*ch;


char KeyBuf[ 256 ] ;
int chara1[11];

int gra;
int i,j;

ch = &chara;  //charaのアドレスをポインタchへ
ch -> x = 60;
ch -> y = 60;


SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "img/kyara2.bmp" , 12 , 3 , 4 , 32 , 32 , chara1 ) ;


while(!CheckHitKey( KEY_INPUT_ESCAPE )){
GetHitKeyStateAll( KeyBuf ) ;       // すべてのキーの状態を得る

if( KeyBuf[ KEY_INPUT_LEFT ] == 1 ){
   ch -> x--;
   i=10;
}

if( KeyBuf[ KEY_INPUT_UP ] == 1 ){
   ch -> y--;
   i=1;
}

if( KeyBuf[ KEY_INPUT_RIGHT ] == 1 ){
   ch -> x++;
   i=4;
}

if( KeyBuf[ KEY_INPUT_DOWN ] == 1 ){
   ch -> y++;
   i=7;
}


DrawGraph( ch -> x , ch -> y , chara1[i] , TRUE ) ; //画像を描画
ScreenFlip();


}

※ -> のマークはアローダイアグラムといい、ポインタが構造体のメンバ(x,y)へアクセスする方法です。

この画像を敷き詰めて、




こんな風に作ってみました。



ソースは、


#define MAP_SIZE 71 // マップチップ一つの画像サイズ
#define MAP_WIDTH 11 // マップの幅
#define MAP_HEIGHT 9 // マップの縦長さ


// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
  { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 } ,
  { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 } ,
  { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 } ,
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
} ;


int gra;
int i,j;


gra = LoadGraph("img/green1.bmp");


// マップを描く
for( i = 0 ; i < MAP_HEIGHT ; i ++ ){
    for( j = 0 ; j < MAP_WIDTH ; j ++ ){


     if( MapData[ i ][ j ] == 0 ){  // MapData[ MAP_HEIGHT ][ MAP_WIDTH ] が 0なら画像を描画

      DrawGraph( i * MAP_SIZE , j * MAP_SIZE , gra , FALSE ) ;
     }
   }
}


です。

ちなみに、
DrawGraph( i * MAP_SIZE , j * MAP_SIZE , gra , FALSE )の、


i * MAP_SIZE と j * MAP_SIZE は、

マップを描く位置を表しています。


見ての通り…じゃないかもしれませんが、画像を分割してみました。

ついでに画像も変更です。


int kyara1[11];


LoadDivGraph( "kyara2.bmp" , 12 , 3 , 4 , 32 , 32 , kyara1 ) ;


DrawGraph( 30 ,50 , kyara1[7] , TRUE ) ;
DrawGraph( 100 ,50 , kyara1[4] , TRUE ) ;
DrawGraph( 170 ,50 , kyara1[2] , TRUE ) ;
DrawGraph( 240 ,50 , kyara1[10] , TRUE ) ;


ちなみにこれは、下の画像を、配列で分け、格納してから表示しています。



左上から

0 ,1 ,2

3 ,4 ,5

6 ,7 ,8

9 ,10,11

の順です。


とりあえず、基礎的な学習でもしながら、ゲームのアイディアを練っていこうかと思います。