ページ 11

Dxライブラリで模様を作りたい

Posted: 2020年11月14日(土) 17:34
by JJJuto
言葉で説明するのが少し難しいのですが、Dxライブラリを使って、ジャマイカの国旗のような模様を作りたいと思っています。

斜めの線を、中心を軸に時計回りさせる感じです。
また、線が動いた軌跡を虹にしたいです。

コード:

#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
    int i, a, R,O,Y,G,B,A,P;
    ChangeWindowMode(TRUE);
    if (DxLib_Init() == -1) {
        return -1;
    }
    
    R= GetColor(255, 0, 0);
    
    for (i = 0; i < 640; i++){
        for (a = 640; a > 0; a--)
        {
            ClearDrawScreen();
            DrawLine(i, 0, a, 480,R);
            ScreenFlip();
        }
    }
    ScreenFlip();
    WaitKey();
    DxLib_End();
    return 0;
}

上記のようなソースを書きました。(O~Pの色は省略しました)

わからないところとしましては、

①実行すると、(0,0)を軸に線が動いています。これを、上の点は右に向かって、下の点は左に向かって、まるで中心を軸に斜めの線が動いているように見せたい
2重ループではないのでしょうか? その場合、どういったソースにすれば良いか知りたいです。

②軌跡(線の残像)を表示して、色をR,O,Y,G,B,A,P,R,O・・・の順に繰り返したいところです。このとき、塗りつぶしでグラデーションをつけるのではなく、Rの線、Oの線、Yの線・・・と繰り返している感じにしたいです。

説明が下手くそ、DxLibを初めて使うため知識のないこと、大変申し訳ありません。
なお、Java等ではなく、必ずDxLibで書きたいです。
もしわかる方いらっしゃいましたら、教えていただけると嬉しいです。

Re: Dxライブラリで模様を作りたい

Posted: 2020年11月15日(日) 05:07
by あたっしゅ
https://ja.wikipedia.org/wiki/%E3%82%B8 ... D%E6%97%97
ジャマイカの国旗 - Wikipedia(ja)

コード:

        const int width = 640;
        const int MAX = 6;
        int i, R[MAX];

        if (DxLib_Init() == -1) {
            return -1;
        }
        {
            ClearDrawScreen();

            R[0] = GetColor(255, 0, 0);
            R[1] = GetColor(255, 255, 0);
            R[2] = GetColor(255, 0, 255);
            R[3] = GetColor(0, 0, 255);
            R[4] = GetColor(0, 255, 255);
            R[5] = GetColor(255, 255, 255);

            int a = 0;
            for (i = 0; i < width; i++) {

                DrawLine(i, 0, width - i, 480, R[a++]);
                if (a > MAX) {
                    a = 0;
                }
            }
            ScreenFlip();
        }

        WaitKey();
        DxLib_End();
こんなんで、どうでせう。

Re: Dxライブラリで模様を作りたい

Posted: 2020年11月15日(日) 08:42
by みけCAT
あたっしゅ さんが書きました:
4年前
こんなんで、どうでせう。
ダメですね。

コード:

                if (a > MAX) {
                    a = 0;
                }
という処理だと、a = MAX の時はそのまま次のループに行き、R[a++]が範囲外へのアクセスになってしまいます。

コード:

                if (a >= MAX) {
                    a = 0;
                }
とするべきでしょう。
もしくは、R[a++]をR[a]として、このif文の代わりに

コード:

                a = (a + 1) % MAX;
とするか。

また、

コード:

SetDrawScreen(DX_SCREEN_BACK); 
をしていないのに

コード:

ScreenFlip();
をしているのも、おかしいと思います。

Re: Dxライブラリで模様を作りたい

Posted: 2020年11月15日(日) 10:55
by あたっしゅ
はぁ、なんか疲れてる...

Re:Re: Dxライブラリで模様を作りたい

Posted: 2020年11月15日(日) 11:28
by JJJuto
お二人ともありがとうございます。いただいたソースを参考にイメージ通りのものができました。