void CPicture::LoadMapPic(){ tilePic[0] = LoadGraph("Chikuwa2/Void.png"); tilePic[1] = LoadGraph("Chikuwa2/Grass.png"); tilePic[2] = LoadGraph("Chikuwa2/River.png"); tilePic[3] = LoadGraph("Chikuwa2/BridgeV.png"); tilePic[4] = LoadGraph("Chikuwa2/BridgeH.png"); tilePic[5] = LoadGraph("Chikuwa2/Mountain.png"); townPic = LoadGraph("Chikuwa2/Town.png"); coin=LoadGraph("Chikuwa2/Coin.png"); arrowPic[0] = LoadGraph("Chikuwa2/ArrowUp.png"); arrowPic[1] = LoadGraph("Chikuwa2/ArrowDown.png"); arrowPic[2] = LoadGraph("Chikuwa2/ArrowLeft.png"); arrowPic[3] = LoadGraph("Chikuwa2/ArrowRight.png"); mapHandle[1] = LoadSoftImage("Chikuwa2/Map1.png"); mapHandle[2] = LoadSoftImage("Chikuwa2/Map2.png"); mapHandle[3] = LoadSoftImage("Chikuwa2/Map3.png"); mapHandle[4] = LoadSoftImage("Chikuwa2/Map4.png"); mapHandle[5] = LoadSoftImage("Chikuwa2/Map5.png"); mapHandle[6] = LoadSoftImage("Chikuwa2/Map6.png"); TmapHandle[1] = LoadSoftImage("Chikuwa2/Map1Town.png"); TmapHandle[2] = LoadSoftImage("Chikuwa2/Map2Town.png"); TmapHandle[3] = LoadSoftImage("Chikuwa2/Map3Town.png"); TmapHandle[4] = LoadSoftImage("Chikuwa2/Map4Town.png"); TmapHandle[5] = LoadSoftImage("Chikuwa2/Map5Town.png"); TmapHandle[6] = LoadSoftImage("Chikuwa2/Map6Town.png"); }
// コンストラクタ FloatingDungeon::FloatingDungeon( double CellSize, double CellThickness, char *FileName ) : m_dCellSize( CellSize ), m_dCellThickness( CellThickness ) { // ポリゴン情報(vectorで定義) // メモリはどのように確保するか? // マップ情報定義ビットマップを読み込む int BitMapHandle = LoadSoftImage( FileName ); // マップ情報定義ビットマップのサイズを取得(縦横) int W, H; GetSoftImageSize( BitMapHandle, &W, &H ) ; int TotalHorizSidesNum = W*(H+1); // タイルの辺で水平なものの総数 int TotalSidesNum = TotalHorizSidesNum + H*(W+1); // タイルの辺の総数 // タイルの重なる辺を除去するため辺のリストを生成 // 面の向きを持たせる必要がある vector<int> SidesList( TotalSidesNum, 0 ); // マップ情報定義ビットマップを解析。 int r, g, b, a ; for( int i=0; i<W; i++) { for( int j=0; j<H; j++) { GetPixelSoftImage( BitMapHandle, j, i, &r, &g, &b, &a ) ; // r==0 でなければ、cell有りと判断 if( r==0 ) { // 面のポリゴンを生成 Vector3D TL, BL, TR, BR, Nrm; // 4頂点を定義 TR= Vector3D( m_dCellSize*(i+1), 0, m_dCellSize*(j+1) ); TL= Vector3D( m_dCellSize*(i ), 0, m_dCellSize*(j+1) ); BR= Vector3D( m_dCellSize*(i+1), 0, m_dCellSize*(j ) ); BL= Vector3D( m_dCellSize*(i ), 0, m_dCellSize*(j ) ); // 法線ベクトルを定義 Nrm = Vector3D( 0, 1, 0 ); // ##### m_pRawVertexPos // 三角形1 m_RawVertexPosList.push_back( TL ); m_RawVertexPosList.push_back( TR ); m_RawVertexPosList.push_back( BL ); // 三角形2 m_RawVertexPosList.push_back( TR ); m_RawVertexPosList.push_back( BL ); m_RawVertexPosList.push_back( BR ); // ##### m_pRawVertexNrm // 三角形1 m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); // 三角形2 m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); // ##### SideList に辺の格納 & 重なる辺を除去 // タイルの4辺のエンコード int T = W*j + i; int B = W*(j+1) + i; int L = H*i + j + TotalHorizSidesNum; int R = H*(i+1) + j + TotalHorizSidesNum; // 排他的論理和をとることで重複する辺を除去する。 // 辺の向きも同時に格納する SidesList[T] = 1 * (int)(SidesList[T]==0); SidesList[B] = -1 * (int)(SidesList[B]==0); SidesList[L] = 1 * (int)(SidesList[L]==0); SidesList[R] = -1 * (int)(SidesList[R]==0); } } } // 辺のポリゴンを生成 for( int i=0; i<TotalSidesNum; i++ ) { if( SidesList[i] != 0 ) { // 辺が存在 // インデックスから辺のパラメータをデコードする Vector3D BS, BG, ES, EG, Nrm; if( i < TotalHorizSidesNum ) { // 水平な辺 int y = i/W; int x = i%W; // 位置 : (x,y) - (x+1,y) // 向き : (0,1) * SidesList[i] // 4頂点を定義 BS = Vector3D( m_dCellSize* x , 0, m_dCellSize*y ); BG = Vector3D( m_dCellSize* x , -m_dCellThickness, m_dCellSize*y ); ES = Vector3D( m_dCellSize*(x+1), 0, m_dCellSize*y ); EG = Vector3D( m_dCellSize*(x+1), -m_dCellThickness, m_dCellSize*y ); // 法線ベクトルを定義 Nrm = Vector3D( 0, 0, 1 ); Nrm *= SidesList[i]; } else { // 垂直な辺 int k = i - TotalHorizSidesNum; int x = k/H; int y = k%H; // 位置 : (x,y) - (x,y+1) // 向き : (1,0) * SidesList[i] // 4頂点を定義 BS = Vector3D( m_dCellSize* x , 0, m_dCellSize* y ); BG = Vector3D( m_dCellSize* x , -m_dCellThickness, m_dCellSize* y ); ES = Vector3D( m_dCellSize* x , 0, m_dCellSize*(y+1) ); EG = Vector3D( m_dCellSize* x , -m_dCellThickness, m_dCellSize*(y+1) ); // 法線ベクトルを定義 Nrm = Vector3D( 1, 0, 0 ); Nrm *= SidesList[i]; } // 辺のポリゴンを生成 // ##### m_pRawVertexPos // 三角形1 m_RawVertexPosList.push_back( BS ); m_RawVertexPosList.push_back( ES ); m_RawVertexPosList.push_back( BG ); // 三角形2 m_RawVertexPosList.push_back( ES ); m_RawVertexPosList.push_back( BG ); m_RawVertexPosList.push_back( EG ); // ##### m_pRawVertexNrm // 三角形1 m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); // 三角形2 m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); m_RawVertexNrmList.push_back( Nrm ); } } // マップ情報定義ビットマップの情報を破棄 DeleteSoftImage( BitMapHandle ); // m_pVertex の生成 int VectexNum = m_RawVertexPosList.size(); m_iPolygonNum = VectexNum/3; m_pVertex = new VERTEX3D[VectexNum]; // color と使わない要素を代入する COLOR_U8 DifColor = GetColorU8( 255, 255, 255, 0 ); COLOR_U8 SpcColor = GetColorU8( 255, 255, 255, 0 ); for( int i=0; i<VectexNum; i++ ) { m_pVertex[i].dif = DifColor; m_pVertex[i].spc = SpcColor; m_pVertex[i].su = 0.0f; m_pVertex[i].sv = 0.0f; } resetVertex(); };