Added initial playfield rendering

This commit is contained in:
Jon Thysell 2021-10-20 09:34:31 -07:00
parent cf5daf9dc7
commit c90e42305f
5 changed files with 109 additions and 11 deletions

View File

@ -3,6 +3,8 @@
#include "GameWindow.h" #include "GameWindow.h"
void GameWindow_DrawPlayfield(const GameWindow *pGameWindow);
void GameWindow_Init(GameWindow *pGameWindow) void GameWindow_Init(GameWindow *pGameWindow)
{ {
if (pGameWindow->Window != nil) if (pGameWindow->Window != nil)
@ -17,18 +19,99 @@ void GameWindow_Init(GameWindow *pGameWindow)
ShowError("\pGameWindow resource WIND BaseResID missing!", true); 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); 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); SetPort(pGameWindow->Window);
MoveTo(10, 20); if (fullRefresh)
DrawString("\pHello MacLO"); {
// Fill background
ForeColor(blackColor);
PaintRect(pContentRect);
} }
void GameWindow_Show(GameWindow *pGameWindow) GameWindow_DrawPlayfield(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); 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;
}
}
}
}
}

View File

@ -7,14 +7,23 @@
#include "MacCommon.h" #include "MacCommon.h"
#include "GameEngine.h" #include "GameEngine.h"
#define PlayfieldMargin 5
#define LightMargin 10
#define LightSize 50
#define LightCornerSize 10
typedef struct GameWindow typedef struct GameWindow
{ {
WindowPtr Window; WindowPtr Window;
GameEngine Engine; GameEngine Engine;
Rect PlayfieldRect;
} GameWindow; } GameWindow;
void GameWindow_Init(GameWindow *pGameWindow); 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 #endif

View File

@ -58,7 +58,7 @@ void MacLO_AppInit()
// Setup the game window // Setup the game window
GameWindow_Init(&gGameWindow); GameWindow_Init(&gGameWindow);
GameWindow_Draw(&gGameWindow); GameWindow_Draw(&gGameWindow, true);
GameWindow_Show(&gGameWindow); GameWindow_Show(&gGameWindow);
} }
@ -103,7 +103,7 @@ void MacLO_HandleUpdate(const EventRecord *pEvent)
if (window == gGameWindow.Window) if (window == gGameWindow.Window)
{ {
GameWindow_Draw(&gGameWindow); GameWindow_Draw(&gGameWindow, true);
} }
EndUpdate(window); EndUpdate(window);
@ -114,19 +114,25 @@ void MacLO_HandleMouseDown(const EventRecord *pEvent)
WindowPtr window; WindowPtr window;
long windowPart; long windowPart;
long menuChoice; long menuChoice;
Point mousePosition;
windowPart = FindWindow(pEvent->where, &window); windowPart = FindWindow(pEvent->where, &window);
mousePosition = pEvent->where;
switch (windowPart) switch (windowPart)
{ {
case inMenuBar: case inMenuBar:
menuChoice = MenuSelect(pEvent->where); menuChoice = MenuSelect(mousePosition);
MacLO_HandleMenuChoice(menuChoice); MacLO_HandleMenuChoice(menuChoice);
case inSysWindow: case inSysWindow:
SystemClick(pEvent, window); SystemClick(pEvent, window);
break; break;
case inDrag: case inDrag:
DragWindow(window, pEvent->where, &((*GetGrayRgn())->rgnBBox)); DragWindow(window, mousePosition, &((*GetGrayRgn())->rgnBBox));
break;
case inContent:
GlobalToLocal(&mousePosition);
GameWindow_Click(&gGameWindow, &mousePosition);
break; break;
} }
} }

Binary file not shown.

Binary file not shown.