1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include "GameApp.h"
#include "Board.h"
#include "SexyAppFramework/WidgetManager.h"
#include "SexyAppFramework/Common.h"
// The SexyAppFramework resides in the "Sexy" namespace. As a convenience,
// you'll see in all the .cpp files "using namespace Sexy" to avoid
// having to prefix everything with Sexy::
using namespace Sexy;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
GameApp::GameApp()
{
// mProdName is used for internal purposes to indicate the game that we're working on
mProdName = "Demo 1";
// For internal uses, indicates the current product version
mProductVersion = "1.0";
// This is the text that appears in the title bar of the application window
mTitle = StringToSexyStringFast("SexyAppFramework: " + mProdName + " - " + mProductVersion);
// Indicates the registry location where all registry keys will be read from
// and written to. This is stored under the HKEY_CURRENT_USER tree on
// Windows systems.
mRegKey = "PopCap\\SexyAppFramework\\Demo1";
// Set the application width/height in terms of pixels here.
mWidth = 640;
mHeight = 480;
mBoard = NULL;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
GameApp::~GameApp()
{
// Remove our "Board" class which was, in this particular demo,
// responsible for all our game drawing and updating.
// All widgets MUST be removed from the widget manager before deletion.
// More information on the basics of widgets can be found in the Board
// class file. If you tried to delete the Board widget before removing
// it, you will get an assert.
mWidgetManager->RemoveWidget(mBoard);
delete mBoard;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void GameApp::Init()
{
// Let the parent class perform any needed initializations first.
// This should always be done.
SexyAppBase::Init();
// In later demos, you will see more done with this function.
// For now, we have nothing else to initialize, so we are done.
// Once complete, the LoadingThreadProc function will automatically
// start and we will begin loading all our needed resources.
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void GameApp::LoadingThreadProc()
{
// In this particular demo, there are no resources that we
// need to load. In every game and in all subsequent demos, however,
// there will be things we need to load. Besides loading data,
// this thread can also update the progress indicator for the loading
// screen, which you will see in later demos.
// Once complete, the LoadingThreadCompleted function will be called.
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void GameApp::LoadingThreadCompleted()
{
// Let the base app class also know that we have completed
SexyAppBase::LoadingThreadCompleted();
// When we're actually loading resources, we'll set the
// mLoadingFailed variable to "true" if there were any problems
// encountered along the way. If that is the case, just return
// because we won't want the user to get to the main menu or any
// other part of the game. We will want them to exit out.
if (mLoadingFailed)
return;
// Now that we're done loading everything we need (which wasn't
// anything in this particular demo), we need to get the main
// game screen up and running: That is our "Board" class, and
// it will handle all the drawing, updating, and input processing
// for most of the game.
mBoard = new Board(this);
// This is a very important step: Because the Board class is a widget
// (see Board.h/.cpp for more details) we need to tell it what
// dimensions it has and where to place it.
// By default a widget is invisible because its
// width/height are 0, 0. Since the Board class is our main
// drawing area and game logic class, we want to make it the
// same size as the application. For this particular demo, that means
// 640x480. We will use mWidth and mHeight though, as those were
// already set to the proper resolution in GameApp::Init().
mBoard->Resize(0, 0, mWidth, mHeight);
// Also an important step is to add the newly created Board widget to
// the widget manager so that it will automatically have its update, draw,
// and input processing methods called.
mWidgetManager->AddWidget(mBoard);
}
|