雷輝さんどうも、DXライブラリの管理人です。
なるほど、そういうことでしたか。
うーん、一応縦21枚並べた画像を作成する方法はあるのですが、非公開の
以下の関数を幾つか使うことになるので少し面倒かもしれません。
// 画像ファイルから基本イメージデータを構築する
// FileName : 読み込む画像ファイルのパス
// BaseImage : 読み込んだ画像の情報を格納する BASEIMAGE 構造体のアドレス
// 戻り値 : 0=成功 -1=エラー
int CreateBaseImageToFile( char *FileName, BASEIMAGE *BaseImage ) ;
// ARGB8カラーの空の基本イメージデータを作成する
// SizeX, SizeY : 作成する画像のサイズ
// BaseImage : 作成した画像の情報を格納する BASEIMAGE 構造体のアドレス
// 戻り値 : 0=成功 -1=エラー
int CreateARGB8ColorBaseImage( int SizeX, int SizeY, BASEIMAGE *BaseImage ) ;
// 基本イメージデータの後始末を行う
// BaseImage : 格納された画像の情報を開放する BASEIMAGE 構造体のアドレス
// 戻り値 : 0=成功 -1=エラー
int ReleaseBaseImage( BASEIMAGE *BaseImage ) ;
// 基本イメージデータを転送する
// DestX, DestY : 転送先画像の転送先座標
// SrcBaseImage : 転送元の画像の情報が格納された BASEIMAGE 構造体のアドレス
// DestBaseImage : 転送先の画像の情報が格納された BASEIMAGE 構造体のアドレス
// 戻り値 : 0=成功 -1=エラー
int BltBaseImage( int DestX, int DestY, BASEIMAGE *SrcBaseImage, BASEIMAGE *DestBaseImage ) ;
// 基本イメージデータから画像ハンドルを作成する
// BaseImage : 画像ハンドルの元としたい画像の情報が格納された BASEIMAGE 構造体のアドレス
// 戻り値 : -1=エラー -1以外=画像ハンドル
int CreateGraphFromBaseImage( BASEIMAGE *BaseImage ) ;
上記の関数は LoadGraph や DrawGraph とは完全に独立した画像システムで、
簡単に DrawGraph 系の関数と対応させると
画像ハンドル(int型の数値) → BaseImage構造体
MakeGraph → CreateARGB8ColorBaseImage
LoadGraph → CreateBaseImageToFile
DeleteGraph → ReleaseBaseImage
DrawGraph → BltBaseImage
となっています。
DrawGraph 系との違いは DirectX を使用していないのでハードウエアや
DirectX の制約を受けないという点です。
今回は CreateARGB8ColorBaseImage で 120x1260 の画像を作成して、そこに
7種類の画像を縦21枚描画して、出来上がった画像を画像ハンドルとして
使用する、ということをするためにこの画像システムを使用します。
(設定次第で MakeGraph で作成した画像にも描画処理を行うことが出来ますが、
ハードウエアやDirectXの制約を受けるので画像作成の為に使うのはあまり良くありません)
で、とりあえずこれらの関数を使用して 120x1260 の画像を作成する
プログラムを組んでみましたので、宜しければこのプログラムを参考に
CreateARGB8ColorBaseImage 等の関数を使用した画像作成プログラムを
組んでみてください。
#include "DxLib.h"
#define FILE_NUM (7)
#define PATTERN_NUM (21)
#define IMAGE_HEIGHT (60)
// 21個分の画像パターン
int Pattern[PATTERN_NUM] =
{
0, 1, 2, 3, 4, 5, 6,
5, 4, 3, 2, 1, 0, 6,
2, 4, 6, 3, 5, 1, 0
};
// 使用する7つの画像
char *FileName[FILE_NUM] =
{
"Pattern0.bmp",
"Pattern1.bmp",
"Pattern2.bmp",
"Pattern3.bmp",
"Pattern4.bmp",
"Pattern5.bmp",
"Pattern6.bmp",
};
// 素となる7つの画像
BASEIMAGE MaterialImage[FILE_NUM];
// 画像ハンドルを作成する関数
int CreateHandle( int *pat )
{
int i;
int NewHandle;
BASEIMAGE TempImage;
// 画像ハンドルの元となる 120x1260 のサイズの画像を作成
CreateARGB8ColorBaseImage( 120, IMAGE_HEIGHT * PATTERN_NUM, &TempImage );
// 120x1260 の画像に縦21枚の画像を描画(というか転送)
for( i = 0; i < PATTERN_NUM; i ++ )
BltBaseImage( 0, i * IMAGE_HEIGHT, &MaterialImage[pat[i]], &TempImage );
// 120x1260 の画像から DrawGraph 等で使用できる画像ハンドルを作成
NewHandle = CreateGraphFromBaseImage( &TempImage );
// 120x1260 の画像を解放(画像ハンドルの画像イメージは他の場所に確保されているので解放しても大丈夫)
ReleaseBaseImage( &TempImage );
// 作成した画像ハンドルを返す
return NewHandle;
}
// WinMain 関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int x, add, i;
int GraphHandle;
// ウインドウモードで実行する
ChangeWindowMode( TRUE );
// DXライブラリの初期化
if( DxLib_Init() == -1 )
return -1;
// 素となる7枚の画像を読み込む
for( i = 0; i < FILE_NUM; i ++ )
CreateBaseImageToFile( FileName[i], &MaterialImage[i] );
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// パターンから画像ハンドルを作成
GraphHandle = CreateHandle( Pattern );
// 作成した画像を左右に動かす処理の為の変数を初期化
x = 0;
add = 8;
// メインループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 動作処理
x += add;
if( x < 0 || x >= 640 ) add = -add;
// 作成した画像を描画して表画面に反映させる
ClearDrawScreen();
DrawGraph( x, 0, GraphHandle, TRUE );
ScreenFlip();
}
// 素となる7枚の画像を解放する
for( i = 0; i < FILE_NUM; i ++ )
ReleaseBaseImage( &MaterialImage[i] );
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
(もし上記のプログラムだけでは分からない点などありましたらご質問下さい)