/**************/ /* pallot.c */ /****************************************************************************/ /* ** Malliohjelma "animaatiosta": ** Pallot pomppii sinne tänne. ** vl-93 ** Vikoja: 1) väärä rata ** 2) pallot eivät välitä muista palloista ** ** Käyttö: Tee projekti: pallot.c demo.def, ALI\tabhand.c ** ----------------------------------------------------------------------------*/ #include #include #include #include "tabhand.h" /****************************************************************************/ TblClassSWindowMAIN("TblBallClass",NULL,"Pallot pomppii",MsgTbl,0); /****************************************************************************/ typedef struct { int suunta; int vauhti; POINTS p; int r; int on_sisalla; /* Onko hiiri pallon sisalla */ int korkeus; } pallo_tyyppi; static pallo_tyyppi pallot[] = { { 1, 2, {40,40}, 20 , 0, 200}, { 1, 3, {40,40}, 15 , 0, 250}, { 1, 1, {40,40}, 5 , 0, 100}, { 0 } }; static POINTS hiiren_paikka = { 1000, 1000 }; #define AIKA_VALI 50 /* ms */ #define XSCALE (4.0*M_PI/XKOKO) #define YSCALE (pallo->korkeus) static int XKOKO = 400; static int YKOKO = 300; #define X pallo->p.x #define Y pallo->p.y #define R pallo->r /****************************************************************************/ /****************************************************************************/ void PiirraNotPallo(HDC hdc,pallo_tyyppi *pallo) /* Piirretään NOT-kynällä. */ { HGDIOBJ vanha = SelectObject(hdc,GetStockObject(NULL_BRUSH)); SetROP2(hdc,R2_NOT); Ellipse(hdc,X-R,Y-R,X+R,Y+R); SelectObject(hdc,vanha); } /****************************************************************************/ int onko_pallossa(pallo_tyyppi *pallo, POINT pt) { double dx2 = X - pt.x; double dy2 = Y - pt.y; dx2 *= dx2; dy2 *= dy2; return ( dx2 + dy2 < R*R ); } /****************************************************************************/ void muuta_pallon_paikka(HDC hDC, pallo_tyyppi *pallo) { PiirraNotPallo(hDC,pallo); if ( !pallo->on_sisalla && onko_pallossa(pallo,hiiren_paikka) ) { pallo->on_sisalla = 1; pallo->suunta *= -1; } else pallo->on_sisalla = 0; if ( X + R >= XKOKO ) pallo->suunta *= -1; if ( X - R < 0 ) pallo->suunta *= -1; X += pallo->vauhti * pallo->suunta; Y = ( YKOKO - R ) - (int)(fabs(sin(X*XSCALE))*YSCALE); PiirraNotPallo(hDC,pallo); } /****************************************************************************/ static EVENT WM_paint(tMSGParam *msg) /* # MAKE_DC # */ { int i; for (i=0; pallot[i].suunta; i++) PiirraNotPallo(msg->hDC,&pallot[i]); return 0; } /****************************************************************************/ static EVENT WM_create(tMSGParam *msg) /* Ajastin täytyy alustaa jotta se toimisi. */ { SetTimer(msg->hWnd,1,AIKA_VALI,NULL); MoveWindow(msg->hWnd,10,10,XKOKO*1.2,YKOKO*1.2,0); return 0; } static EVENT WM_timer_1(tMSGParam *msg) /* # MAKE_DC # */ { int i; for (i=0; pallot[i].suunta; i++) muuta_pallon_paikka(msg->hDC,&pallot[i]); return 0; } static EVENT WM_mousemove(tMSGParam *msg) { hiiren_paikka = MAKEPOINTS(msg->lParam); return 0; } static EVENT WM_size(tMSGParam *msg) { RECT rc; GetClientRect(msg->hWnd,&rc); XKOKO = rc.right - rc.left; YKOKO = rc.bottom - rc.top; return 0; } /****************************************************************************/ /* Viestien käsittelytaulukko */ /****************************************************************************/ /****************************************************************************/ /***************************************************************************/ static tMSGEntry MsgTbl[] = { EV_HANDLE_WM_DESTROY, { WM_PAINT , DoC , DoC , WM_paint, MAKE_DC }, /*a*/ { WM_CREATE , DoC , DoC , WM_create }, /*a*/ { WM_TIMER , 1 , DoC , WM_timer_1, MAKE_DC }, /*a*/ { WM_MOUSEMOVE , DoC , DoC , WM_mousemove }, /*a*/ { WM_SIZE , DoC , DoC , WM_size }, /*a*/ { 0 } }; /***************************************************************************/