移動スピードを上げたい

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

移動スピードを上げたい

#1

投稿記事 by 阿部 » 7年前

http://dixq.net/g/26.html
こちらのサンプルの移動スピードを上げたいのですがどうすればいいでしょうか
遅いのがどうしても気になります

nil
記事: 428
登録日時: 8年前

Re: 移動スピードを上げたい

#2

投稿記事 by nil » 7年前

移動処理の部分を理解できているのならば単純なことであると思います。

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

Re: 移動スピードを上げたい

#3

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

速度を決めているのは、何処の部分だと思いますか?
理解するためのサンプルなので、プログラムコードは全部理解しないと行けません。
処理でわからない所を聞いてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 移動スピードを上げたい

#4

投稿記事 by Dixq (管理人) » 7年前

ヒントは
ch.x
ch.y
がキャラクタの座標を示しているということです。
この値を足したり引いたりすることでキャラクタを移動させています。

阿部

Re: 移動スピードを上げたい

#5

投稿記事 by 阿部 » 7年前

返事遅れてすいません・・・
いろいろ試したけどやはりダメでした
変なほうに飛んでしまいます

コード:

 
#include "DxLib.h"
 
#define v 2.0
typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;
 
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,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,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,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 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
 
int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
        if(muki==0)//上向きなら
                if(hantei[y/32-1][x/32]==1)//進めるか判定
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        if(muki==2)//下向きなら
                if(hantei[y/32+1][x/32]==1)
                        return 1;
        if(muki==3)//右向きなら
                if(hantei[y/32][x/32+1]==1)
                        return 1;
        return 0;//正常
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
       int counter=1;
    int image[16],i,j;
    char Key[256];
    ch_t ch;
int oldt=0;
double t,x;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    ch.x    =320;
    ch.y    =160;
    ch.walking_flag=0;
    ch.muki=3;
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
    LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
                /*白い壁を描画*/
                for(i=0;i<15;i++)
                        for(j=0;j<20;j++)
                                if(hantei[i][j]==1)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
 
                if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
            ch.walking_flag=1; oldt=0;       //歩くフラグを立てる。
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
            if(ch.walking_flag==1)    //もし歩くなら
                if(IsAbleToGo(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
                    ch.walking_flag=0;                  //歩かないフラグを立てる。
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==0){        //上向きならch.y座標を減らす
                    ch.y--;counter++;}
            else if(ch.muki==1) {       //左向きならch.x座標を減らす
                    ch.x--;counter++;}
            else if(ch.muki==2) {       //下向きならch.y座標を増やす
                    ch.y++;counter++;}
            else if(ch.muki==3) {       //右向きならch.x座標を増やす
                    ch.x++;counter++;}
        }
                 if(oldt==0)
                        oldt=GetNowCount();//計測開始時間を格納
                 t = (double)(GetNowCount() - oldt)/1000.0;//計測を始めてからの時間
                x = v * t ; //距離 = 速さ * 時間
                ch.x += (int)(x * 32.0);//1mは100pix
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

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

Re: 移動スピードを上げたい

#6

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

速度というのは単位時間あたりの移動距離です。
速度の方程式など持ちださなくてもこの場合はスピードの調整は可能ですよ。

DXライブラリにおいて単位時間はフレームで1/60秒ですが、元のプログラムではこのフレーム当たり何ピクセル移動するようになっていたでしょうか?
まず、ここを理解していただきたいのでプログラムの場所と値をお応え下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

阿部

Re: 移動スピードを上げたい

#7

投稿記事 by 阿部 » 7年前

このコードでの移動量は32pixelですね

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

Re: 移動スピードを上げたい

#8

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

阿部 さんが書きました:このコードでの移動量は32pixelですね
そのプログラムの部分は何処ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

阿部

Re: 移動スピードを上げたい

#9

投稿記事 by 阿部 » 7年前

ここです↓
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0){ //上向きならch.y座標を減らす
ch.y--;counter++;}
else if(ch.muki==1) { //左向きならch.x座標を減らす
ch.x--;counter++;}
else if(ch.muki==2) { //下向きならch.y座標を増やす
ch.y++;counter++;}
else if(ch.muki==3) { //右向きならch.x座標を増やす
ch.x++;counter++;}
}

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

Re: 移動スピードを上げたい

#10

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

その部分で1フレーム当たり32pixel移動するのですか? 矛盾しますよね。32という数字も見当たりません。
1フレーム当たり32pixel移動したら1秒で32*60=1920pixelも移動してしまいますよね。

もう一度お聞きします。1フレーム当たり何pixelでしょうか? 32pixelではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

阿部

Re: 移動スピードを上げたい

#11

投稿記事 by 阿部 » 7年前

32÷60=0.5222・・・・・
でしょうか

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

Re: 移動スピードを上げたい

#12

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

阿部 さんが書きました:32÷60=0.5222・・・・・
でしょうか
そういう数字でもありません。難しく考え過ぎだと思います。
阿部さんがここだと書いたソースコードに、そのまま式(訂正)が書いてありますよ。
そこに書いてある座標の変化差分こそが移動速度です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

阿部

Re: 移動スピードを上げたい

#13

投稿記事 by 阿部 » 7年前

すいません。よく分かりません・・・・
実際にコード書いて頂けないでしょうか
たぶん見れば理解できるレベルなのでよろしくお願いします<()>

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: 移動スピードを上げたい

#14

投稿記事 by Priest » 7年前

++や--の意味はわかりますか?

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: 移動スピードを上げたい

#15

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

値というのは訂正します、式ですね。
結局、Priestさんの言われている点がポイントです。

【追記】
デバッガで流れを追いかけたりして、コード自体を理解できているのなら問題なくスピードに関して改造できるはずです。
※ アニメーションのコマの問題に躓く人は多いですが。

座標の変化分を元に計算してDrawFormatString()で移動速度を表示してみるというのもアプローチとしては良いかもしれません。
速度単位は pixel per frameです。

【追記の補足】
こちらのプログラムで、まず2倍速に出来るか挑戦されたほうが良いと思います。構造が同じです。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]  3.1章 キーの入力に応じてキャラを動かす」
http://dixq.net/g/03_01.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

阿部

Re: 移動スピードを上げたい

#16

投稿記事 by 阿部 » 7年前

なんとなく早くできるようになったのですが
動きがカクカクになってしまいます
滑らかにできないでしょうか

コード:


#include "DxLib.h"
 
#define v 2.0
typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;
 
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,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,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,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 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
 
int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
        if(muki==0)//上向きなら
                if(hantei[y/32-1][x/32]==1)//進めるか判定
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        if(muki==2)//下向きなら
                if(hantei[y/32+1][x/32]==1)
                        return 1;
        if(muki==3)//右向きなら
                if(hantei[y/32][x/32+1]==1)
                        return 1;
        return 0;//正常
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
       int counter=0;
    int image[16],i,j;
    char Key[256];
    ch_t ch;
int oldt=0;
double t,x;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    ch.x    =320;
    ch.y    =160;
    ch.walking_flag=0;
    ch.muki=3;
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
    LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
                /*白い壁を描画*/
                for(i=0;i<15;i++)
                        for(j=0;j<20;j++)
                                if(hantei[i][j]==1)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
 
                if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
            ch.walking_flag=1; oldt=0;counter=0;       //歩くフラグを立てる。
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
            if(ch.walking_flag==1)    //もし歩くなら
                if(IsAbleToGo(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
                    ch.walking_flag=0;                  //歩かないフラグを立てる。
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==0){        //上向きならch.y座標を減らす
                    counter++;ch.y -= (0.522)*6;}
            else if(ch.muki==1) {       //左向きならch.x座標を減らす
                    counter++; ch.x -= (0.522)*6;}
            else if(ch.muki==2) {       //下向きならch.y座標を増やす
                    counter++;ch.y += (0.522)*6;}
            else if(ch.muki==3) {       //右向きならch.x座標を増やす
                    counter++; ch.x +=(0.522)*6;}
        }
                 if(oldt==0)
                        oldt=GetNowCount();//計測開始時間を格納
                 t = (double)(GetNowCount() - oldt)/1000.0;//計測を始めてからの時間
                x = v * t ; //距離 = 速さ * 時間
               //1mは100pix
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}



>++や--の意味はわかりますか?
座標を増やす部分ですね

阿部

Re: 移動スピードを上げたい

#17

投稿記事 by 阿部 » 7年前

こちらに同じ質問してるひとがいましたね http://dixq.net/forum/viewtopic.php?t=7910&p=65355
解決です

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

Re: 移動スピードを上げたい

#18

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

阿部 さんが書きました:こちらに同じ質問してるひとがいましたね http://dixq.net/forum/viewtopic.php?t=7910&p=65355
解決です
ブロック単位を止めて、floatの座標をうまく使えば自在な移動速度にすることもできます。
そういうのは不要ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

阿部

Re: 移動スピードを上げたい

#19

投稿記事 by 阿部 » 7年前

どのような感じのコードになるでしょうか
このこードで大分進んでるので大幅な変更がなければ大丈夫ですが

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

Re: 移動スピードを上げたい

#20

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

大きく変えたくないのであれば、最終的に32で割り切れる歩数にする必要があります。
例えば1.6倍速であれば32で割り切れるので、その値を採用することも可能です。
ただ、「24. 行けない所を作る。~2D~」のコードをちゃんと理解していないとサンプルを書いても応用や理解できないのではと言う感じまします。
そういう応用力のためには、完全に理解することが大前提です。

1.6倍速バージョン。320の公約数が選択肢となります。

コード:

#include "DxLib.h"

typedef struct{
	int x,y,img,muki,walking_flag;
}ch_t;

int hantei[15][20] = {
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
	{ 1,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,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,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 },
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
	if(muki==0)//上向きなら
		if(hantei[y/32-1][x/32]==1)//進めるか判定
			return 1;//エラー
	if(muki==1)//左向きなら
		if(hantei[y/32][x/32-1]==1)
			return 1;
	if(muki==2)//下向きなら
		if(hantei[y/32+1][x/32]==1)
			return 1;
	if(muki==3)//右向きなら
		if(hantei[y/32][x/32+1]==1)
			return 1;
	return 0;//正常
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

	int image[16],i,j;
	char Key[256];
	ch_t ch;

	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	ch.x    = 320 * 10;	//	10倍して小数点以下の数値を擬似的に扱えるようにする。floatは誤差が生じるので利用できない。
	ch.y    = 160 * 10;	//	10倍して小数点以下の数値を擬似的に扱えるようにする。
	ch.walking_flag=0;
	ch.muki=3;

	SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
	LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
		//↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

		/*白い壁を描画*/
		for(i=0;i<15;i++)
			for(j=0;j<20;j++)
				if(hantei[i][j]==1)
					DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);

		if(ch.x%320==0 && ch.y%320==0){         //座標が32で割り切れたら入力可能
			ch.walking_flag=1;         //歩くフラグを立てる。
			if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
				ch.muki=0;         //上向きフラグを立てる
			else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
				ch.muki=1;         //左向きフラグを立てる
			else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
				ch.muki=2;         //下向きフラグを立てる
			else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
				ch.muki=3;         //右向きフラグを立てる
			else                                    //何のボタンも押されてなかったら
				ch.walking_flag=0; //歩かないフラグを立てる
			if(ch.walking_flag==1)    //もし歩くなら
				if(IsAbleToGo(ch.x/10,ch.y/10,ch.muki)==1)//行き先が歩けないなら
					ch.walking_flag=0;                  //歩かないフラグを立てる。
		}

		if(ch.walking_flag==1){        //歩くフラグが立っていたら
			if     (ch.muki==0)        //上向きならch.y座標を減らす
				ch.y-=16;	//10倍して扱っているので実際は速度は1.6(以下同様)
			else if(ch.muki==1)        //左向きならch.x座標を減らす
				ch.x-=16;
			else if(ch.muki==2)        //下向きならch.y座標を増やす
				ch.y+=16;
			else if(ch.muki==3)        //右向きならch.x座標を増やす
				ch.x+=16;
		}

		
		ch.img=image[(ch.x%320+ch.y%320)/80 + ch.muki*4];            //画像をセット(ここがキモ)

		DrawGraphF( (float)ch.x/10.0f , (float)ch.y/10.0f , ch.img , TRUE ) ;//画像を描画

		ScreenFlip();
	}

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

阿部

Re: 移動スピードを上げたい

#21

投稿記事 by 阿部 » 7年前

計算部分で1×0描画の座標で10で割るってことですね
たしかによく分ってないのでバグるかもしれないので
ch.x +=4のほうでいきます
どうもでした

閉鎖

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