ページ 11

【質問です】 座標の計算について?

Posted: 2016年8月22日(月) 15:40
by HighW
Dxライブラリ、C++について質問です

640x480のウィンドウ内でゲームを作りたいと思っていてコードを書いているのですが
STGのように
主人公の画像を移動させていて画面外に出たら画面内に戻す、というコードを書きました
一部だけですが、
if (x > 640) x = 640;

if (x < 0) x = 0;
こうやって書きました
一応これでしっかり動作はするのですが
例えば画像を右に動かして、画像はxが640で止まっていますが計算上の座標?は、
しっかり640以降も計算されています

文章じゃ伝わりにくいのですが
ようは、押し続けたら押し続けた分だけ戻って来るのに時間がかかります
座標計算をxは0から640にyは0から480に制限することはできますか?

Re: 【質問です】 座標の計算について?

Posted: 2016年8月22日(月) 16:49
by みけCAT
HighW さんが書きました:座標計算をxは0から640にyは0から480に制限することはできますか?
もちろんできるでしょう。
似た処理は例えば龍神録プログラミングの館 (9章)でもやっているはずです。
HighW さんが書きました:640x480のウィンドウ内でゲームを作りたいと思っていてコードを書いているのですが
STGのように
主人公の画像を移動させていて画面外に出たら画面内に戻す、というコードを書きました
一部だけですが、
if (x > 640) x = 640;

if (x < 0) x = 0;
こうやって書きました
画像を描画する座標だけクリップしているということですか?
「x」とだけ書かれても、私には何のことかよくわかりません。

Re: 【質問です】 座標の計算について?

Posted: 2016年8月22日(月) 18:19
by HighW
すみませんでした
以下がすべてのコードです

コード:

#include "Game.h"
    #include "SceneMgr.h"
    #include "DxLib.h"
     
    static int mImageHandle;    //画像ハンドル格納用変数
    static int flan;
    int x, y;
    int r;
    int a1, b1;
    int bsx, bsy;
    int mx, my;
    int L, R, U, D;
    int L2, R2, U2, D2;
    int LM, RM, UM, DM;
    int SetCreateGraphColorBitDepth(32);
     
     
     
     
    							//初期化
    void Game_Initialize() {
    	mImageHandle = LoadGraph("images/rice.jpg");    //画像のロード
    	flan = LoadGraph("images/Player.png");
    }
     
    //終了処理
    void Game_Finalize() {
    	DeleteGraph(mImageHandle);    //画像の解放
    }
     
    //更新
    void Game_Update() {
    	if (CheckHitKey(KEY_INPUT_ESCAPE) != 0) { //Escキーが押されていたら
    		SceneMgr_ChangeScene(eScene_Menu);//シーンをメニューに変更
    	}
    }
    //描画
    void Game_Draw() {
    	bsx = 600;
    	bsy = 400;
     
     
    	if (CheckHitKey(KEY_INPUT_A) == 1)
    	{
    		x -= 4;
    		if (CheckHitKey(KEY_INPUT_LSHIFT) == 1) x += 2;
    	}
     
    	if (CheckHitKey(KEY_INPUT_D) == 1) 
    	{
    		x += 4;
    		if (CheckHitKey(KEY_INPUT_LSHIFT) == 1) x -= 2;
    	};
     
    	if (CheckHitKey(KEY_INPUT_W) == 1)
    	{
    		y -= 4;
    		if (CheckHitKey(KEY_INPUT_LSHIFT) == 1) y += 2;
    	};
     
    	if (CheckHitKey(KEY_INPUT_S) == 1) 
    	{
    		y += 4;
    		if (CheckHitKey(KEY_INPUT_LSHIFT) == 1) y -= 2;
    	};
    	mx = bsx + x;
    	my = bsy + y;
     
    	if (mx > 640) mx = 620;
     
    	if (mx < 0) mx = 20;
     
     
     
     
    	WaitTimer(20);
     
    	DrawRotaGraph(mx, y, 0.5, 0.0, flan, TRUE); //画像の描画
    }
69、71行目のことなのですが
最初の投稿ではxになっていますがいまはmxにしています
どのように改変すれば良いでしょうか?

Re: 【質問です】 座標の計算について?

Posted: 2016年8月22日(月) 18:51
by みけCAT
HighW さんが書きました:以下がすべてのコードです
main関数もWinMain関数もループっぽい処理も見当たらないので、これがすべてのコードだとは思えません。
HighW さんが書きました:どのように改変すれば良いでしょうか?
例えば

コード:

    	mx = bsx + x;
    	my = bsy + y;
     
    	if (mx > 640) mx = 620;
     
    	if (mx < 0) mx = 20;
を消して、代わりに

コード:

    	if (bsx + x > 640) x = 620 - bsx;
    	if (bsx + x < 0) x = 20 - bsx;
    	if (bsy + y > 480) y = 460 - bsy;
    	if (bsy + y < 0) y = 20 - bsy;

    	mx = bsx + x;
    	my = bsy + y;
を入れる、みたいな感じでしょうか?
DrawRotaGraphの引数のyもmyにするといいでしょう。

閾値と修正後の値が異なっていますが、新しいコードに合わせました。

Re: 【質問です】 座標の計算について?

Posted: 2016年8月22日(月) 19:52
by HighW
すみません
いろいろなファイルに分けていて、問題が起きたのはGame.cppという
ファイルだったので、そこだけしか載せていませんでした

少ない情報の中感謝です!
ありがとうございます!

Re: 【質問です】 座標の計算について?

Posted: 2016年8月22日(月) 21:37
by Dixq (管理人)
ゲームプログラミングの館でも言っているように
WaitTimer(20);
を書くのはやめましょう・・。
http://dixq.net/g/h_11.html