他のマップにチェンジする(マップを左右にスクロールさせる継)

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

他のマップにチェンジする(マップを左右にスクロールさせる継)

#1

投稿記事 by chalaza » 14年前

掲示板が重くなったので、いちおう前回のタイトルの問題は解決したのでマップチェンジについてでその続きのトピックを立てさせていただきました。
マップのスクロールは解決できたので、現在のマップによってチェンジするマップが変わるようなコードを組む問題を聞いていましたが、
とりあえず決められたマップに変えるコードはint MapChangeNo[4];をStageDataに加えて作れました。
ステージデータを
{ MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, {-1,1,-1,-1}, 0,0,0,0,},のようにして
{-1,1,-1,-1}, の部分をMapChangeNo[4]にして、
[0]前のマップ [1]次のマップ [2]他のマップ1 [3]他のマップ2 となるようにし、
その中に変更するマップ数を入れ、-1だったらマップ移動をしないようにしました。
前へもどる扉へ入ったらWhereMapを0、
次へ行く扉へ入ったらWhereMapを1、
別マップ1への扉ならWhereMapを2、
別マップ3への扉ならWhereMapを3を代入してから、マップがチェンジするタイミングで
移動しようとするマップ数が-1ではない時だけ (StageData.MapChangeNo[WhereMap] != -1 )
StageData = StageDataSelect[StageData.MapChangeNo[WhereMap]];で、MapChangeNoをWhereMapに合わせて変更できるようにしました。
マップチェンジのほうはこれで良いと思うのですが、

ステージテーブルにマップチップの画像をそのままいれこまない方法についてです。
ステージデータの{ MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, {-1,1,-1,-1}, 0,0,0,0,},の最後の0000の部分がマップの画像なのですが、
その部分に後からロードした画像番号を代入する場合、ステージ1と2の両方で違う画像を代入しなければならないので、
この部分もテーブルのようにするのでしょうか?
そうなら、ステージデータの最後の4つだけをステージごとに分けたテーブルを作ることはできるのでしょうか?


画像番号を大に代入していないコードです。画像が表示されません

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 2560
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 1,  1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
#define MAP_PIXEL_WIDTH2 2560
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
 


/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])


	//  ステージ構造体
	typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
	int height; //縦サイズ
	int arriveX;	//到着するX座標
	int arriveY;	//到着するY座標
	int MapChangeNo[4];		//[0]前のマップ [1]次のマップ [2]他のマップ1 [3]他のマップ2
	int haikei1 ;
	int haikei2 ;
	int chip[2] ;

	} StageData_t;
 
	//  ステージテーブル
	StageData_t StageDataSelect[2] = {
		{ MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, {-1,1,-1,-1}, 0,0,0,0,},    //マップ1
		{ MapData2, MAP_WIDTH2, MAP_HEIGHT2, 32, 288, {0,-1,-1,-1}, 0,0,0,0,},  //マップ2
	};

    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
 
    // 画像をロード
    //マップ画像
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int conc1 = LoadGraph( "image/map/conc1.png" );
    int conc2 = LoadGraph( "image/map/conc2.png" );
    int yakei1 = LoadGraph( "image/yakei.png" );
    int yakei2 = LoadGraph( "image/yakei2.png" );
    int hekiga1 = LoadGraph( "image/hekiga1.png" );
    int testimg = LoadGraph( "image/testimg.png" );
 
 

    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
		//ステータスバー
	int statesbar = LoadGraph( "image/statesbar.png" );

	//ワイプ用
	int MapChange = 0 ;
	int WhereMap  = 0 ;		//1=前のマップへ 2=次のマップへ 3=それ以外のマップへ
	int wipestart = 0 ;		//1=フェードアウト開始 2=フェードイン開始
	int wipecount = 0 ;		//ワイプ画像アニメーション用
	int wipeimg ;			//ワイプ画像
	int wipe1[20];			//ワイプ1(四角)
	LoadDivGraph( "image/wipe/wipe1.png" , 20 , 20 , 1 , 32 , 32 , wipe1 );
 

    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
	int walk = 0 ;				//歩いているか
	int hosei = 0 ;				//補正しているか
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用

	int haikeiX1 = 0 ;			//背景1のX座標
	int haikeiX2 = 640 ;		//背景2のX座標

    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 

 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから

        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く

 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0
				||Player.X - CameraX < 0 )     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
		


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1){//左右両方押されてたら右向く
            Player.img=chara[0];
			walk = 0 ;
		}

 
		//マップのスクロール///////////////////////////////////////////////////////

		CameraX = Player.X - SCREEN_WIDTH/2 + 32;


		//ステージのスクロール

			if(CameraX < 0)CameraX = 0;
			if(CameraX > (StageData.width*CHIP_SIZE)-SCREEN_WIDTH) CameraX = (StageData.width*CHIP_SIZE)-SCREEN_WIDTH;
			//背景表示座標をスクロール
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_RIGHT ] >= 1)	//キャラが画面の中心にいて右に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0						//右側が壁でないとき
					&&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0){
						haikeiX1--;											//背景1と2を左にスクロール
						haikeiX2--;
				}
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_LEFT ] >= 1)	//キャラが画面の中心にいて左に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X+15) == 0						//左側が壁でない時
					&&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0){
						haikeiX1++;											//背景1と2を左にスクロール
						haikeiX2++;
				}
		
		PlayerViewX = Player.X - CameraX;

		///////////////////////////////////////////////////////////////

        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていて上が天井じゃなかったらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
				||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
			{
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で天井についてなく右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 )
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y-1,Player.X + 47) == 0){
				Player.img=chara[5];
			}
 
        //ジャンプ状態で天井についてなく左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 )
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y-1,Player.X + 47) == 0){
				Player.img=chara[11];
			}
 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }

///////////////ワイプ//////////
		if(Key[ KEY_INPUT_Q ] == 1 && wipestart==0 ){	//前へ戻るワイプの始まり(扉1)
			WhereMap=0;
			wipestart=1;
		}
		if(Key[ KEY_INPUT_W ] == 1 && wipestart==0 ){	//次へ行くワイプの始まり(扉2)
			WhereMap=1;
			wipestart=1;
		}
		if(Key[ KEY_INPUT_E ] == 1 && wipestart==0 ){	//別へ行くワイプの始まり(扉3)
			WhereMap=2;
			wipestart=1;
		}
		if(Key[ KEY_INPUT_R ] == 1 && wipestart==0 ){	//別へ行くワイプの始まり(扉4)
			WhereMap=3;
			wipestart=1;
		}

		if(wipestart==1 ){		//ワイプが始まったらカウント++
			wipecount++;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==1 && wipecount == 20 ){	//カウントが16超えたらカウント--
			MapChange=1;			//ここでマップチェンジ
			wipestart=2;			//ワイプ戻り始め
		}
		//////////↓マップチェンジ
		//前か次のマップへ
		if( MapChange==1 && StageData.MapChangeNo[WhereMap] != -1 ){
			StageData = StageDataSelect[StageData.MapChangeNo[WhereMap]];
			Player.X = StageData.arriveX , Player.Y = StageData.arriveY ;
			walkdirection = 1 ;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
			
			}

		/////////↑マップチェンジ
		if(wipestart==2 ){
			wipecount--;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==2 && wipecount == 0){
			wipecount=0;
			wipestart=0;
			MapChange = 0 ;
			WhereMap = 0 ;
		}
//↓描画↓//////////////////////////////

        //マップを描画
	        //背景を描画
		DrawGraph( haikeiX1, 0, StageData.haikei1, FALSE ); // 背景1を表示
		DrawGraph( haikeiX2, 0, StageData.haikei2, FALSE ); // 背景2を表示
		for( i = 0 ; i < StageData.height ; i ++ )
		{
			for( j = 0 ; j < StageData.width ; j ++ )
			{
				if( STAGE_CHIP(i,j) != 0 ) //1以上のとき数値に合った画像
				{
					DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , StageData.chip[STAGE_CHIP(i,j)-1] , FALSE ) ;
				}
			}
		}


		//HP
		HPimg = HPgazou[HP];	//HP数値にあわせてHP画像
		if( Key[ KEY_INPUT_D ] == 1 )	//Dを押したらHPを1へらす
			HP -= 1;
		if(HP<0)						//HPは0以下にならない
			HP=0;
		if(Player.Y >= 416)				//プレイヤーが落ちたらHPが0
			HP=0;
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー

		//ワイプ表示
			for(int y=0 ; y<15 ; y++){
				for(int x=0 ; x<20 ; x++){
					DrawGraph(x*32+0,y*32+0,wipeimg,TRUE);
				}
			}
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 他のマップにチェンジする(マップを左右にスクロールさせる継)

#2

投稿記事 by softya(ソフト屋) » 14年前

代入は、1つ目のマップは
StageDataSelect[0].haikei1 =
StageDataSelect[0].haikei2 =
StageDataSelect[0].chip[0] =
StageDataSelect[0].chip[1] =
2つ目のマップは
StageDataSelect[1].haikei1 =
StageDataSelect[1].haikei2 =
StageDataSelect[1].chip[0] =
StageDataSelect[1].chip[1] =
に代入すれば良いです。

ただ、付け焼刃的に毎回修正してますが、もっと先に事を考えてプログラムを設計したほうが良いですよ。
背景が増えたら?
マップチップが増えたら?
扉の位置は、どの様にして情報を?
マップチップはアニメーションしないの?
全ステージを、どうやって作るの?
ステージの仕掛けはないの?
などアクションゲームと必要なことを今から考えてないと後で困ることになると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

chalaza

Re: 他のマップにチェンジする(マップを左右にスクロールさせる継)

#3

投稿記事 by chalaza » 14年前

代入できました。ありがとうございます。
一応背景が増えたときのために背景画像を配列にしてfor文で1画面分づつ右にならべて表示するようにしました。
マップチップや他画像をアニメーションさせるときは、どんなときでも増え続けてループする変数を用意してそれの数値に合わせてアニメーションさせようと
思っています。

そして扉についてなのですが…扉もマップチップの中に数値データとして組み込んだところで、
扉のマップチップ数値とキャラが重なっているときに上キーを押すとマップチェンジさせようと思っているのですが、まず、
今までののプログラムだとマップチップ数値が0のところしか通れないようになっているのですが、
扉の前もキャラが通れるようにしたいので、たとえば扉のマップチップ数値が3だとすると、
数値が0か3のところだけ通れる。としたいところなのです。
そこで、Through[2]という配列をつくってみて、そこに通れる数値の0と3を入れてみました。
そしてマップチップがThroughのどれかのときにしか通れないようにしたいのですが、
この場合、いまの私の知識だと、『マップチップ==Through[0]||マップチップ==Through[1]』とわざわざ書かなければいけないなと思うのですが、
一気にThroughの中のすべてを判定するような方法ってないのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 他のマップにチェンジする(マップを左右にスクロールさせる継)

#4

投稿記事 by softya(ソフト屋) » 14年前

Throughの添字数分forループして、Through[x]とマップチップが1つでも一致だったらスルーフラグをONにする。一致が0ならスルーフラグはOFF。
って処理を作れば良いですよ。あとはスルーフラグがOFFの時だけ当たり判定をすれば良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

白い時空
記事: 18
登録日時: 14年前
住所: 埼玉県さいたま市

Re: 他のマップにチェンジする(マップを左右にスクロールさせる継)

#5

投稿記事 by 白い時空 » 14年前

int Through[4] = { 1,0,0,1 };
みたいにして
Through[マップチップ] == 1
とマップチップを添字にして判断する手もあると思います。

chalaza

Re: 他のマップにチェンジする(マップを左右にスクロールさせる継)

#6

投稿記事 by chalaza » 14年前

なんとかマップチップに0と1を振り分けてできました。
これで攻撃が当たった場所のマップチップを0にするとかも実装できそうです。
解決です。ありがとうございました。

閉鎖

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