

dxライブラリで画像で示した仕様に沿ったプログラミングを書いているのですが、このスペースキーを押すと座標基準を変更するというのがよくわかりません。

目標としては一度スペースを押すと中心座標が左上座標に、そしてもう一度スペースを押すと戻るといった感じにしたいのですが、この場合はどのように書けばいいのでしょうか？

わからないところはソースコードの `//座標基準の入れ替え？？` というところです。  
初めての質問で言葉足らずなところがあると思いますが、どうぞよろしくお願いします

* * *

**仕様**

[![仕様](https://i.stack.imgur.com/8PNyT.png)](https://i.stack.imgur.com/8PNyT.png)

**現状のソースコード**

[code]

    #include "DxLib.h"
    #include<stdlib.h>
    
    const char TITLE[] = "K0：タイトル";
    
    const int WIN_WIDTH = 600; //ウィンドウ横幅
    const int WIN_HEIGHT = 400;//ウィンドウ縦幅
    
    int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
    {
        ChangeWindowMode(TRUE);                     //ウィンドウモードに設定
        //ウィンドウサイズを手動では変更できず、かつウィンドウサイズに合わせて拡大できないようにする
        SetWindowSizeChangeEnableFlag(FALSE, FALSE);
        SetMainWindowText(TITLE);                   // タイトルを変更
        SetGraphMode(WIN_WIDTH, WIN_HEIGHT, 32);    //画面サイズの最大サイズ、カラービット数を設定（モニターの解像度に合わせる）
        SetWindowSizeExtendRate(1.0);               //画面サイズを設定（解像度との比率で設定）
        SetBackgroundColor(0x00, 0x00, 0xFF);       // 画面の背景色を設定する
    
        //Dxライブラリの初期化
        if (DxLib_Init() == -1) { return -1; }
    
        //（ダブルバッファ）描画先グラフィック領域は裏面を指定
        SetDrawScreen(DX_SCREEN_BACK);
    
        //画像などのリソースデータの変数宣言と読み込み
    
        //ゲームループで使う変数の宣言
        char keys[256] = { 0 }; //最新のキーボード情報用
        char oldkeys[256] = { 0 };//1ループ（フレーム）前のキーボード情報
    
        int posX;//描写する四角形の中心座標
        int posY;//
        int radius;//四角形の半径
    
        radius = 60;
        posX = 300;
        posY = 200;
    
        int ClickX, ClickY, Button, LogType;//四角形の移動のやつ
        int DrawFlag, DrawX, DrawY, DrawColor;
        int spaceFlag = 0;
        int tx = posX;
        int ty = posY;
        int MouseX;
        int MouseY;
    
        DrawFlag = FALSE;
        DrawX = 0;
        DrawY = 0; DrawColor = 0;
        // ゲームループ
        while (1)
        {
            //最新のキーボード情報だったものは１フレーム前のキーボード情報として保存
    
            //最新のキーボード情報を取得
            GetHitKeyStateAll(keys);
    
            //画面クリア
            ClearDrawScreen();
            //---------  ここからプログラムを記述  ----------//
    
            //更新処理
            //四角形の拡大縮小
            if (keys[KEY_INPUT_UP] == 1 ) 
            {
                radius = radius+3;
            }
            if (keys[KEY_INPUT_DOWN] == 1 ) 
            {
                radius = radius-3;
            }
            //マウスでの四角形の移動
            if (GetMouseInputLog2(&Button, &ClickX, &ClickY, &LogType, TRUE) == 0)
            {
                if ((Button & MOUSE_INPUT_LEFT) != 0)
                {
                    DrawFlag = TRUE;
                    posX = ClickX;
                    posY = ClickY;
                }
            }
            if (DrawFlag == TRUE)
            {
                DrawBox(posX - radius, posY - radius, posX + radius, posY + radius, DrawColor, TRUE);
            }
            //座標基準の入れ替え??
            if (keys[KEY_INPUT_SPACE] == 1 )
            {
                spaceFlag = 1;
            }
            int tx = posX;
            int ty = posY;
            if (spaceFlag == 1) {
                tx += radius;
                ty += radius;
                spaceFlag = 0;
            }
            spaceFlag = 0;
    
            DrawBox(tx - radius, ty - radius, tx + radius, ty + radius, GetColor(255, 255, 255), TRUE);
    
            //マウス座標位置の取得
            GetMousePoint(&MouseX, &MouseY);
    
            //描画処理
    
            DrawFormatString(0, 15, GetColor(200, 50, 130), "四角形x座標,四角形y座標(%d,%d)", posX, posY);
            DrawFormatString(0, 30, GetColor(200, 50, 130), "マウス座標x,マウス座標y(%d,%d)", MouseX, MouseY);
            //---------  ここまでにプログラムを記述  ---------//
            ScreenFlip();//（ダブルバッファ）裏面
            // 20ミリ秒待機（疑似60FPS）
            WaitTimer(20);
            // Windows システムからくる情報を処理する
            if (ProcessMessage() == -1)
            {
                break;
            }
            // ＥＳＣキーが押されたらループから抜ける
            if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
            {
                break;
            }
        }
        //Dxライブラリ終了処理
        DxLib_End();
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-06-05T03:42:18.840
67310
2022-07-15T14:02:30.267
2020-06-05T06:57:43.253
3060
40490
question
c++
描画した図形の左上座標基準と中心座標基準の変更どうやるか


ややこしい書き方してますね。  
spaceFlagはこの場合、なくても動くと思います。  
スペースキーを押したら、radiusの値の分、移動するというプログラムになります。  
十字キーの右を押せば、マリオが右に移動するのとやっていることは変わりません(ただ何故xとy、両方に値を足しているのかは分かりませんが...)  
後、リファクタリングすると下記のような感じになります。どうですか、イメージ出来そうですか？

[code]

    //座標基準の入れ替え??
    int tx = posX;
    int ty = posY;
    if (keys[KEY_INPUT_SPACE] == 1 )
    {
        tx += radius;
        ty += radius;
    }
    DrawBox(tx - radius, ty - radius, tx + radius, ty + radius, GetColor(255, 255, 255), TRUE);
    
[/code]


CC BY-SA 4.0
2020-07-31T05:34:41.377
69141
2020-07-31T05:34:41.377
34303
67310
answer