横スクロールの制御
Posted: 2010年11月25日(木) 20:13
お世話になります。
画面のスクロールの件でお伺いさせてください。
横スクロールのゲームを製作しているのですが、
1920pxのステージの最後の640pxになったら画面を固定して
キャラクターを画面端に移動させることによって次のfunctionに移行させたいのですが
どう工夫すればいいでしょうか…
あとスクロールの指示を出したとたん、弾が描画されなくなりました。
こちらの解決方法も教えていただけると幸いです。

画面のスクロールの件でお伺いさせてください。
横スクロールのゲームを製作しているのですが、
1920pxのステージの最後の640pxになったら画面を固定して
キャラクターを画面端に移動させることによって次のfunctionに移行させたいのですが
どう工夫すればいいでしょうか…
あとスクロールの指示を出したとたん、弾が描画されなくなりました。
こちらの解決方法も教えていただけると幸いです。

#include "DxLib.h"
#define WINDOW_SIZE_X 640
#define WINDOW_SIZE_Y 480
#define STAGE1_END_X 1920
char Key[256] ;
//場面処理用
int function_status;
//キャラクターシート
int image[12];
int image_enemy;
int image_op;
//弾画像
int image_tama;
//背景画像
int image_stage;
//発射してからのカウントをする変数。
int counter=0;
//始まった時間
int StartTime;
struct shot{
int x,y;
int flag;
};
typedef struct{
int x,y,img,muki,walking_flag,attack_flag;
}ch_t;
ch_t ch;//キャラクターの位置
struct shot tama[50];
void op0(){
DrawGraph( 0 , 0 , image_op , TRUE ) ;//画像を描画
//Xキーが押されてたら
if(Key[KEY_INPUT_RETURN]==1)
function_status=1;}
void main1(){
int i;
if((GetNowCount() - StartTime) > 60000){ //1ステージの制限時間は6秒
function_status=2;
}
if(ch.x%30==0){ //座標が30で割り切れたら入力可能
ch.walking_flag=1;//歩くフラグを立てる。
if( Key[ KEY_INPUT_RIGHT ] == 1 ) //→ボタンが押されたら
ch.muki=1; //右向きフラグを立てる
else
//何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if( Key[ KEY_INPUT_SPACE ] == 1 )
ch.attack_flag=1;//攻撃フラグをタテル。
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if(ch.muki==1) //→向きならch.x座標を増やす
ch.x+=3;
ch.img=image[(ch.x%30)/5+6];
}
if(ch.walking_flag==0){
ch.img=image[(ch.x%30)/5+0];
}
if(ch.attack_flag==1){
ch.img=image[(ch.x%30)/5+2];
ch.attack_flag=0;
}
if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_SPACE] == 1 ){//5カウント以上たっていたら
counter=0;//カウンターを戻す
for(i=0;i<50;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].x=ch.x+100;
tama[i].y=ch.y;
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}
for(i=0;i<50;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].x+=100; //xをキャラ位置分増やす
DrawGraph( tama[i].x , tama[i].y , image_tama , TRUE );//玉を描画
if(tama[i].x < -32 || tama[i].x > 672){ //もし画面外まで来たら
tama[i].flag=0; //発射フラグを戻す
}
}
}
if(ch.x<WINDOW_SIZE_X/100){//もしキャラクター位置が画面を100で割れたら
DrawGraph( 0 , 0 ,image_stage, TRUE);//ステージを描画
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
}
else if(ch.x<STAGE1_END_X-WINDOW_SIZE_X/100){
DrawGraph( -ch.x , 0 ,image_stage, TRUE);//キャラの逆向きにステージをスクロール
DrawGraph( 0 , 240 , ch.img , TRUE ) ;//画像を描画
}
else if(ch.x<STAGE1_END_X/100){
DrawGraph( ch.x , 0 ,image_stage, TRUE);//←ここで迷ってます。
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
}
else{
DrawGraph( 0 , 0 ,image_stage, TRUE);
DrawGraph( WINDOW_SIZE_X , 0 , ch.img , TRUE ) ;
}
if(ch.x>STAGE1_END_X==1)
function_status=2;
if(Key[KEY_INPUT_X]==1)
function_status=2;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
function_status=0;
image_enemy=LoadGraph("enemy.png");
image_op=LoadGraph("op.png");
image_tama = LoadGraph("tama.png");
LoadDivGraph( "chara_sheet.png" , 12 , 3 , 4 , 250 , 250 , image );//画像を分割してimage配列に保存
image_stage = LoadGraph( "stage.png" ) ;//背景の読み込み
ch.x =0;
ch.y =240;
ch.muki=3;
ch.attack_flag;
ch.walking_flag=0;
int i;
for(i=0;i<50;i++){ //初期化処理
tama[i].x=640/2; tama[i].y=480; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}
StartTime = GetNowCount();
while(ProcessMessage()==0 && ClearDrawScreen()==0 && !GetHitKeyStateAll(Key) && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
switch(function_status){
case 0:
op0();
break;
case 1:
main1();
break;
case 2:
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}
ScreenFlip();
}
DxLib_End();
return 0;
}