画面に雪を降らせたいのですが、理論が判りません

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

画面に雪を降らせたいのですが、理論が判りません

#1

投稿記事 by taketoshi » 15年前

はじめまして、ご質問があります。

C言語を勉強しはじめて4ヶ月くらい経つのですが、現在スクリーンセーバーを作っています。
その中で画面上に雪を降らせたいのですが、コードの書き方が判りません。

ひとつの画像を読み込んで、TIMERを用いてx,y軸をずらしながら描画して一粒降らせる事はできたのですが
これが複数となったときの描画方法のコードの書き方が判りません。。。
Bitbltを何個も書いて複数降らせることも出来たのですが、もう少し良いやり方はありませんか?
乱数を使って画面のあちこちから出現させて消えていくみたいなプログラムを書きたいのです。

サンプル等ありましたらご教授お願いします。

ookami

Re:画面に雪を降らせたいのですが、理論が判りません

#2

投稿記事 by ookami » 15年前

こんばんは。

一粒ができたなら、

①各パラメータ(x,yなど)をそれぞれ配列にしてforループで回すか、

②各パラメータを一つのクラスにまとめて、配列にしてforループで回すか、

どちらかが良いと思います。

あと、開発環境なども書いた方がよいですよ。

シエル

Re:画面に雪を降らせたいのですが、理論が判りません

#3

投稿記事 by シエル » 15年前

forループ文の中に、BitBltを一つだけ書いて、ループの中で座標をばらばらに散らして
ループの回数だけ描画させればいいと思います。

シエル

Re:画面に雪を降らせたいのですが、理論が判りません

#4

投稿記事 by シエル » 15年前

超簡単に作ってみましたが、イメージはこんな感じですか?
(完全にシューティングの応用)

注意:
各種ハンドルやメモリデバイスコンテキストなどは、破棄しといてください。

typedef struct {
int x,y,flag;
double rad;
}DATA;

DATA data[100];

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
PAINTSTRUCT ps;
static HDC hdc,mhdc;
HBITMAP hbmp;;
HBRUSH hbrush;
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
hdc = GetDC(hwnd);
//白ブラシ作成
hbrush = CreateSolidBrush(RGB(255,255,255));
SelectObject(mhdc,hbrush);
mhdc=CreateCompatibleDC(NULL);
hbmp=CreateCompatibleBitmap(hdc,700,640);
SelectObject(mhdc,hbmp);
SetTimer(hwnd,1,60,NULL);
return 0;

case WM_TIMER:
PatBlt(mhdc,0,0,700,640,BLACKNESS);
for(int i=0;i<100;i++){
if(data.flag==0){
data.flag=1;
data.x=rand()%700;
data.y=0;
data.rad=2.0f;
break;
}
}

for(int i=0;i<100;i++){
if(data.flag==1){
Ellipse(mhdc,data.x,data.y,data.x+10,data.y+10);
data[i].x+=6.0f*cos(data[i].rad);
data[i].y+=6.0f*sin(data[i].rad);
if(data[i].x<0 || data[i].y>400){
data[i].flag=0;
}
}
}
InvalidateRect(hwnd,NULL,FALSE);
return 0;

case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
BitBlt(hdc,0,0,700,640,mhdc,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
return 0;



追記:
画面の背景は真っ黒にしないと、雪が見えません。 画像

taketoshi

Re:画面に雪を降らせたいのですが、理論が判りません

#5

投稿記事 by taketoshi » 15年前

お二方、お返事ありがとうございます。

昨晩遅くにお二人のレスを見させていただいてから、悩みながら書いてみました。
シエルさんのサンプルソースを参考にしながら書き進めたところ、
なんとか複数個の雪を同時に降らして延々とループさせることができました。構造体って便利ですねー。

これから画像を透過させたり、X軸方向に揺らしたりと手を加えて行きたいと思います。
本当にありがとうございました。またよろしくお願いします。

閉鎖

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