DxLib RPG作成
Posted: 2012年11月11日(日) 05:24
DXLibを用いて、RPGツクールで作ったようなRPGを作りたいと思っているのですが
マップのスクロールがうまくいきません。
マップのデータは外部からの読み込みでマップ構造体の配列に格納しています。
現在、http://homepage2.nifty.com/natupaji/DxL ... ogram.html
こちらのテンプレを利用して作っていますが、
これではカクカクとした動きにしかならず、RPGツクールで作ったようななめらかな移動にはなりません。
どうしたらRPGツクールで作ったようななめらかなマップスクロールができるのでしょうか?
Cは構造体の利用まではできます。
マップのスクロールがうまくいきません。
//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は構造体の利用まではできます。