/**************/ /* time2.c */ /****************************************************************************/ /* ** Malliohjelma "animaatiosta": ** Tikku-ukko osoittaa oikealla kädellään missä hiiri menee. ** Vasen käsi pyörii ajan mukana. Aika näkyy myös ikkunan otsikossa. ** Aika voidaan nollata painamalla hiiren nappulaa. ** ** Käyttö: Tee projekti show_man.prj jossa on: ** samplewt.c ** time_man.c ** samplewt.def ** ja aja. ** ** Vesa Lappalainen 15.8.1992 ** ** Muuten tietoa animaatiosta ks. Show_man.c ** ** Tehtäviä: 1) Onko kello tarkka? ** ** 2) Miten kello saataisiin tarkaksi? ** ** 3) Kirjoita ohjelma, missä pallo pomppii abs(sin(x)):n muotoista ** rataa edestakaisin välillä 0-400 (eli kun tulee ** koordinaattiin 400, kääntyy takaisin ja kun ** tulee koordinaattiin 0, kääntyy taas takaisin) ** ** 4) Muuta pomppimisohjelmaa siten, että kun pallo törmää ikkunan ** reunaan, muutetaan suuntaa. Ikkunan koko saadaan selville ** kutsulla GetClientRect (ks. Help). ** ** 5) Kirjoita "Tennis"-peli, missä pallo kulkee suoraviivaista ** rataa ja aina törmätessään ikkunan seinään, kimpoaa oikeaan ** suuntaan. Myös törmätessään kursoriin, muuttaa ** pallo suuntaansa. ** ----------------------------------------------------------------------------*/ #include #include #include char *WindowName = "Aika-ukko"; typedef struct { int pituus; double suunta; POINT alku; } kasi_tyyppi; static kasi_tyyppi Oikea = { 80, 0.0, {60,90} }; static kasi_tyyppi Vasen = { 80, M_PI, {60,90} }; #define AIKA_VALI 50 /* ms */ static double aika = 0; /****************************************************************************/ #define POINT_TO_2(pt) pt.x,pt.y /* Pisteestä 2 erillistä lukua */ #define POINT_PLUS_RA(pt,r,a) \ pt.x+r*cos(a),pt.y-r*sin(a) /* Piste + r*suunta */ /****************************************************************************/ void PiirraNotKasi(HDC hdc,kasi_tyyppi *kasi) /* Piirretään ukon oikea käsi NOT-kynällä. */ { int oldmode; SelectObject(hdc,GetStockObject(NULL_BRUSH)); oldmode=SetROP2(hdc,R2_NOT); MoveTo(hdc,POINT_TO_2(kasi->alku)); LineTo(hdc,POINT_PLUS_RA(kasi->alku,kasi->pituus,kasi->suunta)); SetROP2(hdc,oldmode); } /****************************************************************************/ int muuta_kaden_suunta(HDC hDC, LONG lParam, kasi_tyyppi *kasi) { int dx,dy; POINT pt = MAKEPOINT(lParam); PiirraNotKasi(hDC,kasi); /* Pyyhitään vanha käsi pois */ dx = pt.x - kasi->alku.x; dy = pt.y - kasi->alku.y; if ( dx || dy ) kasi->suunta = atan2(-dy,dx); PiirraNotKasi(hDC,kasi); /* Piirretään uusi oikea käsi tilalle */ return 1; } static HDC hDC = 0; /****************************************************************************/ void MyDraw(HWND hWnd) { if ( !hDC ) if ( ( hDC = GetDC(hWnd) ) == NULL ) return; Ellipse(hDC,40,40,80,80); /* Pää */ MoveTo(hDC, 60, 80); LineTo(hDC, 60,180); /* Keskivartalo */ LineTo(hDC, 20,260); /* Vasen jalka */ MoveTo(hDC, 60,180); LineTo(hDC,100,260); /* Oikea jalka */ MoveTo(hDC, 20,170); PiirraNotKasi(hDC,&Vasen); /* Oikea käsi */ PiirraNotKasi(hDC,&Oikea); /* Oikea käsi */ } /****************************************************************************/ void InitMy(HWND hWnd) /* Ajastin täytyy alustaa jotta se toimisi. */ { SetTimer(hWnd,1,AIKA_VALI,NULL); } /****************************************************************************/ void MyTimer(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { char st[80]; static laskuri = 0; if (wParam || lParam); if ( !hDC ) if ( ( hDC = GetDC(hWnd) ) == NULL ) return; PiirraNotKasi(hDC,&Vasen); /* Pyyhitään vanha käsi pois */ if ( ( Vasen.suunta -= M_PI/45.0 ) < 0 ) Vasen.suunta = 2*M_PI; PiirraNotKasi(hDC,&Vasen); /* Piirretään uusi oikea käsi tilalle */ aika += AIKA_VALI; if ( ++laskuri >= 1000/AIKA_VALI ) { sprintf(st,"Aika-ukko: %8.2lf",aika/1000.0); SetWindowText(hWnd,st); laskuri = 0; } } /****************************************************************************/ /* ** Seuraavissa aliohjelmissa on seuraavat parametrit: ** ** hWnd - ikkunan kahva ** wParam - SHIFT, CTRL ja ALT -näppäimen tile, voidaan testata esim. ** if ( wParam && MK_CONTROL ) ... hommat jos CTRL alhaalla ** lParam - x = LOWORD(lParam) ja y = HIWORD(lParam) ** kätevämpi on kuitenkin selvittää hiren paikka: ** POINT pt = MAKEPOINT(lParam) ** ----------------------------------------------------------------------------*/ /****************************************************************************/ void MyDown(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappa on painettu alas */ { aika = 0; if (hWnd || wParam || lParam); } /****************************************************************************/ void MyUp (HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappi on päästetty ylös */ { if ( !hDC ) if ( ( hDC = GetDC(hWnd) ) == NULL ) return; PiirraNotKasi(hDC,&Vasen); /* Pyyhitään vanha käsi pois */ Vasen.suunta = M_PI; PiirraNotKasi(hDC,&Vasen); /* Piirretään uusi oikea käsi tilalle */ if (hWnd || wParam || lParam); } /****************************************************************************/ void MyMove(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { if (wParam); if ( !hDC ) if ( ( hDC = GetDC(hWnd) ) == NULL ) return; muuta_kaden_suunta(hDC,lParam,&Oikea); }