はじめまして、ご質問があります。
C言語を勉強しはじめて4ヶ月くらい経つのですが、現在スクリーンセーバーを作っています。
その中で画面上に雪を降らせたいのですが、コードの書き方が判りません。
ひとつの画像を読み込んで、TIMERを用いてx,y軸をずらしながら描画して一粒降らせる事はできたのですが
これが複数となったときの描画方法のコードの書き方が判りません。。。
Bitbltを何個も書いて複数降らせることも出来たのですが、もう少し良いやり方はありませんか?
乱数を使って画面のあちこちから出現させて消えていくみたいなプログラムを書きたいのです。
サンプル等ありましたらご教授お願いします。
画面に雪を降らせたいのですが、理論が判りません
Re:画面に雪を降らせたいのですが、理論が判りません
こんばんは。
一粒ができたなら、
①各パラメータ(x,yなど)をそれぞれ配列にしてforループで回すか、
②各パラメータを一つのクラスにまとめて、配列にしてforループで回すか、
どちらかが良いと思います。
あと、開発環境なども書いた方がよいですよ。
一粒ができたなら、
①各パラメータ(x,yなど)をそれぞれ配列にしてforループで回すか、
②各パラメータを一つのクラスにまとめて、配列にしてforループで回すか、
どちらかが良いと思います。
あと、開発環境なども書いた方がよいですよ。
Re:画面に雪を降らせたいのですが、理論が判りません
forループ文の中に、BitBltを一つだけ書いて、ループの中で座標をばらばらに散らして
ループの回数だけ描画させればいいと思います。
ループの回数だけ描画させればいいと思います。
Re:画面に雪を降らせたいのですが、理論が判りません
超簡単に作ってみましたが、イメージはこんな感じですか?
(完全にシューティングの応用)
注意:
各種ハンドルやメモリデバイスコンテキストなどは、破棄しといてください。
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;
追記:
画面の背景は真っ黒にしないと、雪が見えません。
(完全にシューティングの応用)
注意:
各種ハンドルやメモリデバイスコンテキストなどは、破棄しといてください。
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;
追記:
画面の背景は真っ黒にしないと、雪が見えません。

Re:画面に雪を降らせたいのですが、理論が判りません
お二方、お返事ありがとうございます。
昨晩遅くにお二人のレスを見させていただいてから、悩みながら書いてみました。
シエルさんのサンプルソースを参考にしながら書き進めたところ、
なんとか複数個の雪を同時に降らして延々とループさせることができました。構造体って便利ですねー。
これから画像を透過させたり、X軸方向に揺らしたりと手を加えて行きたいと思います。
本当にありがとうございました。またよろしくお願いします。
昨晩遅くにお二人のレスを見させていただいてから、悩みながら書いてみました。
シエルさんのサンプルソースを参考にしながら書き進めたところ、
なんとか複数個の雪を同時に降らして延々とループさせることができました。構造体って便利ですねー。
これから画像を透過させたり、X軸方向に揺らしたりと手を加えて行きたいと思います。
本当にありがとうございました。またよろしくお願いします。