アクションゲームのスクロール

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アル

アクションゲームのスクロール

#1

投稿記事 by アル » 17年前

初めまして、アルと言います。

卒業研究でアクションゲームを作成しようとしているのですが
スクロールがうまく作れず行き詰っています。
検索で掲示板内を調べたのですが、マップスクロールに関していまいち理解できませんでした。

検索したログで管理人さんの出した例題が

//
#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:アクションゲームのスクロール

#2

投稿記事 by 管理人 » 17年前

アクションでスクロールというからには、右への横スクロールだと思っていいのでしょうか?
・・すると、横の最大の座標はいくつになりますか?
例えば画面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:アクションゲームのスクロール

#3

投稿記事 by アル » 17年前

すみません……書き方が悪かったです。

えっと、スクロールの方向ですが「左スクロール」です。

構造体は大丈夫です。

//
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画面の半分を過ぎると画面が真っ暗になるだけです。
真っ暗でもマップはそのままで、キャラは動きます。
画面半分より戻ると、画面は正常な状態に戻ります。


またまた、分かりにくい書き方をしていますがどうかご教授をお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る