124 :
wkitty.c(3)をいじってみる:02/09/17 01:00
>>107 SetTimer を使ってみたらかなり遅くなったので、default: でペイントして
WM_TIMER でInvalidateRectしてみたが、これは考えていた動きじゃない。
ウィンドウ上でマウスをグリグリした時だけ早く動く。
SetTimer したらメッセージループがタイマー値か他のイベントが入ってこないと
回ってくれないみたいだ。
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){
//RECT r;r.left=xx-SIZEX/2-DX-4;r.top=yy-UPY-DY;r.right=xx+SIZEX/2+DX+4;r.bottom=yy+LOY+DY;
switch(uMsg){
#ifndef DEBUG
#define IDTIMER 10000
case WM_CREATE: SetTimer(hWnd,IDTIMER,10,NULL);break;
case WM_TIMER: if (wP==IDTIMER)InvalidateRect(hWnd,NULL,TRUE);break;
#endif
case WM_DESTROY:
MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.3 2002.09.16",CN,MB_OK);
PostQuitMessage(0);break;
case WM_PAINT: return OnPaint(hWnd);
case WM_SIZE:
wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break;
#ifdef DEBUG
case WM_LBUTTONDOWN:OnPaint(hWnd);InvalidateRect(hWnd,&r,TRUE);break;
#endif
default:
#ifndef DEBUG
OnPaint(hWnd);
#endif
return DefWindowProc(hWnd,uMsg,wP,lP);
}return 0L;}
>>123 いや、これは単なるグラフィックスでGUIではないだろ・・
126 :
C言語暦ンヶ月:02/09/17 15:58
>>125 オレにとってはDOSプロンプトでないだけでGUIなのですw
すみません、素で知りませんでした…。
やっぱりグラフィックスだのGUIだのは、
猫でもで一通り勉強してから改造したりして遊ぶものですかね。
まだCをある程度使える -> C++ -> SDKだのと道のりは遠いです。
ところでwkittyさんのやつは、
円柱とかも作れますよね?
昨
昨…ってなんだーーー!?
らt
らt…ってなんだーーー!?
>>126 GUIはシステム(OSやライブラリ等)によっても大分違いますが、
CやC++は覚えておくと、大体どこへいっても役に立ちます。
きっちり理解してから先へ進むのがよいでしょう。
2〜3ヶ月もあれば、大抵のことはできるようになると思います。
グラフィックはAPI,MSCなどを使うよりも
目的別のラッパーライブラリを使う方が便利といえば便利です。
(フリーのゲーム用ライブラリとかです)
131 :
C言語暦ンヶ月:02/09/17 19:36
>>127ワラタw
>>130 がむばってみます。
とりあえず、ハ○ーキ○oのやつをしぃに改造しているのですが、
構造体の数を変更
defineの数を変更した時点でコンパイルしても
「不正な処理」がでて開けなかった。
折れって素質無いのかもw
132 :
デフォルトの名無しさん:02/09/17 19:39
i++より、
++iのほうが速いんですか?
わざわざ考えるほどには違わない。
同じではないということ?
>>132 >>135もそうだけど,iの型によっても変わる。
(ちょっとスレ違いだが)iがSTLの(でかめの)イテレータだった場合は ++i の方が断然速い。
137 :
デフォルトの名無しさん:02/09/17 20:05
i+1
i+i
138 :
C言語暦ンヶ月:02/09/17 20:18
>>137 2 * i よりは i + iの方が速そうですね。
>>136 ということは、 i++でも++i でも変わらないときは
とりあえず ++i にしといたほうがお得ということですか?
C言語以外(Perlとか)ではどうなんだろう。。
>>138 基本的に ++i の方が値を保存しておく必要がないので速い。
ただし最適化によって変わるので一概に言えない。まあ++iの方が良いってことさね。
ちょっとずれるが,Perlは
if (EXPR) {
hoge;
}
よりも
hoge if (EXPR);
の方が速い。
140 :
C言語暦ンヶ月:02/09/17 21:28
/* 長くて申し訳ありません */
/* (・∀・) ( ・∀) ( ・) ( ) (・ ) (∀・ ) (・∀・) !! */
#define EN 5
//顔面パーツ.色・中心座標・大きさ定義(楕円球)
struct{
int r, g, b; // RGB=色
double x, y, z; // 中心座標
double w, h, d; // 幅,高さ,奥行き
}el[EN]={
/* 赤 緑 青 x y z 幅 高 奥 */
{255,255,255, 0, 0, 0,74,60,60},
{255,255,255,-25,20, 0,20,30,12},
{255,255,255, 25,20, 0,20,30,12},
{ 0, 0, 0,-20,-6,24, 4, 6, 4},
{ 0, 0, 0, 20,-6,24, 4, 6, 4}
};
#define LN 3
//ひげの座標定義(直線)
struct{
double x1, y1, z1;
double x2, y2, z2;
}li[LN]={
/* 始点 x y z 終点 x y z */
{ 0,-20,25, 15,10,25},
{ 0,-20,25,-15,10,25},
{-10, 0,25, 10, 0,25}
};
141 :
デフォルトの名無しさん:02/09/17 22:16
>>140 耳が ∩ じゃないか。 ∧ じゃないとw
>>141 そだね。耳が∩じゃ家猫じゃなくて山猫になってしまう。
あの描画ルーチンはあんまり汎用性ないです。
正立した楕円球と直線しか考えてないです。
アソパソマソぐらいはモデリングデータの変更だけで回ると思います。
ギコ猫の耳を回すために、楕円錐の struct 配列を三角形の Polygon で描画するルーチンと、
耳の付け根を顔面の楕円より先に描画しないようにソートの開始・終了位置を工夫する
方法は考えてありますが、kitty のちらつきを無くして安定して早く回す方が優先
だったので、次からその解決版をアプします。(毎度長くてごめん)
144 :
wkitty.c(1)完成版:02/09/18 00:13
/* wkitty.c : No Mouth CAT Version 0.4 2002.09.17 by anonymous */
#include <windows.h>
#include <math.h>
#define EN 9
struct{int r;int g;int b;double x;double y;double z;double w;double h;double d;}el[EN]={
{255,255,255,0,0,0,74,60,60},{255,255,255,-25,20,0,20,30,12},{255,255,255,25,20,0,20,30,12},
{255,255,0,0,-11,29,8,4,4},{0,0,0,-20,-6,24,4,6,4},{ 0,0,0,20,-6,24,4,6,4},
{255,0,0,17,20,10,14,14,10},{255,0,0,8,25,8,16,20,10},{255,0,0,26,15,12,16,20,10}};
#define LN 6
struct{double x1;double y1;double z1;double x2;double y2;double z2;}li[LN]={
{29,-1,21,40,-1,21},{28,-8,20,39,-12,20},{25,-15,18,37,-23,18},
{-29,-1,21,-40,-1,21},{-28,-8,20,-39,-12,20},{-25,-15,18,-37,-23,18}};
#define SIZEX 92
#define UPY 36
#define LOY 31
#define DX 1
#define DY 1
#define SIZEY (UPY+LOY)
LPCSTR CN="Wkitty";int wx=300,wy=200,xx=150,yy=100,dx=DX,dy=DY;HDC hDC,hmDC;PAINTSTRUCT ps;HBITMAP hBit;
145 :
wkitty.c(2)完成版:02/09/18 00:14
/* 描画関数 */ LRESULT CALLBACK OnPaint(HWND hWnd){const double PI=3.14159;static int d=0;int i,j,k;
enum ot{LI,EL};struct{enum ot t;double z;int n;}s[EN+LN],u;double rd,sr,cr,xc,xw,wc,ds,th;
HBRUSH hBOld,hB[EN];HPEN hPenOld;
hDC=BeginPaint(hWnd, &ps);hPenOld=(HPEN)SelectObject(hmDC,GetStockObject(BLACK_PEN));
hBOld=(HBRUSH)SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY);
rd=2*PI*d/360;sr=sin(rd);cr=cos(rd);
for(i=0;i<EN;++i){s[i].t=EL;s[i].n=i;s[i].z=el[i].x*sr+el[i].z*cr;}
for(i=EN;i<EN+LN;++i){j=i-EN;s[i].t=LI;s[i].n=j;s[i].z=(li[j].x1*sr+li[j].z1*cr+li[j].x2*sr+li[j].z2*cr)/2;}
k=EN+LN-1;while(k>=0){j=-1;for(i=1;i<=k;i++){if(s[i-1].z>s[i].z){j=i-1;u.t=s[j].t;s[j].t=s[i].t;
s[i].t=u.t;u.z=s[j].z;s[j].z=s[i].z;s[i].z=u.z;u.n=s[j].n;s[j].n=s[i].n;s[i].n=u.n;}}k=j;}
for(i=0;i<EN+LN;++i){switch(s[i].t){
case EL:hB[s[i].n]=CreateSolidBrush(RGB(el[s[i].n].r,el[s[i].n].g,el[s[i].n].b));
SelectObject(hmDC,hB[s[i].n]);xc=cr*el[s[i].n].x-sr*el[s[i].n].z;th=atan(-el[s[i].n].d*sr/el[s[i].n].w/cr);
wc=cos(th)*el[s[i].n].w/2;ds=sin(th)*el[s[i].n].d/2;xw=sqrt(wc*wc+ds*ds);
Ellipse(hmDC,xc-xw+SIZEX/2,UPY-el[s[i].n].y-el[s[i].n].h/2,xc+xw+SIZEX/2,UPY-el[s[i].n].y+el[s[i].n].h/2);break;
case LI: MoveToEx(hmDC,cr*li[s[i].n].x1-sr*li[s[i].n].z1+SIZEX/2,UPY-li[s[i].n].y1,NULL);
LineTo(hmDC,cr*li[s[i].n].x2-sr*li[s[i].n].z2+SIZEX/2,UPY-li[s[i].n].y2);break;}}
SelectObject(hmDC,hBOld);SelectObject(hmDC,hPenOld);
for(i=0;i<EN;++i)DeleteObject(hB[i]);EndPaint(hWnd,&ps);++d;if(d>=360)d=0;return 0L;}
146 :
wkitty.c(3)完成版:02/09/18 00:15
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){ int i;
switch(uMsg){case WM_CREATE:
#ifndef DEBUG
#define IDTIMER 10000
SetTimer(hWnd,IDTIMER,10,NULL);
#endif
hDC=GetDC(hWnd);hmDC=CreateCompatibleDC(hDC);hBit=CreateCompatibleBitmap(hDC,SIZEX,SIZEY);SelectObject(hmDC,hBit);
SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY);ReleaseDC(hWnd,hDC);break;
case WM_DESTROY: DeleteDC(hmDC);DeleteObject(hBit);
MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.4 2002.09.17",CN,MB_OK);PostQuitMessage(0);break;
case WM_PAINT: OnPaint(hWnd);BitBlt(hDC,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);break;
case WM_SIZE: wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break;
#ifdef DEBUG
case WM_LBUTTONDOWN:
#else
case WM_TIMER: for(i=0;i<50;++i){
#endif
xx+=dx;if(xx<=SIZEX/2){dx=DX;xx=SIZEX/2;}if(xx>=wx-SIZEX/2){dx=-DX;xx=wx-SIZEX/2;}
yy+=dy;if(yy<=UPY){dy=DY;yy=UPY;}if(yy>=wy-LOY){dy=-DY;yy=wy-LOY;}
OnPaint(hWnd);BitBlt(hDC,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);
#ifndef DEBUG
}
#endif
break;
default: return DefWindowProc(hWnd,uMsg,wP,lP);}return 0L;}
147 :
wkitty.c(4)完成版:02/09/18 00:16
/* WinMain 関数 */ int WINAPI WinMain(HINSTANCE I,HINSTANCE hPI,LPSTR lCL,int n){
HWND h;MSG m;WNDCLASS w;w.hInstance=I;w.lpszClassName=CN;w.lpfnWndProc=WP;w.style=0;
w.hIcon=LoadIcon(NULL,IDI_APPLICATION);w.hCursor=LoadCursor(NULL,IDC_ARROW);
w.lpszMenuName=NULL;w.cbClsExtra=w.cbWndExtra=0;w.hbrBackground=(HBRUSH)COLOR_WINDOW;
if(!RegisterClass(&w))return 0;
h=CreateWindow(CN,CN,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,wx,wy,NULL,NULL,I,NULL);
ShowWindow(h,n);UpdateWindow(h);
while(GetMessage(&m,NULL,0,0)){TranslateMessage(&m);DispatchMessage(&m);}return m.wParam;}
148 :
wkitty:02/09/18 00:22
SetTimer と WM_Timer は、54msec 以下のタイマー値を与えても
意味が無く、 WM_Timer で一回だけ描画すると遅くなります。
default で描画するとイベントキューにイベントが入る都度描画するので、
マウスグリグリで描画が早くなりました。
結局、WM_TIMER で50回描画する事にしました。
ビットマップバッファに描いてBitBltする事でちらつきを押さえました。
151 :
デフォルトの名無しさん:02/09/18 21:19
ちらつきどころか、
なにも表示されなくなりました>wkitty.c ver0.4
>151
うーむ、ビットマップバッファとメインウィンドウのデバイスコンテキスト
の扱いにあまり自信がないけど、こう書いたらうちの Win Me では動きました。
OSもしくはグラフィックドライバに癖あるんでしょうか。
参考にしてるおソースでは GetDC BitBlt ReleaseDC の順で処理されてるけど、
これはそうなってない。
もいっかい検討します。
/* 描画関数 */ LRESULT CALLBACK OnPaint(void){const double PI=3.14159;static int d=0;int i,j,k;
enum ot{LI,EL};struct{enum ot t;double z;int n;}s[EN+LN],u;double rd,sr,cr,xc,xw,wc,ds,th;
HBRUSH hBOld,hB[EN];HPEN hPenOld;
hPenOld=(HPEN)SelectObject(hmDC,GetStockObject(BLACK_PEN));
hBOld=(HBRUSH)SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY);
rd=2*PI*d/360;sr=sin(rd);cr=cos(rd);
for(i=0;i<EN;++i){s[i].t=EL;s[i].n=i;s[i].z=el[i].x*sr+el[i].z*cr;}
for(i=EN;i<EN+LN;++i){j=i-EN;s[i].t=LI;s[i].n=j;s[i].z=(li[j].x1*sr+li[j].z1*cr+li[j].x2*sr+li[j].z2*cr)/2;}
k=EN+LN-1;while(k>=0){j=-1;for(i=1;i<=k;i++){if(s[i-1].z>s[i].z){j=i-1;u.t=s[j].t;s[j].t=s[i].t;
s[i].t=u.t;u.z=s[j].z;s[j].z=s[i].z;s[i].z=u.z;u.n=s[j].n;s[j].n=s[i].n;s[i].n=u.n;}}k=j;}
for(i=0;i<EN+LN;++i){switch(s[i].t){
case EL:hB[s[i].n]=CreateSolidBrush(RGB(el[s[i].n].r,el[s[i].n].g,el[s[i].n].b));
SelectObject(hmDC,hB[s[i].n]);xc=cr*el[s[i].n].x-sr*el[s[i].n].z;th=atan(-el[s[i].n].d*sr/el[s[i].n].w/cr);
wc=cos(th)*el[s[i].n].w/2;ds=sin(th)*el[s[i].n].d/2;xw=sqrt(wc*wc+ds*ds);
Ellipse(hmDC,xc-xw+SIZEX/2,UPY-el[s[i].n].y-el[s[i].n].h/2,xc+xw+SIZEX/2,UPY-el[s[i].n].y+el[s[i].n].h/2);break;
case LI: MoveToEx(hmDC,cr*li[s[i].n].x1-sr*li[s[i].n].z1+SIZEX/2,UPY-li[s[i].n].y1,NULL);
LineTo(hmDC,cr*li[s[i].n].x2-sr*li[s[i].n].z2+SIZEX/2,UPY-li[s[i].n].y2);break;}}
SelectObject(hmDC,hBOld);SelectObject(hmDC,hPenOld);
for(i=0;i<EN;++i)DeleteObject(hB[i]);
++d;if(d>=360)d=0;return 0L;}
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){ int i;
switch(uMsg){case WM_CREATE:
#ifndef DEBUG
#define IDTIMER 10000
SetTimer(hWnd,IDTIMER,10,NULL);
#endif
hDC=GetDC(hWnd);hmDC=CreateCompatibleDC(hDC);hBit=CreateCompatibleBitmap(hDC,SIZEX,SIZEY);SelectObject(hmDC,hBit);
SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY);ReleaseDC(hWnd,hDC);break;
case WM_DESTROY: DeleteDC(hmDC);DeleteObject(hBit);
MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.5 2002.09.18",CN,MB_OK);PostQuitMessage(0);break;
case WM_PAINT:
OnPaint();BeginPaint(hWnd,&ps);BitBlt(ps.hdc,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);EndPaint(hWnd,&ps);break;
case WM_SIZE: wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break;
#ifdef DEBUG
case WM_LBUTTONDOWN:
#else
case WM_TIMER: for(i=0;i<50;++i){
#endif
xx+=dx;if(xx<=SIZEX/2){dx=DX;xx=SIZEX/2;}if(xx>=wx-SIZEX/2){dx=-DX;xx=wx-SIZEX/2;}
yy+=dy;if(yy<=UPY){dy=DY;yy=UPY;}if(yy>=wy-LOY){dy=-DY;yy=wy-LOY;}
OnPaint();hDC=GetDC(hWnd);BitBlt(hDC,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);ReleaseDC(hWnd,hDC);
#ifndef DEBUG
}
#endif
break;
default: return DefWindowProc(hWnd,uMsg,wP,lP);}return 0L;}
どうも PAINTSTRUCT やデバイスコンテキストの初期化、再取得などの手順を
いまいち理解していなくて、参考にしているおソースを参考に修正してみました。
これで描画できるでしょうか?
いやだからどうしてお前はソースをどっかにまとめてうpしないんだと小一時間
>>156 このスレがソース垂れ流しも可能なオナニースレだからでしょう。
>>156 昔は NetNews という BASE64 でソース添付して PDS 公開する場があった。
今はどこのプロバイダも帯域浪費して S/N 比が悪く、不毛な議論が多くて
恩恵を受けるユーザが多いか少ないか判らない NNTP をサービスしたがらない。
俺の入ってるプロバイダもニュースサーバ立ってない。
で、ま、今の俺にとっては S/N 比の点と無秩序な所と閲覧者の数の多さの点で
2ch が NetNews の代わりかな、と。
どっかにまとめてうpしても見てくれる人が少ないんで。
このスレがソース垂れ流し可能なオナニースレだからってのも正解です。
>>158 fjやめてrec.*/alt.*に移行しろ
161 :
デフォルトの名無しさん:02/09/19 21:28
おれは
>>160はかちゅ非対応だし、
ログにとって持ち歩く(w こともできんので、
ここに張ってほしいわ。
まあここに貼ったって見てくれる人は少ないことに
変わりないと思うが。
ごめん、スレ違だ
sage
Scheme !
最後の2行は無視してお願い
痔ってつらいね。
お、俺も…(-_-)
ばかやろこのやろうめ
VB.NET 最強!!