合計 昨日 今日

簡単なゲームをつくっているのですが...

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: プー
[URL]
Date: 2017年3月20日(月) 17:10
No: 1
(OFFLINE)

 簡単なゲームをつくっているのですが...

ふうせんがでてきてそれをクリックすると消えるというプログラムを作っているのですが、
1回風船が出てきて左クリックを長押ししていて、次の風船にアイコンがあたると消えてしまいます。
質問は
どうしたら1個目から割れるようになるか
どうしたら長押しではなく、カチッと1回押したときだけ割れるようになるか
です。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <DxLib.h>
 
int ootani();
 
int Key[256];
             
int gpUpdateKey() {
    char tmpKey[256];
    GetHitKeyStateAll(tmpKey);
    for (int i = 0; i<256; i++) {
        if (tmpKey[i] != 0) {
            Key[i]++;    
        }
        else {              
            Key[i] = 0;  
        }
    }
    return 0;
}
 
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
 
 
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
        ootani();
    }
 
    DxLib_End();
    return 0;
}
 
int ootani() {
    int mouse = GetMouseInput();
    int mx, my;
    int x = GetRand(500), y = 336;
    int x2 = x + 100, y2 = y + 155;
    int handle = LoadGraph("画像/husen.png");
    GetMousePoint(&mx, &my);
 
    for (y = 336; y > -300 && ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0;) {
        DrawGraph(x, y, handle, TRUE);
        GetMousePoint(&mx, &my);
        y = y - 10;
        x2 = x + 100, y2 = y + 155;
        Sleep(28);
        if (mx >= x && mx <= x2 && my >= y  && my <= y2) {
            if (mouse & MOUSE_INPUT_LEFT) {
                return 0;
            }
        }
 
        DrawFormatString(10, 10, GetColor(0, 255, 0), "x=%d,y=%d\nx=%d,y=%d", mx, my, x, y);
           
    }
 
    return 0;
}

Name: みけCAT
[URL]
伝説なるハッカー(666,338 ポイント)
Date: 2017年3月20日(月) 17:26
No: 2
(OFFLINE)

 Re: 簡単なゲームをつくっているのですが...

まず、3大処理が複数ある、良くない実装をやめるべきでしょう。
同じ画像を開放せずに複数回読み込むのもよくないでしょう。
その上で、
プー さんが書きました:どうしたら1個目から割れるようになるか

マウスのボタンが押されているかの判定を毎フレームやるようにしましょう。
プー さんが書きました:どうしたら長押しではなく、カチッと1回押したときだけ割れるようになるか

「このフレームで押されているか」の情報だけでなく「前のフレームで押されていたか」の情報も保持し、
「このフレームで押されている、かつ前のフレームでは押されていない」ときのみ割れるようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: みけCAT
[URL]
伝説なるハッカー(666,338 ポイント)
Date: 2017年3月20日(月) 17:49
No: 3
(OFFLINE)

 Re: 簡単なゲームをつくっているのですが...

実装例です。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <DxLib.h>
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() != 0) return -1;
    SetDrawScreen(DX_SCREEN_BACK);
 
    int husenImage = LoadGraph("画像/husen.png");
    int husenX = 0, husenY = 0;
    const int husenWidth = 100, husenHeight = 155;
    int husenStartTime = 0;
    int husenLiveFlag = 0;
 
    int mouseInput = 0, prevMouseInput = 0, edgeMouseInput;
    int mouseX = 0, mouseY = 0;
 
    while (ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        // マウスのボタンの情報を取得する
        mouseInput = GetMouseInput();
        edgeMouseInput = mouseInput & ~prevMouseInput;
        prevMouseInput = mouseInput;
        // マウスの位置の情報を取得する
        GetMousePoint(&mouseX, &mouseY);
 
        // 風船の処理をする
        if (husenLiveFlag) {
            // 28ミリ秒あたり10ピクセル上がる
            husenY = 336 - 10 * (GetNowCount() - husenStartTime) / 28;
            if (husenY > -300) {
                // まだ生きてる
                // 描画をする
                DrawGraph(husenX, husenY, husenImage, TRUE);
                // 当たり判定をする
                if (husenX <= mouseX && mouseX <= husenX + husenWidth &&
                husenY <= mouseY && mouseY <= husenY + husenHeight &&
                (edgeMouseInput & MOUSE_INPUT_LEFT)) {
                    // 風船がクリックされた
                    husenLiveFlag = 0;
                }
            } else {
                // 上がりすぎたので殺す
                husenLiveFlag = 0;
            }
        } else {
            // 新しい風船を出す
            husenX = GetRand(500);
            husenY = 336;
            husenStartTime = GetNowCount();
            husenLiveFlag = 1;
        }
 
        // 座標を表示する
        DrawFormatString(10, 10, GetColor(0, 255, 0),
            "x=%d,y=%d\nx=%d,y=%d", mouseX, mouseY, husenX, husenY);
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: プー
[URL]
Date: 2017年3月20日(月) 19:19
No: 4
(OFFLINE)

 Re: 簡単なゲームをつくっているのですが...

[解決!]

みけCATさんのアドバイスでマイフレームマウスの入力状態を更新するというのに気づきました!ありがとうございました。
こんな感じになりました。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <DxLib.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    ChangeWindowMode(FALSE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
    int mouse = GetMouseInput();
    int mx, my;
    int x = GetRand(500), y = 336;
    int x2 = x + 100, y2 = y + 155;
    int handle = LoadGraph("画像/husen.png");
    int hundle = LoadGraph("画像/弾00.png");
    GetMousePoint(&mx, &my);
 
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        mouse = GetMouseInput();
        if (y < -300)y = 336, x = GetRand(500);
            DrawGraph(x, y, handle, TRUE);
            GetMousePoint(&mx, &my);
            DrawGraph(mx, my, hundle, TRUE);
            y = y - 6;
            x2 = x + 100, y2 = y + 155;
           
            if (mx >= x && mx <= x2 && my >= y  && my <= y2) {
                if (mouse & MOUSE_INPUT_LEFT) {
                    y = -300;
                }
            }
           
        }
    }


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[4人]