同画像の複数表示(ランダムな値)について質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kiyu

同画像の複数表示(ランダムな値)について質問

#1

投稿記事 by kiyu » 13年前

初めましてkiyuと申します。
現在課題の提出のためにプログラミングに初挑戦中なのですが如何せんわからないところが出てきましたので今回質問させて頂きました。

・DXライブラリで音ゲー(ビーマニ)のようなものを製作予定(途中完成でも可)
・プログラミング経験は無し(今回が初めて)
・提出までの期間にあまり余裕がないので本来は自分で考え、反映するべきなのですが今回はサンプルとして何かアイディアをいただければ幸いです。

※同じ画像を複数回登場させる(ビーマニで言う落ちてくる画像)ことがイマイチ理解できていません。譜面までは作る予定がなく、ランダムな値で作成予定ですが自分で組んでみたところエラーが出てしまい余計訳がわからなくなったので出来ているところまで載せます。



#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode( TRUE ); // ウィンドウモードに設定
DxLib_Init(); // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定
int Cr;
int a = 1;
int b = 1;
int c = 1;
int d = 1;
int e = 1;
int Random[5];
int Handle; // 画像格納用ハンドル
Handle = LoadGraph( "greenber.png" ); // 画像のロード

Random[0] = GetRand(10);
Random[1] = GetRand(10);
Random[2] = GetRand(10);
Random[3] = GetRand(10);
Random[4] = GetRand(10);
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){




DrawGraph( 100, a, Handle, TRUE ); //画像の描画
DrawGraph( 130, b, Handle, TRUE );
DrawGraph( 160, c, Handle, TRUE );
DrawGraph( 190, d, Handle, TRUE );
DrawGraph( 220, e, Handle, TRUE );
a = a + Random[0];
b = b + Random[1];
c = c + Random[2];
d = d + Random[3];
e = e + Random[4];



Cr = GetColor( 255 , 255 , 255 ); // 白色の値を取得y480x640
DrawLine(100 , 0, 100,480 , Cr);
DrawLine(130 , 0, 130,480 , Cr);
DrawLine(160 , 0, 160,480 , Cr);
DrawLine(190 , 0, 190,480 , Cr);
DrawLine(220 , 0, 220,480 , Cr);
DrawLine(250 , 0, 250,480 , Cr);

Cr = GetColor( 255 , 0 , 0 ) ; // 判定ライン
DrawLine(90 , 430, 260 ,430 , Cr ) ;
ScreenFlip(); //裏画面を表画面に反映
}






DxLib_End(); // DXライブラリ終了処理
return 0;
}
  

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#2

投稿記事 by Priest » 13年前

こちらで実行してみたところ、画像の複数表示については問題なく出来ていますので、音楽ゲーム構築の方に言及してみます。
画像の複数表示について何が具体的に分からないのか教えてくださると答えやすいかと思います。

なお、私もそこまで精通しているわけではないので間違いが含まれる可能性があります。

現在のコードでは、スピードの異なるノート(っていうんでしたっけ?)が5つ同じタイミングで出ているようですが、
私の感覚では、スピードは一定なものがスタンダードだと思います。

なので、スピードは一定にして、出てくるタイミングを管理する方針にしてみたらいかがでしょうか?

構造体はご存知ですか?
例えばですが、使用されているか判断するためのフラグ、ノートの出てくる列、現在位置yを管理する構造体を作ってみるといいと思います。

コード:

struct NOTE {
    int Used; // このノートが現在使われている
    int Retu; // どの列を移動するか
    int Posy; // 現在の位置(垂直方向)
};
そして、あらかじめ、落ちてくるタイミングを管理する一次元配列型変数を用いて、いわゆるタイミングリストを作っておきましょう。

コード:

int Timing[100];

Timing[0] = GetRand(5); // 例えばこんな感じで作る。
for( int i = 0 ; i < 99 ; i++ ){
    Timing[i+1] = Timing[i] + GetRand(5); 
}
あとは、そのリストの時間が来たら、新しいノートをランダムな列に追加していけばいいのではないかと思います。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

kiyu

Re: 同画像の複数表示(ランダムな値)について質問

#3

投稿記事 by kiyu » 13年前

回答ありがとうございます。
本来であればタイミングは自分で作るのが正しいとは思いますが如何せん時間がないもので、
今回はランダムにさせて頂いており、構造体に関しましても理解するまでに時間がかかってしまい、間に合わなくなるので今回は無しの方向でお願いします。

で、画像の表示に関しまして私の説明不足でした。
今のままでは一つしかそれぞれに落ちてこないので指定した個数がランダム?な、タイミングで落ちてくるようにしたいのです。
二度手間になってしまい申し訳ございません。

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#4

投稿記事 by Priest » 13年前

Priest さんが書きました:今のままでは一つしかそれぞれに落ちてこないので指定した個数がランダム?な、タイミングで落ちてくるようにしたいのです。
指定した個数というのは、それぞれの列に対して、個数を決めるのですか?

一番右の列には合計5個、左隣は4個、…という感じですか?

それとも、全列の合計数を決めるということですか?

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

kiyu

Re: 同画像の複数表示(ランダムな値)について質問

#5

投稿記事 by kiyu » 13年前

どちらでも構わないとは思ってるんですが・・合計の方が設定が行いやすい?
と勝手に解釈してしまってますすいません・・。

設定しやすい方が私自身理解しやすいのでどちらでも構わないと考えています。

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#6

投稿記事 by Priest » 13年前

ならば、合計の方が簡単です。

まず、4つの変数を用意してみましょう。
ここで、waitはwhile文の最後でデクリメントされていることを前提とします。

コード:

/*
配列Noteについて
[0]=存在フラグ (0=存在しない 1=存在する)
[1]=そのノートの列 (-1で初期化しておく。 0=右端、1=右から2番目、… 、4=左端 のように決めておく)
[2]=ノートの位置y座標
…を10個。(一度に10個まで表示できる)
*/
int Note[3][10]; 
int Wait; // 待機時間を格納する
int NumNote; // 現在のノート数。
int MaxNote; // 目標ノート数。全部で何個のノードを出すか。

アルゴリズムはこんな感じでどうでしょう。

コード:

目標ノート数を代入;
最初に変数waitに待機時間をランダム値で入れておく; // wait = GetRand(10); など
While(){
    if(待機時間が0になった){
    for(10個全てのノート枠){
            if(空いているノート枠がある){
                そのノートの存在フラグを立てる;
                そのノートの列をランダムに代入;
                そのノートのy座標を0に初期化;
                ノートの総数カウントを1増やす;
                変数waitに待機時間をランダムに入れる;
            }
        }
    }
    for(全部のノート){
        if(そのノートの存在フラグが立っている){
            ノートを描写;
            そのノートのy座標を1足す;
        }
        if(そのノートが一番下まで到達した){
            存在フラグを降ろす;
        }
    }
    待機時間を1減らす;
    if(目標ノート数に達した){
        終わり;
    }
}

ノードを叩くことはまだですが、これで表示はでき…そう?
試してみてください。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

kiyu

Re: 同画像の複数表示(ランダムな値)について質問

#7

投稿記事 by kiyu » 13年前

返答ありがとうございます。
こんなお時間まで申し訳ございません。

ただ私の知識ではアルゴリズムをまだ理解できていないようです・・・。
待機時間=WaitTime ? とその程度の知識です。
一応音楽の設定までは完了致しましたが、
ノートに関しては私には難しいみたいです(苦笑


課題の提出には多分間に合わない(プログラムが思いつかない)ので今回は諦めて、
個人的にアルゴリズムに関してこれから学ぼうと思います。

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#8

投稿記事 by Priest » 13年前

ビーマニ.png
ビーマニ.png (2.47 KiB) 閲覧数: 6757 回
このような感じになれば成功ですね!

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#9

投稿記事 by Priest » 13年前

おお、そうですか!
今の時期が一番つらい時期ですが、分かってくるとプログラミングが楽しくなって来るので是非頑張ってください!

(追記)課題の提出日はいつですか?

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

kiyu

Re: 同画像の複数表示(ランダムな値)について質問

#10

投稿記事 by kiyu » 13年前

確認したところ、
どうやら時間的に今日になってしまったようです笑

なんとか画像のようにまではたどり着きたかったのですが間に合いそうもなさそうです。


専攻科目ではないもので、これから私的に学ぼうと思います。

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#11

投稿記事 by Priest » 13年前

>今日
ああw それは厳しいですね。
お時間があればいくらでも教えることができたのですけどね…ザンネン。

この先もプログラミングに興味を持ってくださると幸いです。ではではまたの機会にー。

(追記:) あ、一応、このトピックを終わる際には、解決!ボタンを押しとくといいです。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

kiyu

Re: 同画像の複数表示(ランダムな値)について質問

#12

投稿記事 by kiyu » 13年前

こんなお時間までありがとうございました。
音ゲーはサンプルのプログラムが見当たらないので情報が少ないようですね。

私のように時間に余裕がない人以外は是非参考になさってみてください。

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: 同画像の複数表示(ランダムな値)について質問

#13

投稿記事 by Priest » 13年前

最後に丸投げして終わり!

コード:

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
    ChangeWindowMode( TRUE ); // ウィンドウモードに設定
    DxLib_Init(); // DXライブラリ初期化処理
    SetDrawScreen( DX_SCREEN_BACK );

    int Cr;

    int NumNote=0;
    int MaxNote=25;
    int Wait;
    int Note[3][30];

    Wait=GetRand(5);

    for(int i=0;i<10;i++){
        Note[0][i]=0;
        Note[1][i]=-1;
        Note[2][i]=0;
    }

    // ループ処理
    while(ScreenFlip()==0&&ProcessMessage()==0&&ClearDrawScreen()==0){
        if(Wait<=0){
            for(int i=0;i<10;i++){
                if(Note[0][i]==0){
                    Note[0][i]=1;
                    Note[1][i]=1+GetRand(4);
                    Note[2][i]=0;
                    NumNote++;
                    Wait=5+GetRand(5);
                    break;
                }
            }
        }
        for(int i=0;i<10;i++){
            if(Note[0][i]==1){
                DrawLine(70+Note[1][i]*30,Note[2][i],100+Note[1][i]*30,Note[2][i],GetColor(0,252,0));
                Note[2][i]+=5;
            }
            if(Note[2][i]>=430){
                Note[0][i]=0;
            }
        }
        Wait--;

        Cr = GetColor( 255 , 255 , 255 ); // 白色の値を取得y480x640
        DrawLine(100 , 0, 100,480 , Cr);
        DrawLine(130 , 0, 130,480 , Cr); 
        DrawLine(160 , 0, 160,480 , Cr);
        DrawLine(190 , 0, 190,480 , Cr);
        DrawLine(220 , 0, 220,480 , Cr);
        DrawLine(250 , 0, 250,480 , Cr);
 
        Cr = GetColor( 255 , 0 , 0 ) ; // 判定ライン
        DrawLine(90 , 430, 260 ,430 , Cr ) ;
        ScreenFlip(); //裏画面を表画面に反映
    }

    DxLib_End(); // 後処理
    return 0;
}

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 同画像の複数表示(ランダムな値)について質問

#14

投稿記事 by ISLe » 13年前

著作権のように課題なら大丈夫なんでしょうかね。

譜面マークが画面の上から降りてきて、画面下のマークに重なったときにタイミングよくボタンを押す、というゲームのデザインはコナミが特許を持っています。

譜面マークを一定のタイミングでインクリメントして画面上を動かすアルゴリズムはヤマハが特許を持っています。

音楽に合わせて譜面マークを出現させるなど複合条件になってますが。

どちらも訴訟関係で有名になっているので用心するに越したことはないと思います。

閉鎖

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