マウスがホバーされたら文字を変更

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cupa
記事: 117
登録日時: 2年前

マウスがホバーされたら文字を変更

#1

投稿記事 by cupa » 2年前

タイトル画面の選択項目を作っているのですが、タイトルの通り普段は白(変更可)で、
マウスがホバーされると文字色を変える、というのをやりたいです。

個人的には頑張ったのですがどこが悪いのでしょうか?

コード:

#include "../DxLib/DxLib.h"

#define SCREEN_WIDTH        (1366)
#define SCREEN_HEIGHT       (768)
#define SCREEN_COLOR_BIT    (32)

int menuNum;
int nowSelect;
int mouseX, mouseY;
unsigned int Write, Black, Red, Green, Yellow, Blue;
int textWidth;
void isFullScreen();
void Load();

enum {
    TITLE
}scene = TITLE;

typedef struct {
    int x, y;
    unsigned int color;
    char name[32];
}MENU;

MENU menu[4] {
    {1000, 400, Write,                   "Game Start"},
    {1000 - 50 * 1, 400 + 80 * 1, Write, "Operation Method"},
    {1000 - 50 * 2, 400 + 80 * 2, Write, "Option"},
    {1000 - 50 * 3, 400 + 80 * 3, Write, "Game Finish"}
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    isFullScreen();
    SetDrawScreen(DX_SCREEN_BACK);
    SetMainWindowText("東方静天地");
    SetMouseDispFlag(TRUE);
    if (DxLib_Init() == -1) return -1;
    ChangeFontType(DX_FONTTYPE_ANTIALIASING_EDGE_8X8);
    SetFontSize(50);
    Load();
    
    
    while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
    {
        ClearDrawScreen();

        GetMousePoint(&mouseX, &mouseY);

	// 問題の部分
        for (int i = 0; i < menuNum; i++) {
        DrawFormatString(menu[i].x, menu[i].y, menu[i].color, menu[i].name);	// メニュー項目を表示
        textWidth = GetDrawFormatStringWidth(menu[nowSelect].name);   	// 選択されているテキストの幅を取得
        if (menu[i].x >= mouseX && menu[i].x + textWidth <= mouseX &&	// 当たり判定?
            menu[i].y >= mouseY && menu[i].y + 50 <= mouseY) {
                nowSelect = i;		// 条件を満たしていればその数をnowSelectに代入
                menu[nowSelect].color = Red;	// 色変更
            } else {		// それ以外は
                menu[i].color = Write;	// 白
            }
        }

        ScreenFlip();
    }

    DxLib_End();

    return 0;
}

void isFullScreen() {
    int result = MessageBox(
        NULL,
        "フルスクリーンで表示しますか?",
        "スクリーンの設定",
        MB_YESNO
    );

    if (result == IDYES) {
        SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_COLOR_BIT);
        ChangeWindowMode(FALSE);
    } else if (result = IDNO) {
        SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT - 20, SCREEN_COLOR_BIT);
        SetWindowInitPosition(-8, 0);
        ChangeWindowMode(TRUE);
    }
}

void Load() {
    menuNum = 4;
    nowSelect = 0;
    Write = GetColor(255, 255, 255);
    Black = GetColor(  0,   0,   0);
    Red   = GetColor(255,   0,   0);
}
初心者ですお願い致します。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: マウスがホバーされたら文字を変更

#2

投稿記事 by みけCAT » 2年前

条件式が悪いです。

コード:

menu[i].y >= mouseY && menu[i].y + 50 <= mouseY
は、書き換えると

コード:

menu[i].y + 50 <= mouseY && mouseY <= menu[i].y
となりますが、これを満たす整数 menu[i​].y および mouseY は存在しません。
xについて、同様に textWidth が正のとき、条件を満たす整数 menu[i​].x および mouseX は存在しません。
(オーバーフローは考慮しないこととします)

コード:

        if (menu[i].x <= mouseX && mouseX <= menu[i].x + textWidth &&	// 当たり判定?
            menu[i].y <= mouseY && mouseY <= menu[i].y + 50) {
とするべきでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cupa
記事: 117
登録日時: 2年前

Re: マウスがホバーされたら文字を変更

#3

投稿記事 by cupa » 2年前

回答ありがとうございます。

>となりますが、これを満たす整数 menu[i​].y および mouseY は存在しません。
 xについて、同様に textWidth が正のとき、条件を満たす整数 menu[i​].x および mouseX は存在しません。

とはどういうことでしょうか?

確認したいことが、menuのxは左上の座標ですよね?
>menu.x <= mouseXのところですが、これだと左上の座標よりマウスのX座標のほうが大きいということになりますよね?そうするとオーバーフローのように文字の外が条件を満たしている。というように思えてしまうのですが・・・

また、提示してくれた条件式でやってみたのですが、判定がおかしかったです。一応色は変わりました。

cupa
記事: 117
登録日時: 2年前

Re: マウスがホバーされたら文字を変更

#4

投稿記事 by cupa » 2年前

また自分で考えてみて、

コード:

if (menu[i].x >= mouseX && menu[i].x + textWidth >= mouseX &&
              menu[i].y <= mouseY && menu[i].y + 50 >= mouseY)
このようにしてみたのですが、Yの判定はできていても、Xの判定ができていません。
実際には、文字上をホバーしても赤にされず、それより左に当たり判定があるようです。
そんため、textWidthがおかしいことになっていると思います。

cupa
記事: 117
登録日時: 2年前

Re: マウスがホバーされたら文字を変更

#5

投稿記事 by cupa » 2年前

コード:

if (menu[i].x <= mouseX && menu[i].x + textWidth >= mouseX &&
            menu[i].y <= mouseY && menu[i].y + 50 >= mouseY)
自己解決しました!
ありがとうございました!

返信

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