From c90e42305f5cf5497cc5d5868166345f76b2a6d0 Mon Sep 17 00:00:00 2001 From: Jon Thysell Date: Wed, 20 Oct 2021 09:34:31 -0700 Subject: [PATCH] Added initial playfield rendering --- src/GameWindow.c | 91 ++++++++++++++++++++++++++++++++++++++++-- src/GameWindow.h | 15 +++++-- src/MacLO.c | 14 +++++-- src/MacLO.pi.bin | Bin 11520 -> 11520 bytes src/MacLO.pi.rsrc.bin | Bin 3712 -> 3712 bytes 5 files changed, 109 insertions(+), 11 deletions(-) diff --git a/src/GameWindow.c b/src/GameWindow.c index 0355174..7e599f1 100644 --- a/src/GameWindow.c +++ b/src/GameWindow.c @@ -3,6 +3,8 @@ #include "GameWindow.h" +void GameWindow_DrawPlayfield(const GameWindow *pGameWindow); + void GameWindow_Init(GameWindow *pGameWindow) { if (pGameWindow->Window != nil) @@ -17,18 +19,99 @@ void GameWindow_Init(GameWindow *pGameWindow) ShowError("\pGameWindow resource WIND BaseResID missing!", true); } + // Setup rects + pGameWindow->PlayfieldRect.left = PlayfieldMargin; + pGameWindow->PlayfieldRect.top = PlayfieldMargin; + pGameWindow->PlayfieldRect.right = (2 * PlayfieldMargin) + (PuzzleSize * (LightSize + LightMargin)) - LightMargin; + pGameWindow->PlayfieldRect.bottom = (2 * PlayfieldMargin) + (PuzzleSize * (LightSize + LightMargin)) - LightMargin;; + + // Load first level GameEngine_LoadLevel(&(pGameWindow->Engine), 0, false); + } -void GameWindow_Draw(GameWindow *pGameWindow) +void GameWindow_Draw(const GameWindow *pGameWindow, Boolean fullRefresh) { + const Rect *pContentRect = &(pGameWindow->Window->portRect); + SetPort(pGameWindow->Window); - MoveTo(10, 20); - DrawString("\pHello MacLO"); + if (fullRefresh) + { + // Fill background + ForeColor(blackColor); + PaintRect(pContentRect); + } + + GameWindow_DrawPlayfield(pGameWindow); } -void GameWindow_Show(GameWindow *pGameWindow) +void GameWindow_DrawPlayfield(const GameWindow *pGameWindow) +{ + int8_t r, c; + Rect lightRect; + + SetPort(pGameWindow->Window); + + // Draw lights + for (r = 0; r < PuzzleSize; r++) + { + lightRect.top = PlayfieldMargin + (r * (LightMargin + LightSize)); + lightRect.bottom = lightRect.top + LightSize; + + for (c = 0; c < PuzzleSize; c++) + { + lightRect.left = PlayfieldMargin + (c * (LightMargin + LightSize)); + lightRect.right = lightRect.left + LightSize; + + if (GameEngine_GetLight(&(pGameWindow->Engine), c, r)) + { + // Draw ON light + ForeColor(whiteColor); + PaintRoundRect(&lightRect, LightCornerSize, LightCornerSize); + } + else + { + // Draw OFF light + ForeColor(blackColor); + PaintRoundRect(&lightRect, LightCornerSize, LightCornerSize); + ForeColor(whiteColor); + FrameRoundRect(&lightRect, LightCornerSize, LightCornerSize); + } + } + } +} + +void GameWindow_Show(const GameWindow *pGameWindow) { ShowWindow(pGameWindow->Window); } + +void GameWindow_Click(GameWindow *pGameWindow, const Point *pPosition) +{ + int8_t r, c; + Rect lightRect; + + if (PtInRect(*pPosition, &(pGameWindow->PlayfieldRect))) + { + for (r = 0; r < PuzzleSize; r++) + { + lightRect.top = PlayfieldMargin + (r * (LightMargin + LightSize)); + lightRect.bottom = lightRect.top + LightSize; + + for (c = 0; c < PuzzleSize; c++) + { + lightRect.left = PlayfieldMargin + (c * (LightMargin + LightSize)); + lightRect.right = lightRect.left + LightSize; + + if (PtInRect(*pPosition, &lightRect)) + { + GameEngine_ToggleLights(&(pGameWindow->Engine), c, r); + GameWindow_DrawPlayfield(pGameWindow); + break; + } + } + } + + } +} diff --git a/src/GameWindow.h b/src/GameWindow.h index 1c13da6..7679f64 100644 --- a/src/GameWindow.h +++ b/src/GameWindow.h @@ -7,14 +7,23 @@ #include "MacCommon.h" #include "GameEngine.h" +#define PlayfieldMargin 5 +#define LightMargin 10 +#define LightSize 50 +#define LightCornerSize 10 + typedef struct GameWindow { - WindowPtr Window; + WindowPtr Window; GameEngine Engine; + Rect PlayfieldRect; } GameWindow; void GameWindow_Init(GameWindow *pGameWindow); -void GameWindow_Draw(GameWindow *pGameWindow); -void GameWindow_Show(GameWindow *pGameWindow); + +void GameWindow_Draw(const GameWindow *pGameWindow, Boolean fullRefresh); +void GameWindow_Show(const GameWindow *pGameWindow); + +void GameWindow_Click(GameWindow *pGameWindow, const Point *pPosition); #endif diff --git a/src/MacLO.c b/src/MacLO.c index 583c44c..4b5cf62 100644 --- a/src/MacLO.c +++ b/src/MacLO.c @@ -58,7 +58,7 @@ void MacLO_AppInit() // Setup the game window GameWindow_Init(&gGameWindow); - GameWindow_Draw(&gGameWindow); + GameWindow_Draw(&gGameWindow, true); GameWindow_Show(&gGameWindow); } @@ -103,7 +103,7 @@ void MacLO_HandleUpdate(const EventRecord *pEvent) if (window == gGameWindow.Window) { - GameWindow_Draw(&gGameWindow); + GameWindow_Draw(&gGameWindow, true); } EndUpdate(window); @@ -114,19 +114,25 @@ void MacLO_HandleMouseDown(const EventRecord *pEvent) WindowPtr window; long windowPart; long menuChoice; + Point mousePosition; windowPart = FindWindow(pEvent->where, &window); + mousePosition = pEvent->where; switch (windowPart) { case inMenuBar: - menuChoice = MenuSelect(pEvent->where); + menuChoice = MenuSelect(mousePosition); MacLO_HandleMenuChoice(menuChoice); case inSysWindow: SystemClick(pEvent, window); break; case inDrag: - DragWindow(window, pEvent->where, &((*GetGrayRgn())->rgnBBox)); + DragWindow(window, mousePosition, &((*GetGrayRgn())->rgnBBox)); + break; + case inContent: + GlobalToLocal(&mousePosition); + GameWindow_Click(&gGameWindow, &mousePosition); break; } } diff --git a/src/MacLO.pi.bin b/src/MacLO.pi.bin index 48b9363ca43ec38cbdbf1cb386dfb36244b1ca6c..743a81f17f08cd8b32079b663e1822f4c0ab491a 100644 GIT binary patch delta 3414 zcmeHKZA=qq9DmyD%k>3lk!?`cj6U>GavzH(wYFcMl;s;Ik;xd!%gXq3&^TV<%#%#m^-T%2OrA6?=vJd-U zlmGSi{NMlo`#*Qj#hPQy{mr`K$+v!}pB(J_dcgcb{*fbA0l`lJWakjFaRbMzlqx)M z`z6ERfQ5(heNVOQSbUT^cI8K4=;;{Jz`thvs@kg%i?pkkTcRBK#&-oN zx1B>sJZ!Nmjm-n*g7NE?wF*TgAaNGkl{$f-%A$Qrq#7`<5!A$MQ>O*13-~Z60&+8k5!?Yo$$u6KitS zx>!{wYF$OROKYt_CXFoLn05n0_ISEHI}vgkFo)<))9wBem(w&7hMbIky}LJxibmR; zhLI1QWr+5~k-j8tl$>(^N+DuK3=X4Kgies2k+99K3RiNfbNy{DIR$9?AZiVeex+rP zCD~(;&04e;4e{a*NNJ&3)X?WIaQC8BBW>;|IB=FDJ<^X{YApsPq~p%urPSs*qm7zt z(7VvdM(uU-kCI&7eKavwr=0G^=j63i0&V4x(a1vgl%ZbZ4x|nVP)tBBCAw%W)l1b< zwZ>UM(i{1#*5WVBu59{I+2^E(vo{<1TIp1pms4q;th;YYCkf4`c^bxmc8h&_T5(i7 zt$%r0U8{-YgzMcCKfm+c1h&q+Dc;i;o5-DUhmr+A&jT$NR~WEz7>VVELa`xlB{lf& zka*2dk=KqClY_@k%#nD{Y%%l?=_XSo()p9)c{vX$s((l!s?1xnggeZyP=kHBVDzGR z-dtvQx}%?>A!b*Q>)?B^mlYT<>^Sn2pj9Dnki!@|u+Phe8QZHlu)v3;t90qy=AE-F ztxS2Sz}uLJhv|`*)+%q9X=K9Ns~wmNvJPC&cQZTq8iD5`DSzN8igD0~t&6&=Aa*t> z+#AxBarr-ev6s&bbU0STg5|*>G*>Gv*IwRYte6tp& z+r~#CeCWRqEJv1l3~jIDz0nTr3ku-~W|?k=l>}t6wsO!^W-lmo)DeNTBzr_;xy^ys zWlw0%p`4s1DWxw5q@hvYP8%H@C1TqkP)eGJ)q)$ou=Y{6S_*p zXX=2CQt??O6;JL1I!!e5=vD9%EQFUayddbOp9U758Fr`N_E|@Z`9nim{_M=~?9A}L zI5QL}T>tXOuvsaptYtJpx=PqK`T_IG@mobDx;*Kd0N(tUsZYPZn`aVd?PsE6XH5tt zlduo1)Yw_DAy{Pxyj;fABfteRR$r&aKKM<>+M~cXA|=sRpQFakOdyJ2?Jv~W`{$4% znJhrq0s1#m`oDwDR0=-?K74#6lTk4E6AU6L!DA5IK^iFu1o#mk_&QM)0{#QVq+la} zzmhSX3;3p-gmxAJjLJ#SO2BtyKCJ=&b9_DERAK73K}UC29op{=u!;@hu%qQ4j~0Js delta 3400 zcmeH~Yj6`)6vyxG$z$23ZIp%$rL>_GETuHHzAu ztD2U@2g)caN+OP;g#smNRU-9C9huP&baZrlj33ld#t#f_{NI~xMaS0%o$-U)x##@O zx#ygFH@kP|G*T6*>Zlr(KXAuKa|WVKJ33F&PF}mV;wZxFpW@~o|0F>9SE&w|lT$^9}$5hV|9;prpSXC^7iVP<`+ zovG|1Rv{IP=n{4@n~ve+`@nS${+NHAe;2b&Jf6mtGoJd&Pw>`Ip&gI0{HNI4*=oP^p_Cs}a#`X(*EHYzzU{xv= zf4TVa%1sSf1wJMPS_bDKqMt_u!psuv8Qf5|37+oa*3|Lg`{h5n*BQIP>ti`gjTy*V z6I=i5*|=-i#(tFL3U;9cA_{+Y*vvgfPUdN&uM9c)kK&mV=>6iZ4|+YtgY8CDW|4b1 z)5~*OQh6Bp7#`#P@e`z0V`paGEapz%LcF)Q*6WD-OzV=#wcZS`Z|1!D^Wt;jX9Zf0 zvS829Y9tpzziH|tbH8Jb*`K(XYSd+qwG2cXf70StsajD{#-ZvJ_J2ZMCEA&9IgFV;nYDWX7$C@@tUh3QgFg`B2kK$d9^NUxTHEO+B@L!YYE zLsn>fsnayR(COMz$TPG?$TPJj$g{L&$g{O&kmqP&$mv=O`Uk=(Vhg%e1Y+o=rujZ4>q!dfK$@ z!Vc0i+}5$6A{=vRdu}-vzKmi*UruqM=h3r5&zB@5NLv>a%1lAr)oFX%u)RQP5c5@q z7N#(Uh=pdxLZ0E0)hdlaF2Vzm)oMHtSzWB@1XZJ15FVnJc!5|GxQ@C6H-eYYF2P~& zHME;^ya!xQ-GV;_Un^ZKVh({DOzsCSr9HyG7~GiNV5|n*WOA(zqnY-KpatM%CNBbq zOK_#G)BbQ;k$)i6Fe7uE4?n*2EL8n z5H+p>uaO)gPp1PyM|8=BNn2rU#a>Akl0S;IJj_+2t`kAGQ&Q;l^d>Z83+bTH)zl~a zchFlxZ=kn@zLVZTP1#c$>_Dx%=-m^nyXn0Xtb0g*f7rx(aIbhN+QkcUpWyoiM}_PV zvQzjs3N~<_Wp$G#W0?o&5GqMqZv{VSauEDbn&Ur$A2$6y@a8n@@q;iPF@wGZKgv0R zFA%;#4rcB9n3DDmN@nn}laiS;F;-(7qh$6Hj1C?trBW%b@p1U|^;aE({x@2Nk&6F9 z$DpU%h(B!^{*{g)TgfkDjy&U|v048&4!`trUgv+LaY*_9>Bb?SjP=E3#`*RVIb%cT zNjY6>>{BJF24uXVl*smDoQ9Oi+z2=5)g{b+ew>frg(SH0v?+ z&UtCJOb36RW;zNkP4oC6@b_shcpW^O$s+ebN<4=~Tku}^kMPr*!#tD0tJ3k-Uc}%i zi&761_e4N>MkOhtVb44Kh7h=hSznDdYzXX1FnysIL^UO{3BgSuT o;xKrH>HiopIi~*z{PpHqkAbsiT3eRYHHM`#d1?Gtv#qrHXZx&g8Mu8Dlb!Q( RbMy1`G8h<`?)D3K0{}Df5d8oE delta 64 rcmZpWZIGR?m+|hzeWu(K7G7Wg1Kx*|85x^4H!wcrk>7SZ7asxub^agS