Ufo.hpp
上传用户:jiameide
上传日期:2010-03-01
资源大小:525k
文件大小:15k
源码类别:

射击游戏

开发平台:

Visual C++

  1. //*******************************************************
  2. //* INVASION - By Maur韈io Teichmann RItter 1998        *
  3. //* Please, respect the copyright                       *
  4. //*******************************************************
  5. // OVNI is the same thing as UFO but in portuguese
  6. // since i磎 brazilian, i think that was better to use the "local" name
  7. // Here a define a class for each one of the game objects (UFO, BULLET, EXTRA)
  8. class Ovni {
  9. private:
  10. int    x;
  11. int    y;
  12. int    mov;
  13. int    AmDown;
  14. int    inc;
  15. int    iExtra;
  16. int    iFrame;
  17. RECT   rcLastPos;
  18. int    ArgPosX;
  19. int    ArgPosY;
  20. int    iExplosionFrame;
  21. int    iQtdeDown;
  22. int    iState;
  23. int    iStr;
  24. Ovni*   Next;
  25. public:
  26. int    iType;
  27. DWORD  dwLastShoot;
  28. Ovni()
  29. {
  30. inc = 1;
  31. x = 0;
  32. y = 0;
  33. AmDown = 0;
  34. mov = 0;
  35. iState = 0;
  36. iExplosionFrame = 0;
  37. dwLastShoot     = 1000 + (rand() % 500);
  38. iType = 0;
  39. iStr = 1;
  40. ArgPosY = 0;
  41. ArgPosX = 0;
  42. iQtdeDown = 80;
  43. }
  44. int GetStr()
  45. {
  46. return iStr;
  47. }
  48. void SetStr(int iQtde)
  49. {
  50. iStr = iQtde;
  51. }
  52. void LowStr(int iQtde)
  53. {
  54. iStr -= iQtde;
  55. }
  56. void SetQtdeDown(int iNewQtde)
  57. {
  58. iQtdeDown = iNewQtde;
  59. }
  60. int CreateExtra(int iFlags)
  61. {
  62. int iPercent;
  63. iPercent = rand() % 150;
  64. iExtra = 0;
  65. if ((iPercent == 0 || iPercent == 25 || iPercent == 45) &&
  66. (iFlags != 2))
  67. iExtra = 2;
  68. if (iPercent > 0 && iPercent < 11)
  69. iExtra = 3;
  70. if (iPercent > 10 && iPercent < 25)
  71. iExtra = 1;
  72. if (iPercent > 25 && iPercent < 45)
  73. iExtra = 4;
  74. if (iPercent == 45 || iPercent == 46)
  75. iExtra = 5;
  76. return iExtra;
  77. }
  78. int GetExtra()
  79. {
  80. return iExtra;
  81. }
  82. void SetAmDown(int newAmDown)
  83. {
  84. AmDown = newAmDown;
  85. }
  86. int GetAmDown(void)
  87. {
  88. return AmDown;
  89. }
  90. void SetInc(int newInc)
  91. {
  92. inc = newInc;
  93. }
  94. int GetInc(void)
  95. {
  96. return inc;
  97. }
  98. void SetMov(int newmov)
  99. {
  100. mov = newmov;
  101. }
  102. int GetMov(void)
  103. {
  104. return mov;
  105. }
  106. void SetXY(int newx, int newy)
  107. {
  108. x = newx;
  109. y = newy;
  110. rcLastPos.top    = y;
  111. rcLastPos.left   = x;
  112. rcLastPos.bottom = y + 70;
  113. rcLastPos.right  = x + 70;
  114. if (rcLastPos.bottom > 460)
  115. rcLastPos.bottom = 460;
  116. if (rcLastPos.left > 640)
  117. rcLastPos.left = 640;
  118. }
  119. Ovni* GetNext(void)
  120. {
  121. return Next;
  122. }
  123. void SetNext(Ovni* nxUfo)
  124. {
  125. Next = nxUfo;
  126. }
  127. int GetX(void)
  128. {
  129. return x;
  130. }
  131. int GetY(void)
  132. {
  133. return y;
  134. }
  135. void SetState(int iNewState)
  136. {
  137. iState = iNewState;
  138. }
  139. void Crash()
  140. {
  141. switch (iType)
  142. {
  143. case 0:
  144. inc = inc * (-1);
  145. break;
  146. case 2:
  147. if (mov == 1)
  148. mov = 0;
  149. else
  150. mov = 1;
  151. break;
  152. }
  153. }
  154. int Move(int iFlags)
  155. {
  156. rcLastPos.top    = y;
  157. rcLastPos.left   = x;
  158. rcLastPos.bottom = y + 70;
  159. rcLastPos.right  = x + 70;
  160. if (rcLastPos.bottom > 460)
  161. rcLastPos.bottom = 460;
  162. if (rcLastPos.right > 640)
  163. rcLastPos.right = 640;
  164. if (rcLastPos.left < 0)
  165. rcLastPos.left = 0;
  166. if (rcLastPos.top < 0)
  167. rcLastPos.top = 0;
  168. switch(iType)
  169. {
  170. case 0:
  171. switch (mov)
  172. {
  173. case 0:
  174. x += inc;
  175. if (y > 300)
  176. {
  177. if (inc > 0)
  178. {
  179. if (x>650)
  180. {
  181. x = 11;
  182. y = -70;
  183. mov = 1;
  184. inc = 1;
  185. AmDown = 0;
  186. }
  187. }
  188. else
  189. {
  190. if (x<-80)
  191. {
  192. x = 560;
  193. y = -70;
  194. mov = 1;
  195. inc = 1;
  196. AmDown = 0;
  197. }
  198. }
  199. }
  200. else
  201. {
  202. if (x == 560 ||
  203. x == 10)
  204. {
  205. AmDown = 0;
  206. mov = 1;
  207. inc = 1;
  208. }
  209. }
  210. break;
  211. case 1:
  212. y += inc;
  213. AmDown += inc;
  214. if (y > 0)
  215. if (AmDown >= iQtdeDown)
  216. {
  217. mov = 0;
  218. if (x == 0)
  219. {
  220. inc = abs(inc);
  221. }
  222. if (x == 560)
  223. {
  224. inc = abs(inc) * (-1);
  225. }
  226. }
  227. break;
  228. }
  229. break;
  230. case 1:
  231. switch(mov)
  232. {
  233. case 0:
  234. x -= inc;
  235. y -= inc;
  236. if (x <= 0)
  237. {
  238. x = 0;
  239. mov = 1;
  240. }
  241. if (y <= 0)
  242. {
  243. y = 0;
  244. mov = 3;
  245. }
  246. break;
  247. case 1:
  248. x += inc;
  249. y -= inc;
  250. if (x >= 560)
  251. {
  252. x = 560;
  253. mov = 0;
  254. }
  255. if (y <= 0)
  256. {
  257. y = 0;
  258. mov = 2;
  259. }
  260. break;
  261. case 2:
  262. x += inc;
  263. y += inc;
  264. if (x >= 560)
  265. {
  266. x = 560;
  267. mov = 3;
  268. }
  269. if (y >= 300)
  270. {
  271. y = 300;
  272. mov = 1;
  273. }
  274. break;
  275. case 3:
  276. x -= inc;
  277. y += inc;
  278. if (x <= 0)
  279. {
  280. x = 0;
  281. mov = 2;
  282. }
  283. if (y >= 300)
  284. {
  285. y = 300;
  286. mov = 0;
  287. }
  288. break;
  289. }
  290. break;
  291. case 2:
  292. switch(mov)
  293. {
  294. case 0:
  295. if (x <= iFlags )
  296. {
  297.     if (iFlags != NULL)
  298. mov = 1;
  299. else
  300. x += inc;
  301. }
  302. else
  303. x +=inc;
  304. if (x >= 650)
  305. {
  306. x = -80;
  307. mov = 0;
  308. }
  309. break;
  310. case 1:
  311. if (x >= iFlags)
  312.     if (iFlags != NULL)
  313. mov = 0;
  314. else
  315. x -= inc;
  316. else
  317. x -=inc;
  318. if (x <= -80)
  319. {
  320. x = 650;
  321. mov = 1;
  322. }
  323. break;
  324. }
  325. break;
  326. }
  327. return TRUE;
  328. }
  329. BOOL isExploding()
  330. {
  331. if (iState == 0)
  332. return FALSE;
  333. else
  334. return TRUE;
  335. }
  336. BOOL DropExtra()
  337. {
  338. if (iState == 1 &&
  339. iExplosionFrame == 12 &&
  340. iExtra != 0
  341. )
  342. return TRUE;
  343. else
  344. return FALSE;
  345. }
  346. BOOL DestroyMe()
  347. {
  348. if (iState == 1 &&
  349. iExplosionFrame == 20)
  350. return TRUE;
  351. return FALSE;
  352. }
  353. /* BOOL Repaint(LPDIRECTDRAWSURFACE7 lpDest, LPDIRECTDRAWSURFACE7 lpSource, int iFlags)
  354. {
  355. HRESULT hRet;
  356. if (iFlags == 1 ||
  357. (iState == 1 && iExplosionFrame > 0))
  358. {
  359. rcLastPos.top    = y - 2;
  360. rcLastPos.left   = x - 2;
  361. rcLastPos.bottom = y + 74;
  362. rcLastPos.right  = x + 74;
  363. if (rcLastPos.bottom > 460)
  364. rcLastPos.bottom = 460;
  365. if (rcLastPos.right > 640)
  366. rcLastPos.right = 640;
  367. if (rcLastPos.top < 0)
  368. rcLastPos.top = 0;
  369. if (rcLastPos.left < 0)
  370. rcLastPos.left = 0;
  371. }
  372. while (1)
  373. {
  374. hRet = lpDest->BltFast(rcLastPos.left, rcLastPos.top, lpSource, &rcLastPos, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
  375. if (hRet == DD_OK)
  376. {
  377. break;
  378. }
  379. if (hRet == DDERR_SURFACELOST)
  380. {
  381. return FALSE;
  382. }
  383. if (hRet != DDERR_WASSTILLDRAWING)
  384. break;
  385. }
  386. return TRUE;
  387. }
  388. */
  389. BOOL Draw(LPDIRECTDRAWSURFACE7 lpDest, LPDIRECTDRAWSURFACE7 lpSource, int iFlags)
  390. {
  391. RECT rcRect;
  392. HRESULT hRet;
  393. int iDiffRight;
  394. int iDiffLeft;
  395. int iDiffBottom;
  396. switch(iState)
  397. {
  398. case 0:
  399. rcRect.left = ArgPosX;
  400. rcRect.top = ArgPosY;
  401. rcRect.right = ArgPosX + 70;
  402. rcRect.bottom = ArgPosY + 70;
  403. if (x+70>640)
  404. {
  405. iDiffRight = x+70-640;
  406. rcRect.right -= iDiffRight;
  407. }
  408. else
  409. iDiffLeft = 0;
  410. if (x<0)
  411. {
  412. iDiffLeft = x * (-1);
  413. rcRect.left += iDiffLeft;
  414. }
  415. else
  416. iDiffLeft = 0;
  417. if (y < 0)
  418. {
  419. iDiffBottom = y * (-1);
  420. rcRect.top += iDiffBottom;
  421. }
  422. else
  423. iDiffBottom = 0;
  424. break;
  425. case 1:
  426. iDiffBottom = 0;
  427. if (iExplosionFrame < 5)
  428. {
  429. ArgPosX = iExplosionFrame * 70;
  430. ArgPosY = 0;
  431. }
  432. if (iExplosionFrame > 4 &&
  433. iExplosionFrame < 9)
  434. {
  435. ArgPosX = (iExplosionFrame-5) * 70;
  436. ArgPosY = 70;
  437. }
  438. if (iExplosionFrame > 9 &&
  439. iExplosionFrame < 14)
  440. {
  441. ArgPosX = (iExplosionFrame-10) * 70;
  442. ArgPosY = 140;
  443. }
  444. if (iExplosionFrame > 14 &&
  445. iExplosionFrame < 20)
  446. {
  447. ArgPosX = (iExplosionFrame-15) * 70;
  448. ArgPosY = 210;
  449. }
  450. rcRect.left = ArgPosX;
  451. rcRect.top = ArgPosY;
  452. rcRect.right = ArgPosX + 70;
  453. rcRect.bottom = ArgPosY + 70;
  454. if (x+70>640)
  455. {
  456. iDiffRight = x+70-640;
  457. rcRect.right -= iDiffRight;
  458. }
  459. else
  460. iDiffLeft = 0;
  461. if (x<0)
  462. {
  463. iDiffLeft = x * (-1);
  464. rcRect.left += iDiffLeft;
  465. }
  466. else
  467. iDiffLeft = 0;
  468. if (y < 0)
  469. {
  470. iDiffBottom = y * (-1);
  471. rcRect.top += iDiffBottom;
  472. }
  473. else
  474. iDiffBottom = 0;
  475. iExplosionFrame++;
  476. break;
  477. }
  478. while (1)
  479. {
  480. hRet = lpDest->BltFast(x+iDiffLeft, y+iDiffBottom, lpSource, &rcRect, TRUE);
  481. if (hRet == DD_OK)
  482. {
  483. hRet = TRUE;
  484. break;
  485. }
  486. if (hRet == DDERR_SURFACELOST)
  487. {
  488. hRet = FALSE;
  489. break;
  490. }
  491. if (hRet != DDERR_WASSTILLDRAWING)
  492. {
  493. hRet = TRUE;
  494. break;
  495. }
  496. }
  497. ArgPosX += 70;
  498. if (ArgPosX == 350)
  499. {
  500. ArgPosX = 0;
  501. ArgPosY += 70;
  502. if (ArgPosY == 700)
  503. ArgPosY = 0;
  504. }
  505. return hRet;
  506. }
  507. };
  508. class Bullet
  509. {
  510. private:
  511. int x;
  512. int y;
  513. RECT rcLastPos;
  514. int iType;
  515. Bullet* pNext;
  516. Bullet* pPrev;
  517. public:
  518. int frame;
  519. Bullet()
  520. {
  521. x = 0;
  522. y = 0;
  523. pNext = NULL;
  524. pPrev = NULL;
  525. frame = 0;
  526. iType = 0;
  527. rcLastPos.left   = 0;
  528. rcLastPos.top    = 0;
  529. rcLastPos.right  = 0;
  530. rcLastPos.bottom = 0;
  531. };
  532. int GetType()
  533. {
  534. return iType;
  535. }
  536. void SetType(int iNewType)
  537. {
  538. iType = iNewType;
  539. }
  540. int GetX()
  541. {
  542. return x;
  543. }
  544. int GetY()
  545. {
  546. return y;
  547. }
  548. int GetPower()
  549. {
  550. switch(iType)
  551. {
  552. case 0:
  553. return 2;
  554. break;
  555. case 2:
  556. return 1;
  557. break;
  558. }
  559. return 1;
  560. }
  561. void Move(int Qtde)
  562. {
  563. rcLastPos.left   = x;
  564. rcLastPos.top    = y;
  565. rcLastPos.right  = x + 20;
  566. rcLastPos.bottom = y + 20;
  567. if (rcLastPos.top < 0)
  568. rcLastPos.top = 0;
  569. if (rcLastPos.bottom > 455)
  570. rcLastPos.bottom = 455;
  571. y -= Qtde;
  572. }
  573. void SetXY(int nx, int ny)
  574. {
  575. rcLastPos.left   = nx;
  576. rcLastPos.top    = ny;
  577. rcLastPos.right  = nx + 20;
  578. rcLastPos.bottom = ny + 20;
  579. x = nx;
  580. y = ny;
  581. }
  582. Bullet* GetNext()
  583. {
  584. return pNext;
  585. }
  586. Bullet* GetPrev()
  587. {
  588. return pPrev;
  589. }
  590. void SetNext(Bullet* nNext)
  591. {
  592. pNext = nNext;
  593. }
  594. void SetPrev(Bullet* nPrev)
  595. {
  596. pPrev = nPrev;
  597. }
  598. BOOL Draw(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource)
  599. {
  600. RECT rcRect;
  601. HRESULT hRet;
  602. int iClipTop;
  603. int iClipBottom;
  604. if (y < 0)
  605. iClipTop = y * -1;
  606. else
  607. iClipTop = 0;
  608. if (y+20 > 455)
  609. iClipBottom = y+20-455;
  610. else
  611. iClipBottom = 0;
  612. if (iType == 2)
  613. frame = 0;
  614. rcRect.left = frame * 20;
  615. rcRect.top = 0 + iClipTop;
  616. rcRect.right = frame * 20 + 20;
  617. rcRect.bottom = 20 - iClipBottom;
  618. frame++;
  619. if (frame == 11 && iType == 0)
  620. frame = 0;
  621. if (frame == 20 && iType == 1)
  622. frame = 0;
  623. while (1)
  624. {
  625. hRet = lpOrigin->BltFast(x + iClipTop, y, lpSource, &rcRect, DDBLTFAST_SRCCOLORKEY);
  626. if (hRet == DD_OK)
  627. {
  628. break;
  629. }
  630. if (hRet == DDERR_SURFACELOST)
  631. {
  632. return FALSE;
  633. }
  634. if (hRet != DDERR_WASSTILLDRAWING)
  635. break;
  636. }
  637. return TRUE;
  638. }
  639. // Flags:
  640. //
  641. // 1 - Draw background
  642. // 2 - Draw bullet
  643. /*
  644. BOOL Repaint(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource, int iFlags)
  645. {
  646. HRESULT hRet;
  647. int iCorrection = 0;
  648. if (iFlags == 1)
  649. {
  650. rcLastPos.top    = y;
  651. rcLastPos.left   = x;
  652. rcLastPos.bottom = y + 20;
  653. rcLastPos.right  = x + 20;
  654. if (rcLastPos.bottom > 460)
  655. rcLastPos.bottom = 460;
  656. }
  657. while (1)
  658. {
  659. hRet = lpOrigin->BltFast(rcLastPos.left, rcLastPos.top, lpSource, &rcLastPos, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
  660. if (hRet == DD_OK)
  661. {
  662. break;
  663. }
  664. if (hRet == DDERR_SURFACELOST)
  665. {
  666. return FALSE;
  667. }
  668. if (hRet != DDERR_WASSTILLDRAWING)
  669. break;
  670. }
  671. return TRUE;
  672. }
  673. */
  674. };
  675. //处理奖子类型的类,奖子定义在图extras.bmp中,它是一副500×125的图像,有五种类型的奖子,每种奖子有20帧,
  676. //平均每个奖子是25*25的分辨率。
  677. class Extra
  678. {
  679. private:
  680. int x;
  681. int y;
  682. RECT rcLastPos;
  683. int iType; //奖子类型,从extras.bmp可以看出共有5种类型
  684. Extra* pNext;
  685. Extra* pPrev;
  686. public:
  687. int frame;//帧编号,从extras.bmp可以看出共有20帧
  688. Extra()
  689. {
  690. x = 0;
  691. y = 0;
  692. pNext = NULL;
  693. pPrev = NULL;
  694. frame = 0;
  695. iType = 0;
  696. rcLastPos.left   = 0;
  697. rcLastPos.top    = 0;
  698. rcLastPos.right  = 0;
  699. rcLastPos.bottom = 0;
  700. };
  701. int GetType()
  702. {
  703. return iType;
  704. }
  705. void SetType(int iNewType)
  706. {
  707. iType = iNewType;
  708. }
  709. int GetX()
  710. {
  711. return x;
  712. }
  713. int GetY()
  714. {
  715. return y;
  716. }
  717. void Move(int Qtde)
  718. {
  719. rcLastPos.left   = x;
  720. rcLastPos.top    = y;
  721. rcLastPos.right  = x + 25;
  722. rcLastPos.bottom = y + 25;
  723. if (rcLastPos.bottom > 455)
  724. rcLastPos.bottom = 455;
  725. //Qtde是一个负值,因为这种奖子都是垂直下落的,即y值需要不断增加
  726. y -= Qtde;
  727. }
  728. void SetXY(int nx, int ny)
  729. {
  730. rcLastPos.left   = nx;
  731. rcLastPos.top    = ny;
  732. rcLastPos.right  = nx + 25;
  733. rcLastPos.bottom = ny + 25;
  734. x = nx;
  735. y = ny;
  736. }
  737. Extra* GetNext()
  738. {
  739. return pNext;
  740. }
  741. Extra* GetPrev()
  742. {
  743. return pPrev;
  744. }
  745. void SetNext(Extra* nNext)
  746. {
  747. pNext = nNext;
  748. }
  749. void SetPrev(Extra* nPrev)
  750. {
  751. pPrev = nPrev;
  752. }
  753. BOOL Draw(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource)
  754. {
  755. RECT rcRect;
  756. HRESULT hRet;
  757. int iClipTop;
  758. int iClipBottom;
  759. if (y < 0)
  760. iClipTop = y * -1;
  761. else
  762. iClipTop = 0;
  763. if (y+25 > 455)
  764. iClipBottom = y+25-455;
  765. else
  766. iClipBottom = 0;
  767. rcRect.left = frame * 25;
  768. rcRect.top = ((iType - 1) * 25) + iClipTop;
  769. rcRect.right = frame * 25 + 25;
  770. rcRect.bottom = ((iType - 1) * 25) + 25 - iClipBottom;
  771. //帧数编号加1
  772. frame++;
  773. if (frame == 20)
  774. frame = 0;
  775. while (1)
  776. {
  777. hRet = lpOrigin->BltFast(x , y, lpSource, &rcRect, DDBLTFAST_SRCCOLORKEY);
  778. if (hRet == DD_OK)
  779. {
  780. break;
  781. }
  782. if (hRet == DDERR_SURFACELOST)
  783. {
  784. return FALSE;
  785. }
  786. if (hRet != DDERR_WASSTILLDRAWING)
  787. break;
  788. }
  789. return TRUE;
  790. }
  791. // Flags:
  792. //
  793. // 1 - Draw background
  794. // 2 - Draw bullet
  795. /*
  796. BOOL Repaint(LPDIRECTDRAWSURFACE lpDest, LPDIRECTDRAWSURFACE lpSource, int iFlags)
  797. {
  798. HRESULT hRet;
  799. int iCorrection = 0;
  800. if (iFlags == 1)
  801. {
  802. rcLastPos.top    = y;
  803. rcLastPos.left   = x;
  804. rcLastPos.bottom = y + 25;
  805. rcLastPos.right  = x + 25;
  806. if (rcLastPos.bottom > 455)
  807. rcLastPos.bottom = 455;
  808. }
  809. while (1)
  810. {
  811. hRet = lpDest->BltFast(rcLastPos.left, rcLastPos.top, lpSource, &rcLastPos, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
  812. if (hRet == DD_OK)
  813. {
  814. break;
  815. }
  816. if (hRet == DDERR_SURFACELOST)
  817. {
  818. return FALSE;
  819. }
  820. if (hRet != DDERR_WASSTILLDRAWING)
  821. break;
  822. }
  823. return TRUE;
  824. }
  825. */
  826. };
  827. // The alpha strucute is used to map the alphabet bitmap, so that we can
  828. // bli the alphabet to the screen
  829. struct Alpha
  830. {
  831. unsigned int start;
  832. unsigned int end;
  833. };
  834. const Alpha AA[40] = 
  835. {
  836. {0,14},{19,27},{31,46},{47,61},{65,78},{80,94},
  837. {96,110},{114,125},{128,143},{145,159},{160,175},
  838. {176,191},{193,206},{207,222},{224,237},{238,252},{253,267},
  839. {269,284},{285,291},{292,307},{308,323},{324,338},{340,364},
  840. {365,380},{382,397},{398,413},{414,429},{430,444},{447,460},
  841. {464,475},{477,492},{494,508},{509,533},{533,548},{550,564},
  842. {564,579},{579,599},{600,610},{611,615},{617,620}
  843. };