初めまして、アルと言います。
卒業研究でアクションゲームを作成しようとしているのですが
スクロールがうまく作れず行き詰っています。
検索で掲示板内を調べたのですが、マップスクロールに関していまいち理解できませんでした。
検索したログで管理人さんの出した例題が
//
#define WINDOW_SIZE_X 640
#define WINDOW_SIZE_Y 480
#define STAGE1_END_X 10000
typedef struct{
int x,y;
}ch_t;
ch_t ch;
という環境だとすると
if(ch.x<WINDOW_SIZE_X/2){
普段どおり背景を描画。
普段どおりキャラを描画。
}
else if(ch.x<STAGE1_END_X-WINDOW_SIZE_X/2){
キャラが進んだ分だけ背景を左にスクロール。
画面中央にキャラを表示。
}
else{
普段どおり背景を描画。
X座標はSTAGE1_END_X-WINDOW_SIZE_Xを左原点にキャラを描画。
}
//
となっているのですが、ちょっとよくわかりません。
私の作っているアクションは、背景は無く(真っ暗)、ただブロックを置いてそこにキャラが乗れる程度です。
DXライブラリ置き場のサンプルプログラムそのまんまですが、私が作ろうとしているプログラムです。
これからどうやってキャラを中心としたマップスクロールを作っていけばいいのでしょうか?
//
マップ//
#define SCREEN_WIDTH (640) // 画面の横幅
#define SCREEN_HEIGHT (480) // 画面の縦幅
#define CHIP_SIZE (32) // 一つのチップのサイズ
#define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅
#define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅
//キャラ
float PlX, PlY ; // プレイヤーの座標(中心座標)
//
当方は、C言語経験は1ヶ月未満です。
どうかご教授をお願いします。
アクションゲームのスクロール
Re:アクションゲームのスクロール
アクションでスクロールというからには、右への横スクロールだと思っていいのでしょうか?
・・すると、横の最大の座標はいくつになりますか?
例えば画面10個分位の横スクロールだと6400位になると思いますが。
それに当たるのが
#define STAGE1_END_X 10000
でして、この場合、最大が10000であると仮定しています。
ch.xという構造体の書き方はOKですか?キャラのX座標を示しています。
わからなければ「構造体」でググって勉強してみてください。
私が書いている
#define WINDOW_SIZE_X 640
#define WINDOW_SIZE_Y 480
は
アルさんの書いていらっしゃる
#define SCREEN_WIDTH (640) // 画面の横幅
#define SCREEN_HEIGHT (480) // 画面の縦幅
と同じ意味です。
どうでしょう、どのへんがわかりませんか?
・・すると、横の最大の座標はいくつになりますか?
例えば画面10個分位の横スクロールだと6400位になると思いますが。
それに当たるのが
#define STAGE1_END_X 10000
でして、この場合、最大が10000であると仮定しています。
ch.xという構造体の書き方はOKですか?キャラのX座標を示しています。
わからなければ「構造体」でググって勉強してみてください。
私が書いている
#define WINDOW_SIZE_X 640
#define WINDOW_SIZE_Y 480
は
アルさんの書いていらっしゃる
#define SCREEN_WIDTH (640) // 画面の横幅
#define SCREEN_HEIGHT (480) // 画面の縦幅
と同じ意味です。
どうでしょう、どのへんがわかりませんか?
Re:アクションゲームのスクロール
すみません……書き方が悪かったです。
えっと、スクロールの方向ですが「左スクロール」です。
構造体は大丈夫です。
//
typedef struct{
int X,Y,img,muki,walking_flag;
}ch_t;
ch_t Grap;
//
となっています。
画面一つ分の横幅は(640)となっています。
横の最大は……考えてませんでしたが、画面10個(6400)にしたいと思います。
問題はこの管理人さんが書いたプログラムで
//以下、プログラム一部(サンプルプログラム、右スクロールから)
int i, j ;
if(Gra.X<(int)SCREEN_WIDTH/2){
// マップの描画
{
for( i = 0 ; i < MAP_HEIGHT ; i ++ )
{
for( j = 0 ; j < MAP_WIDTH ; j ++ )
{
// 1は当たり判定チップを表しているので1のところだけ描画
if( MapData[j] == 1 )
{
DrawBox( j * CHIP_SIZE, i * CHIP_SIZE,
j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
GetColor( 255, 255, 255 ), TRUE ) ;
}
}
}
}
if(Gra.muki == 1)
Gra.img=image[((int)Gra.X%16+(int)Gra.Y%16)/8 + 4]; //画像をセット
if(Gra.muki == 3)
Gra.img=image[((int)Gra.X%16+(int)Gra.Y%16)/8 + 12];
// キャラクタの描画
DrawGraph( ( int )( Gra.X - CHAR_SIZE * 0.5F ), ( int )( Gra.Y - CHAR_SIZE * 0.5F ),
Gra.img, TRUE ) ;
}
else if(Gra.X<STAGE1_END_X - SCREEN_WIDTH/2){
//キャラが進んだ分だけ背景を左にスクロール。
//画面中央にキャラを表示。
}
else{
for( i = 0 ; i < MAP_HEIGHT ; i ++ )
{
for( j = 0 ; j < MAP_WIDTH ; j ++ )
{
// 1は当たり判定チップを表しているので1のところだけ描画
if( MapData[j] == 1 )
{
DrawBox( j * CHIP_SIZE, i * CHIP_SIZE,
j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
GetColor( 255, 255, 255 ), TRUE ) ;
}
}
}
}
//
こうなっていますが
下記の部分に
else if(Gra.X<STAGE1_END_X - SCREEN_WIDTH/2){
//キャラが進んだ分だけ背景を左にスクロール。
//画面中央にキャラを表示。
}
何を入力すればいいのか分かりません。
今の状態ですと、キャラが1画面の半分を過ぎると画面が真っ暗になるだけです。
真っ暗でもマップはそのままで、キャラは動きます。
画面半分より戻ると、画面は正常な状態に戻ります。
またまた、分かりにくい書き方をしていますがどうかご教授をお願いします。
えっと、スクロールの方向ですが「左スクロール」です。
構造体は大丈夫です。
//
typedef struct{
int X,Y,img,muki,walking_flag;
}ch_t;
ch_t Grap;
//
となっています。
画面一つ分の横幅は(640)となっています。
横の最大は……考えてませんでしたが、画面10個(6400)にしたいと思います。
問題はこの管理人さんが書いたプログラムで
//以下、プログラム一部(サンプルプログラム、右スクロールから)
int i, j ;
if(Gra.X<(int)SCREEN_WIDTH/2){
// マップの描画
{
for( i = 0 ; i < MAP_HEIGHT ; i ++ )
{
for( j = 0 ; j < MAP_WIDTH ; j ++ )
{
// 1は当たり判定チップを表しているので1のところだけ描画
if( MapData[j] == 1 )
{
DrawBox( j * CHIP_SIZE, i * CHIP_SIZE,
j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
GetColor( 255, 255, 255 ), TRUE ) ;
}
}
}
}
if(Gra.muki == 1)
Gra.img=image[((int)Gra.X%16+(int)Gra.Y%16)/8 + 4]; //画像をセット
if(Gra.muki == 3)
Gra.img=image[((int)Gra.X%16+(int)Gra.Y%16)/8 + 12];
// キャラクタの描画
DrawGraph( ( int )( Gra.X - CHAR_SIZE * 0.5F ), ( int )( Gra.Y - CHAR_SIZE * 0.5F ),
Gra.img, TRUE ) ;
}
else if(Gra.X<STAGE1_END_X - SCREEN_WIDTH/2){
//キャラが進んだ分だけ背景を左にスクロール。
//画面中央にキャラを表示。
}
else{
for( i = 0 ; i < MAP_HEIGHT ; i ++ )
{
for( j = 0 ; j < MAP_WIDTH ; j ++ )
{
// 1は当たり判定チップを表しているので1のところだけ描画
if( MapData[j] == 1 )
{
DrawBox( j * CHIP_SIZE, i * CHIP_SIZE,
j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
GetColor( 255, 255, 255 ), TRUE ) ;
}
}
}
}
//
こうなっていますが
下記の部分に
else if(Gra.X<STAGE1_END_X - SCREEN_WIDTH/2){
//キャラが進んだ分だけ背景を左にスクロール。
//画面中央にキャラを表示。
}
何を入力すればいいのか分かりません。
今の状態ですと、キャラが1画面の半分を過ぎると画面が真っ暗になるだけです。
真っ暗でもマップはそのままで、キャラは動きます。
画面半分より戻ると、画面は正常な状態に戻ります。
またまた、分かりにくい書き方をしていますがどうかご教授をお願いします。