マップスクロールの作り方

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

マップスクロールの作り方

#1

投稿記事 by テラ » 15年前

先日、extern宣言について質問させていただきました。
その後、マップデータ(進行可否とマップチップ1個毎の座標)を構造体に保存して表示するところまでできました。

ただ、このままでは描画されただけなのでスクロールを実装してみようと思ったのですが、なかなかうまくいきません・・・。

構造体に保存しているデータと、自分なりに作成したソースを記載します。
どなたかご教授お願いいたします;;

// プレイヤーに関する構造体
typedef struct{
int x,y; // 座標
int type; // 歩行グラフィックの種類
int move; // 歩行グラフィックのコマ数
int walk; // 歩行の有無の判定フラグ
}player_t;

typedef struct{
int data[MAP_MAX_Y][MAP_MAX_X]; // 進行可否判定
int posX[MAP_MAX_Y][MAP_MAX_X]; // マップチップX座標
int posY[MAP_MAX_Y][MAP_MAX_X]; // マップチップY座標
int scroll[MAP_MAX_Y][MAP_MAX_X]; // 指定したチップのスクロール状態
}map_t[MAP_NO];

// スクロールを考慮したマップ描画
void chip_drawing(int mapNo){
for(int i = 0; i < MAP_MAX_Y; i++){
for(int j = 0; j < MAP_MAX_X; j++){
int MTP_X,MTP_Y;
MTP_X = map[mapNo].posX[j] - player.x / 32; if(MTP_X < 0) MTP_X *= -1;
MTP_Y = map[mapNo].posY[j] - player.y / 32; if(MTP_Y < 0) MTP_Y *= -1;
if(map[mapNo].posX[j]%32==0 && map[mapNo].posY[j]%32==0){
map[mapNo].scroll[j] = 0;
if(CheckHitKey(KEY_INPUT_DOWN) && (MTP_Y >= 3 && map[mapNo].data[i+3][j] != '\0') ){
map[mapNo].scroll[j] = 1; // 下方向へスクロール
}else if(CheckHitKey(KEY_INPUT_LEFT) && (MTP_X <= 3 && map[mapNo].data[j-3] != '\0') ){
map[mapNo].scroll[j] = 2; // 左方向へスクロール
}else if(CheckHitKey(KEY_INPUT_RIGHT) && (MTP_X >= 3 && map[mapNo].data[j+3] != '\0') ){
map[mapNo].scroll[j] = 3; // 右方向へスクロール
}else if(CheckHitKey(KEY_INPUT_UP) && (MTP_Y <= 3 && map[mapNo].data[i-3][j] != '\0') ){
map[mapNo].scroll[i][j] = 4; // 上方向へスクロール
}
if(map[mapNo].scroll[i][j] != 0){
if(map[mapNo].scroll[i][j] == 1 && map[mapNo].data[player.y/32+1][player.x/32] != 0){
map[mapNo].scroll[i][j] = 0;
}else if(map[mapNo].scroll[i][j] == 2 && map[mapNo].data[player.y/32][player.x/32-1] != 0){
map[mapNo].scroll[i][j] = 0;
}else if(map[mapNo].scroll[i][j] == 3 && map[mapNo].data[player.y/32][player.x/32+1] != 0){
map[mapNo].scroll[i][j] = 0;
}else if(map[mapNo].scroll[i][j] == 4 && map[mapNo].data[player.y/32-1][player.x/32] != 0){
map[mapNo].scroll[i][j] = 0;
}
}
}
if(map[mapNo].scroll[i][j] == 1){
map[mapNo].posY[i][j] += 2;
}else if(map[mapNo].scroll[i][j] == 2){
map[mapNo].posX[i][j] -= 2;
}else if(map[mapNo].scroll[i][j] == 3){
map[mapNo].posX[i][j] += 2;
}else if(map[mapNo].scroll[i][j] == 4){
map[mapNo].posY[i][j] -= 2;
}
if(map[mapNo].data[i][j] == 1){
DrawRotaGraphF(map[mapNo].posX[i][j]+16,map[mapNo].posY[i][j]+16,1.0,0.0,map_chip[0][0],TRUE);
}
}
}
}

追記:
目標実装としては、自分の進行方向3マス先にマップがあった場合はスクロールを進行方向に行い、
マップがなかった場合はスクロールせず、キャラだけを動かすというものです。 画像

palladium

Re:マップスクロールの作り方

#2

投稿記事 by palladium » 15年前

本題の答えにはなりませんが
if, else if もありますが
switch もあるかもしれません。

例えばですが

if(map[mapNo].scroll[j] == 1){
map[mapNo].posY[j] += 2;
}else if(map[mapNo].scroll[j] == 2){
map[mapNo].posX[j] -= 2;
}else if(map[mapNo].scroll[j] == 3){
map[mapNo].posX[j] += 2;
}else if(map[mapNo].scroll[j] == 4){
map[mapNo].posY[j] -= 2;
}

switch(map[mapNo].scroll[j]){
case 1: map[mapNo].posY[j] += 2; break;
case 2: map[mapNo].posX[i][j] -= 2; break;
case 3: map[mapNo].posX[i][j] += 2; break;
case 4: map[mapNo].posY[i][j] -= 2; break;
default: break;
}

このような書き方もあるかもしれません。

softya

Re:マップスクロールの作り方

#3

投稿記事 by softya » 15年前

とりあえず時間がないのでソースを見れてませんが、DX本家のスクロールのサンプルがあるので参考にされては?
http://homepage2.nifty.com/natupaji/DxL ... am.html#N4

テラ

Re:マップスクロールの作り方

#4

投稿記事 by テラ » 15年前

>palladiumさん
確かに switch文のほうが見やすいですし、後々の修正もやりやすいですね。
参考にさせていただきます。

>softyaさん
本家のサンプルは自分も拝見しました。
しかし、今目指してるのは画面端だとスクロールしないというものなので・・・。
その点を書き加えていませんでした・・・申し訳ないです。

softya

Re:マップスクロールの作り方

#5

投稿記事 by softya » 15年前

動作確認したいのでソース全体をいただけませんか?
添付の形で結構です。

閉鎖

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