ゲームの選択項目について

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

ゲームの選択項目について

#1

投稿記事 by cupa » 2年前

ゲームのタイトル画面で、選択項目を作っているのですが、矢印下を押すと一つ下へ、矢印上を押すと一つ上へ、そして長押しすると早く移動したいのですがどうしたらよいでしょうか?

やりたいことは、移動できるようになったものWhileで1秒間に60回も移動してしまうためまずそれを直したいのと、今は一定の速度だと思うので(早くてわからない)先程言ったとおり一瞬押したら一つ下・上、長押しなら早く移動できるようにしたいです。

現状のコード

コード:

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

typedef struct {
    int x, y;
    char name[128];
}MENU;

unsigned int Write;
unsigned int Black;
unsigned int Green;
unsigned int Red;
unsigned int Yellow;
unsigned int Blue;


int nowSelect = 0;      // 現在選択されている項目(の初期化)

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    SetGraphMode(800, 600, 32);     // ウィンドウサイズの変更、カラービットの設定
    ChangeWindowMode(TRUE);         // ウィンドウモードに
    SetMainWindowText("東方風アクションゲーム");        // ウィンドウのタイトル
    if (DxLib_Init() == -1) return -1;      // DxLibの初期化
    SetDrawScreen(DX_SCREEN_BACK);      // 描画先を裏画面に
    ChangeFontType(DX_FONTTYPE_ANTIALIASING_EDGE);      // フォントタイプをアンチエイリアス付き・エッジ付きにする

    Write = GetColor(255, 255, 255);
    Black = GetColor(0, 0, 0);
    Green = GetColor(0, 128, 0);
    Red = GetColor(255, 0, 0);
    Yellow = GetColor(255, 255, 0);
    Blue = GetColor(0, 0, 255);

    enum  {
        TITLE,      // タイトル画面
        GAME,       // ゲーム画面
        RESULT      // リザルト画面
    }scene = TITLE;

    MENU menu[4] {
        {100, 150, "ゲームスタート"},
        {100, 190, "操作方法"},
        {100, 230, "設定"},
        {100, 270, "ゲーム終了"}
    };

    while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
    {
        ClearDrawScreen();

        if (scene == TITLE)
        {
            for (int i = 0; i < 4; i++) {
                DrawFormatString(menu[i].x, menu[i].y, Write, menu[i].name);
            }
            
            
            if (CheckHitKey(KEY_INPUT_UP) == 1) nowSelect--;
            if (CheckHitKey(KEY_INPUT_DOWN) == 1) nowSelect++;

            if (nowSelect < 0) nowSelect = 0;
            else if (nowSelect > 3) nowSelect = 3;
            DrawFormatString(80, menu[nowSelect].y, Write, "■");
        }

        ScreenFlip();
    }

    WaitKey();

    DxLib_End();        // DxLibの終了

    return 0;       // プログラムの終了
}
色々試したのですがどれも失敗に終わりました。
どこを改良すればそのようにできるでしょうか?
お願いいたします。

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

Re: ゲームの選択項目について

#2

投稿記事 by cupa » 2年前

WaitKey()はいらないですね(笑)

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

Re: ゲームの選択項目について

#3

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

ボタンが押されているフレーム数をカウントし、
・1フレーム目
・aフレーム目以上で、フレーム数からaを引いた数をbで割った余りが0
のいずれかの時に移動するようにするといいでしょう。
aは長押しと判定されるまでのフレーム数、bは長押し時に移動する間隔を表します。

こんな感じかな。
(動作未確認です。typoなどあるかもしれません。)

コード:

    const int LONG_THRESHOLD = 30, MOVE_INTERVAL = 5;
    int upCount = 0, downCount = 0;
    while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
    {
        ClearDrawScreen();

        if (scene == TITLE)
        {
            for (int i = 0; i < 4; i++) {
                DrawFormatString(menu[i].x, menu[i].y, Write, menu[i].name);
            }
            
            
            if (CheckHitKey(KEY_INPUT_UP) == 1)
            {
                upCount++;
                if (upCount == 1 || (upCount >= LONG_THRESHOLD && (upCount - LONG_THRESHOLD) % MOVE_INTERVAL == 0))
                {
                    nowSelect--;
                }
            }
            else
            {
                upCount = 0;
            }
            if (CheckHitKey(KEY_INPUT_DOWN) == 1)
            {
                downCount++;
                if (downCount == 1 || (downCount >= LONG_THRESHOLD && (downCount - LONG_THRESHOLD) % MOVE_INTERVAL == 0))
                {
                    nowSelect++;
                }
            }
            else
            {
                downCount = 0;
            }

            if (nowSelect < 0) nowSelect = 0;
            else if (nowSelect > 3) nowSelect = 3;
            DrawFormatString(80, menu[nowSelect].y, Write, "■");
        }

        ScreenFlip();
    }
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: ゲームの選択項目について

#4

投稿記事 by cupa » 2年前

回答ありがとうございます。
写したらうまくいったのですが、意味がわかりません。
特に
if (upCount == 1 || (upCount >= LONG_THRESHOLD && (upCount - LONG_THRESHOLD) % MOVE_INTERVAL == 0))
(ダウンも)
のところです。
もしよければ一つ一つ丁寧に教えていただけますでしょうか、説明を見ても理解が追いつかないので・・・
お願いします。

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

Re: ゲームの選択項目について

#5

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

コード:

if (upCount == 1 // 1フレーム目
    || ( // のいずれかの時
        upCount >= LONG_THRESHOLD // aフレーム目以上
        && // で、
        (
            upCount // フレーム数から
            - LONG_THRESHOLD // aを引いた数
        ) % MOVE_INTERVAL // をbで割った余り
        == 0 // が0
    )
)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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