DxLib RPG作成

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

DxLib RPG作成

#1

投稿記事 by a Newbie » 13年前

DXLibを用いて、RPGツクールで作ったようなRPGを作りたいと思っているのですが
マップのスクロールがうまくいきません。

コード:

//Image.cpp
#include "gv.h"

void draw_charP(int ImageHandle){
	DrawRotaGraph(((640 / 2)-(CHARWIDTH/2)), ((480 / 2)-(CHARHEIGHT/2)), (CHAR_DRAW_PERCENT/100), 0, ImageHandle, true);
}

void draw_char2()
{
	int j , i ;
	double mapX , mapY ;		// マップの座標
	int chipX , chipY ;	// マップチップの数

	// 描画するマップチップの数をセット
	chipX = 640 / (CHIP_SIZE*2) + 2 ;
	chipY = 480 / (CHIP_SIZE*2) + 2 ;

	// 画面左上に描画するマップ座標をセット
	mapX = (check_chipX(ch[0].x, ch[0].moveX) - ( chipX / 2 - 1 ));
	mapY = (check_chipY(ch[0].y, ch[0].moveY) - ( chipY / 2 - 1 ));

	// マップを描く
	for( i = -1 ; i < chipY ; i ++ )
	{
		for( j = -1 ; j < chipX ; j ++ )
		{
			// 画面からはみ出た位置なら描画しない
			if( (j + CHIP_SIZE * 2) + mapX < 0 || (i + CHIP_SIZE * 2) + mapY < 0 ||
				(j + CHIP_SIZE * 2) + mapX >= MAPX_MAX || (i + CHIP_SIZE * 2) + mapY >= MAPY_MAX ) continue ;

			//MapAtt == 0
			switch(map[ch[0].mapID].MapChip[ i + (int)mapY ][ j + (int)mapX])
			{
				case 1:      //MapChipタイプが1ならタイルを描画
					debugi = i;
					debugj = j;
					DrawRotaGraph((j * (CHIP_SIZE*2) + scrollX), (i * (CHIP_SIZE*2) + scrollY),2, 0, mapchip[0][0], true);
			}
		}
	}
}

void draw_char(){

	//画像描画
	if(moving == 0){
		draw_charP(ch[0].mimg[1+(drct*3)]);
		move_a = 0;
		move_ac = 0;
	} else {

		//アニメーション動作変数
		move_ac += 1;
		if(move_ac <= 20){
			move_a = 0;
		} else {
			move_a = 2;
			if(move_ac >= 40){
				move_ac = 0;
			}
		}

		draw_charP(ch[0].mimg[(drct*3)+move_a]);
	}
}

void image_main(){
	draw_char();
	draw_char2();
}
//Character.cpp
#include "gv.h"

double check_chipX(double charX, double moveX){
	double X;
	X = (ch[0].x);
	ch[0].x = ch[0].x + (float)moveX;
	return X;
}

double check_chipY(double charY, double moveY){
	double Y;
	Y = (ch[0].y);
	ch[0].y = ch[0].y + (float)moveY;
	return Y;
}


void control_char(){
	//入力に対する動作
	drctx = 0;
	drcty = 0;
	moving = 1;
	if(CheckHitKey(KEY_INPUT_UP)){
		ch[0].moveY = -CHARSPD;
		drcty = drcty - CHARSPD;
	}
	if(CheckHitKey(KEY_INPUT_DOWN)){
		ch[0].moveY = CHARSPD;
		drcty = drcty + CHARSPD;
	}
	if(CheckHitKey(KEY_INPUT_LEFT)){
		ch[0].moveX = -CHARSPD;
		drctx = drctx - CHARSPD;
	}
	if(CheckHitKey(KEY_INPUT_RIGHT)){
		ch[0].moveX = CHARSPD;
		drctx = drctx + CHARSPD;
	}

	//向きの判定
	if(drctx == 0){
		if(drcty < 0) drct=6;	//上方向
		if(drcty > 0) drct=0;	//下方向
	}
	if(drcty == 0){
		if(drctx < 0) drct=2;	//左方向
		if(drctx > 0) drct=4;	//右方向
	}
	if(drctx < 0){
		if(drcty < 0) drct=5;	//左上方向
		if(drcty > 0) drct=1;	//左下方向
	}
	if(drctx > 0){
		if(drcty < 0) drct=7;	//右上方向
		if(drcty > 0) drct=3;	//右下方向
	}
	if(drctx == 0 && drcty == 0){
		moving = 0;
	}


	// 進入不可能なマップだった場合は移動できない
	if( moving == 1 )
	{
		if( map[ch[0].mapID].MapAtt[ (int)check_chipY(ch[0].y, ch[0].moveY) ][ (int)check_chipX(ch[0].x, ch[0].moveX) ] == 1 )
		{
			moving = 0 ;
		}
	}

	// 移動中の場合は移動処理を行う
	if( moving == 1 ){
			// 経過時間からスクロール量を算出する
			scrollX = -(ch[0].moveX) ;
			scrollY = -(ch[0].moveY) ;
	}
	ch[0].moveX = 0;
	ch[0].moveY = 0;
	if( moving == 0){
		scrollX = 0;
		scrollY = 0;
	}
}

void character_main(){
	control_char();
}
//main.cpp
#define MAIN 
#include "gv.h"

int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;
	if(ClearDrawScreen()!=0)return -1;
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;
	mode_state = 1;
	while(ProcessLoop()==0){
		switch(mode_state){
			case 1:
				load_main();
				mode_state=100;
			break;
			case 100:
				character_main();		//キャラクターメイン
				image_main();			//描画メイン
				debug_main();
				break;
			default:
				printfDx("state error\n");
				break;
			case 999:
				break;
		}
		if(CheckHitKey(KEY_INPUT_ESCAPE)==1)break;
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}

マップのデータは外部からの読み込みでマップ構造体の配列に格納しています。


現在、http://homepage2.nifty.com/natupaji/DxL ... ogram.html
こちらのテンプレを利用して作っていますが、
これではカクカクとした動きにしかならず、RPGツクールで作ったようななめらかな移動にはなりません。

どうしたらRPGツクールで作ったようななめらかなマップスクロールができるのでしょうか?

Cは構造体の利用まではできます。

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

Re: DxLib RPG作成

#2

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

gV.hが無いのでコンパイルが通りません。
確認したいのでヘッダもお願いします。

それと私のRPG講座も良かったら参考にしてください。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~ RPG講座」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

a Newbie

Re: DxLib RPG作成

#3

投稿記事 by a Newbie » 13年前

コード:

//define.h
#define CHARSPD 0.1f
#define CHIP_SIZE 16
#define MAPX_MAX 120
#define MAPY_MAX 120
#define MAPCHIP_MAX 1
#define CHAR_DRAW_PERCENT 200
#define CHARWIDTH (20 * (CHAR_DRAW_PERCENT / 100))
#define CHARHEIGHT (28 * (CHAR_DRAW_PERCENT / 100))
#define WHITE GetColor(255, 255, 255)

#include "struct.h"

//struct.h
typedef struct{	//キャラクター構造体
	double x,y;		//座標
	double moveX, moveY;	//移動分座標
	int level;		//レベル
	int	exp;		//経験値
	int atk, def, spd, money;	//攻撃・防御・敏捷・金
	int hp, mp, maxhp, maxmp;	//HP・MP
	int sp;						//SP
	int mimg[24];				//MAP時の画像
	int bimg[8];				//BATTLE待機時の画像
	int mapID;					//現在mapIDの格納
	char name[16];				//名前
}ch_s;

typedef struct{	//マップ構造体
	int MapAtt[MAPY_MAX][MAPX_MAX];	//マップ1マス毎の属性
	int MapChip[MAPY_MAX][MAPX_MAX];	//マップチップの種類
	int MapEvent[MAPY_MAX][MAPX_MAX];	//マップイベントIDの格納
	int MapXmax;
	int MapYmax;
}map_s;

//gv.h
#include "DxLib.h"
#include "define.h"
#include <string.h>
#include <stdio.h>

#ifdef MAIN
#define GLV
#else
#define GLV extern 
#endif

#include "function.h"

GLV int mode_state;

GLV double drctx;	//主人公の向き:x
GLV double drcty;	//主人公の向き:y
GLV int drct;	//主人公の向き
GLV int moving;	//主人公が動いているかどうか
GLV int move_a;	//移動時のアニメーション
GLV int move_ac;//移動時のアニメーションカウント変数
GLV double scrollX;	//X軸方向スクロール成分
GLV double scrollY;	//Y軸方向スクロール成分

GLV int debugi;
GLV int debugj;

GLV int mapchip[MAPCHIP_MAX][256];	//マップチップ画像描画変数

GLV ch_s ch[3];
GLV map_s map[1];

//function.h

GLV double check_chipX(double charX, double moveX);
GLV double check_chipY(double charX, double moveX);
GLV void character_main();

GLV void load_main();

GLV void image_main();

GLV void debug_main();

//Load.cpp
#include "gv.h"

#define MAP_NUM 1


void ini(){
	ch[0].mapID = 0;
	ch[0].x = 8;
	ch[0].y = 6;
}

void load(){
	LoadDivGraph("./data/img/char0.png", 24, 6, 4, 20, 28, ch[0].mimg);
	LoadDivGraph("./data/img/wall0.png", 5, 1, 5, 16, 16, mapchip[0]);
}

void load_mapa(){
	int n,num,i,j,fp;
	char fname[32];
	int input[64];
	char inputc[64];
	for(j=0; j<MAP_NUM; j++){
		sprintf(fname, "./data/DF/MapAtt_%d.mapset", j);
		fp = FileRead_open(fname);//ファイル読み込み

		if(fp == NULL){
			printfDx("read error\n");
			return;
		}

		n=0 , num=0;
		while(1){
			for(i=0;i<64;i++){
				inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
				if(inputc[i]=='/'){//スラッシュがあれば
					while(FileRead_getc(fp)!='\n');//改行までループ
					i=-1;//カウンタを最初に戻して
					continue;
				}
				if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
					inputc[i]='\0';//そこまでを文字列とし
					break;
				}
				if(input[i]==EOF){//ファイルの終わりなら
					map[j].MapYmax = n;
					goto EXFILE;//終了
				}

			}
			if(num < MAPY_MAX){
				map[j].MapAtt[n][num]		=atoi(inputc);
			}
			num++;
			if(input[i]=='\n'){
				map[j].MapXmax = num;
				num=0;
				n++;
			}
		}
EXFILE:
		FileRead_close(fp);
	}
}

void load_mapc(){
	int n,num,i,j,fp;
	char fname[32];
	int input[64];
	char inputc[64];
	for(j=0; j<MAP_NUM; j++){
		sprintf(fname, "./data/DF/MapChip_%d.mapset", j);
		fp = FileRead_open(fname);//ファイル読み込み
		if(fp == NULL){
			printfDx("read error\n");
			return;
		}

		n=0 , num=0;
		while(1){
			for(i=0;i<64;i++){
				inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
				if(inputc[i]=='/'){//スラッシュがあれば
					while(FileRead_getc(fp)!='\n');//改行までループ
					i=-1;//カウンタを最初に戻して
					continue;
				}
				if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
					inputc[i]='\0';//そこまでを文字列とし
					break;
				}
				if(input[i]==EOF){//ファイルの終わりなら
					goto EXFILE;//終了
				}

			}
			if(num < MAPY_MAX){
				map[j].MapChip[n][num]		=atoi(inputc);
			}
			num++;
			if(input[i]=='\n'){
				num=0;
				n++;
			}
		}
		EXFILE:
		FileRead_close(fp);
	}
}

void load_mape(){
	int n,num,i,j,fp;
	char fname[32];
	int input[64];
	char inputc[64];
	for(j=0; j<MAP_NUM; j++){
		sprintf(fname, "./data/DF/MapEvent_%d.mapset", j);
		fp = FileRead_open(fname);//ファイル読み込み
		if(fp == NULL){
			printfDx("read error\n");
			return;
		}

		n=0 , num=0;
		while(1){
			for(i=0;i<64;i++){
				inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
				if(inputc[i]=='/'){//スラッシュがあれば
					while(FileRead_getc(fp)!='\n');//改行までループ
					i=-1;//カウンタを最初に戻して
					continue;
				}
				if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
					inputc[i]='\0';//そこまでを文字列とし
					break;
				}
				if(input[i]==EOF){//ファイルの終わりなら
					goto EXFILE;//終了
				}

			}
			if(num < MAPY_MAX){
				map[j].MapEvent[n][num]		=atoi(inputc);
			}
			num++;
			if(input[i]=='\n'){
				num=0;
				n++;
			}
		}
EXFILE:
		FileRead_close(fp);
	}
}


void load_main(){
	ini();
	load();
	load_mapa();
	load_mapc();
	load_mape();
}
ここらへんの構造はhttp://dixq.net/rp/さんを参考にして作りました。

なるほど、参考にさせていただきますm(__)m

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

Re: DxLib RPG作成

#4

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

マップデータも貼っていただきたいですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

a Newbie
記事: 3
登録日時: 13年前
住所: Japan

Re: DxLib RPG作成

#5

投稿記事 by a Newbie » 13年前

何度もすみません・・・
MapAtt.mapset MapChip.mapset

コード:

1,0,0,1,1,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,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,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,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,0,0,1,1,1,1,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,0,0,0,1,1,1,1,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,0,0,0,1,1,1,1,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,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,0,0,0,0,0,0,1,1,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,0,1,1,1,1,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,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,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,0,1,1,1,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,0,1,1,1,0,1,1,1,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,0,1,1,1,0,1,1,1,0,1,1,1,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,0,1,1,1,0,1,1,1,0,1,1,1,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,0,1,1,1,0,1,1,1,0,1,1,1,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,0,1,1,1,0,0,0,0,0,1,1,1,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,0,1,1,1,1,1,1,1,1,1,1,1,0,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,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1,1,1,1,1,0,1,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,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,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1
MapEvent.mapset

コード:

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
です。

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

Re: DxLib RPG作成

#6

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

このデータを入れると読み込みで無限ループに成るようです。
なのか間違いはないですか?

ファイル名は次のように変更しました。
MapAtt_0.mapset
MapChip_0.mapset
MapEvent_0.mapset
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

a Newbie
記事: 3
登録日時: 13年前
住所: Japan

Re: DxLib RPG作成

#7

投稿記事 by a Newbie » 13年前

_0抜かしてました。すみません。

自分がコンパイルすると無限ループにはならないのですが…

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

Re: DxLib RPG作成

#8

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

a Newbie さんが書きました:_0抜かしてました。すみません。

自分がコンパイルすると無限ループにはならないのですが…
【報告】
文字コード問題で、うまく動いていなかったようです。
なぜ龍神録はうまく行っているんでしょうね。

/Jオプションが何故か有効でcharがunsignedになっていしました。
失礼しましたこちらの環境問題です。

これから問題のほうを調べます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: DxLib RPG作成

#9

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

scrollXとscrollYの管理がうまく行えていません。
DrawFormatString()等で表示して値の変化をチェックしてみてください。

トリッキーな事しているようにしか見えないので、もっと素直に組んだほうが良いと思います。
例えばキャラクタの現在位置からマップ表示時にスクロール量を求めるとか。移動のついでに求めるとややこしくなるだけです。
それとマップパーツ単位なのかピクセル単位なのか不明な座標系が幾つか混じっているように見えます。
とりあえずメンテナンス性に問題のある組み方だと思います。

例えばこうすれば、うまく動いているように見えますが合っているかは検証してみてください。

コード:

    // マップを描く
   scrollX = -( mapX-(int)mapX ) * (CHIP_SIZE*2);
   scrollY = -( mapY-(int)mapY ) * (CHIP_SIZE*2);
    for( i = -1 ; i < chipY ; i ++ )
    {
        for( j = -1 ; j < chipX ; j ++ )
        {
            // 画面からはみ出た位置なら描画しない
            if( (j + CHIP_SIZE * 2) + mapX < 0 || (i + CHIP_SIZE * 2) + mapY < 0 ||
                (j + CHIP_SIZE * 2) + mapX >= MAPX_MAX || (i + CHIP_SIZE * 2) + mapY >= MAPY_MAX ) continue ;
 
            //MapAtt == 0
            switch(map[ch[0].mapID].MapChip[ i + (int)mapY ][ j + (int)mapX])
            {
                case 1://MapChipタイプが1ならタイルを描画
                    debugi = i;
                    debugj = j;
                    DrawRotaGraph((j * (CHIP_SIZE*2) + scrollX), (i * (CHIP_SIZE*2) + scrollY),2, 0, mapchip[0][0], true);
            }
        }
    }
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

a Newbie
記事: 3
登録日時: 13年前
住所: Japan

Re: DxLib RPG作成

#10

投稿記事 by a Newbie » 13年前

softya(ソフト屋) さんが書きました:scrollXとscrollYの管理がうまく行えていません。
DrawFormatString()等で表示して値の変化をチェックしてみてください。

トリッキーな事しているようにしか見えないので、もっと素直に組んだほうが良いと思います。
例えばキャラクタの現在位置からマップ表示時にスクロール量を求めるとか。移動のついでに求めるとややこしくなるだけです。
それとマップパーツ単位なのかピクセル単位なのか不明な座標系が幾つか混じっているように見えます。
とりあえずメンテナンス性に問題のある組み方だと思います。

例えばこうすれば、うまく動いているように見えますが合っているかは検証してみてください。

コード:

    // マップを描く
   scrollX = -( mapX-(int)mapX ) * (CHIP_SIZE*2);
   scrollY = -( mapY-(int)mapY ) * (CHIP_SIZE*2);
    for( i = -1 ; i < chipY ; i ++ )
    {
        for( j = -1 ; j < chipX ; j ++ )
        {
            // 画面からはみ出た位置なら描画しない
            if( (j + CHIP_SIZE * 2) + mapX < 0 || (i + CHIP_SIZE * 2) + mapY < 0 ||
                (j + CHIP_SIZE * 2) + mapX >= MAPX_MAX || (i + CHIP_SIZE * 2) + mapY >= MAPY_MAX ) continue ;
 
            //MapAtt == 0
            switch(map[ch[0].mapID].MapChip[ i + (int)mapY ][ j + (int)mapX])
            {
                case 1://MapChipタイプが1ならタイルを描画
                    debugi = i;
                    debugj = j;
                    DrawRotaGraph((j * (CHIP_SIZE*2) + scrollX), (i * (CHIP_SIZE*2) + scrollY),2, 0, mapchip[0][0], true);
            }
        }
    }
ありがとうございます!自分の希望する動作になりました!

そうですね。貴方様の講座を読んで勉強し直したいと思いますm(_ _)m

閉鎖

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