]>
Commit | Line | Data |
---|---|---|
025e88c5 JS |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: bombs.cpp | |
3 | // Purpose: Bombs game | |
4 | // Author: P. Foggia 1996 | |
5 | // Modified by: | |
6 | // Created: 1996 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) 1996 P. Foggia | |
9 | // Licence: wxWindows licence | |
10 | /////////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifdef __GNUG__ | |
13 | #pragma implementation | |
14 | #endif | |
15 | ||
16 | #include "wx/wxprec.h" | |
17 | ||
18 | #ifndef WX_PRECOMP | |
19 | #include "wx/wx.h" | |
20 | #endif //precompiled headers | |
21 | ||
22 | #include "bombs.h" | |
23 | ||
24 | #include <time.h> | |
25 | #include <stdlib.h> | |
26 | ||
618f2efa | 27 | #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) |
025e88c5 JS |
28 | #include "bombs.xpm" |
29 | #endif | |
30 | ||
31 | IMPLEMENT_APP(AppClass) | |
32 | ||
33 | // Called to initialize the program | |
34 | bool AppClass::OnInit() | |
35 | { | |
36 | srand((unsigned)time(NULL)); | |
37 | ||
38 | // Initialize all the top-level window members to NULL. | |
39 | BombsFrame = NULL; | |
40 | level=IDM_EASY; | |
41 | ||
42 | BombsFrame = | |
babd36de | 43 | new BombsFrameClass(NULL, _T("wxBombs"), wxPoint(155, 165), wxSize(300, 300), wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX ); |
025e88c5 JS |
44 | |
45 | int xmax=BombsFrame->BombsCanvas->field_width*BombsFrame->BombsCanvas->x_cell*X_UNIT; | |
46 | int ymax=BombsFrame->BombsCanvas->field_height*BombsFrame->BombsCanvas->y_cell*Y_UNIT; | |
47 | BombsFrame->SetClientSize(xmax, ymax); | |
48 | ||
49 | return TRUE; | |
50 | } | |
51 | ||
52 | BEGIN_EVENT_TABLE(BombsFrameClass, wxFrame) | |
53 | EVT_MENU(IDM_EASY, BombsFrameClass::OnEasy) | |
54 | EVT_MENU(IDM_MEDIUM, BombsFrameClass::OnMedium) | |
55 | EVT_MENU(IDM_DIFFICULT, BombsFrameClass::OnDifficult) | |
56 | EVT_MENU(IDM_EXIT, BombsFrameClass::OnExit) | |
57 | EVT_MENU(IDM_ABOUT, BombsFrameClass::OnAbout) | |
58 | EVT_MENU(IDM_RESTART, BombsFrameClass::OnRestart) | |
59 | EVT_CLOSE(BombsFrameClass::OnCloseWindow) | |
60 | END_EVENT_TABLE() | |
61 | ||
62 | BombsFrameClass::BombsFrameClass(wxFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, long style): | |
63 | wxFrame(parent, -1, title, pos, size, style) | |
64 | { | |
65 | // Initialize child subwindow members. | |
66 | BombsCanvas = NULL; | |
67 | ||
68 | SetIcon(wxICON(bombs)); | |
69 | ||
70 | CreateStatusBar(); | |
71 | ||
72 | // Create a menu bar for the frame | |
73 | wxMenuBar *menuBar1 = new wxMenuBar; | |
74 | wxMenu *menu1 = new wxMenu; | |
f37c24e0 | 75 | menu1->Append(IDM_EXIT, _T("E&xit")); // , "Quit the program"); |
025e88c5 | 76 | menu1->AppendSeparator(); |
f37c24e0 MB |
77 | menu1->Append(IDM_ABOUT, _T("&About...")); // , "Infos on wxBombs"); |
78 | menuBar1->Append(menu1, _T("&File")); | |
025e88c5 | 79 | wxMenu *menu2 = new wxMenu; |
f37c24e0 | 80 | menu2->Append(IDM_RESTART, _T("&Restart")); // , "Clear the play field"); |
025e88c5 | 81 | menu2->AppendSeparator(); |
f37c24e0 MB |
82 | menu2->Append(IDM_EASY, _T("&Easy"), wxEmptyString, TRUE); // "10x10 play field", TRUE); |
83 | menu2->Append(IDM_MEDIUM, _T("&Medium"), wxEmptyString, TRUE); // "15x15 play field", TRUE); | |
84 | menu2->Append(IDM_DIFFICULT, _T("&Difficult"), wxEmptyString, TRUE); // "25x20 play field", TRUE); | |
85 | menuBar1->Append(menu2, _T("&Game")); | |
025e88c5 JS |
86 | SetMenuBar(menuBar1); |
87 | menuBar=menuBar1; | |
88 | menuBar->Check(wxGetApp().level, TRUE); | |
89 | ||
90 | // Create child subwindows. | |
91 | BombsCanvas = new BombsCanvasClass(this); | |
92 | ||
93 | // Ensure the subwindows get resized o.k. | |
94 | // OnSize(width, height); | |
95 | ||
96 | // Centre frame on the screen. | |
97 | Centre(wxBOTH); | |
98 | ||
99 | // Show the frame. | |
100 | Show(TRUE); | |
101 | } | |
102 | ||
103 | BombsFrameClass::~BombsFrameClass(void) | |
104 | { | |
105 | } | |
106 | ||
babd36de | 107 | void BombsFrameClass::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) |
025e88c5 JS |
108 | { |
109 | this->Destroy(); | |
110 | } | |
111 | ||
babd36de | 112 | void BombsFrameClass::OnExit(wxCommandEvent& WXUNUSED(event)) |
025e88c5 JS |
113 | { |
114 | this->Destroy(); | |
115 | } | |
116 | ||
babd36de | 117 | void BombsFrameClass::OnRestart(wxCommandEvent& WXUNUSED(event)) |
025e88c5 JS |
118 | { |
119 | BombsCanvas->UpdateFieldSize(); | |
120 | int xmax=BombsCanvas->field_width*BombsCanvas->x_cell*X_UNIT; | |
121 | int ymax=BombsCanvas->field_height*BombsCanvas->y_cell*Y_UNIT; | |
122 | wxGetApp().BombsFrame->SetClientSize(xmax, ymax); | |
123 | } | |
124 | ||
babd36de | 125 | void BombsFrameClass::OnAbout(wxCommandEvent& WXUNUSED(event)) |
025e88c5 | 126 | { |
f37c24e0 | 127 | wxMessageBox(_T("wxBombs (c) 1996 by P. Foggia\n<foggia@amalfi.dis.unina.it>"), _T("About wxBombs")); |
025e88c5 JS |
128 | } |
129 | ||
babd36de | 130 | void BombsFrameClass::OnEasy(wxCommandEvent& WXUNUSED(event)) |
025e88c5 JS |
131 | { |
132 | menuBar->Check(wxGetApp().level, FALSE); | |
133 | wxGetApp().level=IDM_EASY; | |
134 | menuBar->Check(wxGetApp().level, TRUE); | |
135 | } | |
136 | ||
babd36de | 137 | void BombsFrameClass::OnMedium(wxCommandEvent& WXUNUSED(event)) |
025e88c5 JS |
138 | { |
139 | menuBar->Check(wxGetApp().level, FALSE); | |
140 | wxGetApp().level=IDM_MEDIUM; | |
141 | menuBar->Check(wxGetApp().level, TRUE); | |
142 | } | |
143 | ||
babd36de | 144 | void BombsFrameClass::OnDifficult(wxCommandEvent& WXUNUSED(event)) |
025e88c5 JS |
145 | { |
146 | menuBar->Check(wxGetApp().level, FALSE); | |
147 | wxGetApp().level=IDM_DIFFICULT; | |
148 | menuBar->Check(wxGetApp().level, TRUE); | |
149 | } | |
150 | ||
151 | BEGIN_EVENT_TABLE(BombsCanvasClass, wxWindow) | |
152 | EVT_PAINT(BombsCanvasClass::OnPaint) | |
153 | EVT_MOUSE_EVENTS(BombsCanvasClass::OnEvent) | |
154 | END_EVENT_TABLE() | |
155 | ||
156 | BombsCanvasClass::BombsCanvasClass(wxFrame *parent, const wxPoint& pos, const wxSize& size, long style): | |
157 | wxWindow(parent, -1, pos, size, style) | |
158 | { | |
159 | int sx, sy; | |
160 | wxClientDC dc(this); | |
161 | wxFont font= BOMBS_FONT; | |
162 | dc.SetFont(font); | |
163 | ||
164 | long chw, chh; | |
f37c24e0 | 165 | wxChar buf[]=_T("M"); |
025e88c5 JS |
166 | |
167 | dc.GetTextExtent(buf, &chw, &chh); | |
168 | dc.SetFont(wxNullFont); | |
169 | ||
e3065973 | 170 | dc.SetMapMode(wxMM_METRIC); |
025e88c5 | 171 | |
babd36de JS |
172 | int xcm = dc.LogicalToDeviceX(10); |
173 | int ycm = dc.LogicalToDeviceY(10); | |
025e88c5 JS |
174 | // To have a square cell, there must be : |
175 | // sx*ycm == sy*xcm | |
176 | if (chw*ycm < chh*xcm) | |
177 | { sy=chh; | |
178 | sx=chh*xcm/ycm; | |
179 | } | |
180 | else | |
181 | { sx=chw; | |
182 | sy=chw*ycm/xcm; | |
183 | } | |
184 | x_cell = (sx+3+X_UNIT)/X_UNIT; | |
185 | y_cell = (sy+3+Y_UNIT)/Y_UNIT; | |
e3065973 | 186 | dc.SetMapMode(wxMM_TEXT); |
025e88c5 JS |
187 | bmp=NULL; |
188 | UpdateFieldSize(); | |
189 | } | |
190 | ||
191 | BombsCanvasClass::~BombsCanvasClass(void) | |
192 | { | |
193 | if (bmp) | |
194 | delete bmp; | |
195 | } | |
196 | ||
197 | // Called when canvas needs to be repainted. | |
babd36de | 198 | void BombsCanvasClass::OnPaint(wxPaintEvent& WXUNUSED(event)) |
025e88c5 JS |
199 | { |
200 | wxPaintDC dc(this); | |
201 | ||
202 | // Insert your drawing code here. | |
203 | if (!bmp) | |
204 | { bmp=new wxBitmap(field_width*x_cell*X_UNIT+1, | |
205 | field_height*y_cell*Y_UNIT+1); | |
206 | if (bmp) | |
207 | { wxMemoryDC memDC; | |
208 | memDC.SelectObject(* bmp); | |
209 | DrawField(&memDC, 0, 0, field_width-1, field_height-1); | |
210 | memDC.SelectObject(wxNullBitmap); | |
211 | } | |
212 | } | |
213 | if (bmp) | |
214 | { wxMemoryDC memDC; | |
215 | memDC.SelectObject(* bmp); | |
216 | dc.Blit(0, 0, field_width*x_cell*X_UNIT+1, | |
217 | field_height*y_cell*Y_UNIT+1, | |
218 | &memDC, 0, 0, wxCOPY); | |
219 | memDC.SelectObject(wxNullBitmap); | |
220 | } | |
221 | else | |
222 | DrawField(& dc, 0, 0, field_width-1, field_height-1); | |
223 | } | |
224 | ||
225 | // Updates the field size depending on wxGetApp().level and | |
226 | // redraws the canvas | |
227 | void BombsCanvasClass::UpdateFieldSize() | |
228 | { field_width=20; | |
229 | field_height=20; | |
230 | ||
231 | switch(wxGetApp().level) | |
232 | { case IDM_EASY: | |
233 | field_width=10; | |
234 | field_height=10; | |
235 | break; | |
236 | case IDM_MEDIUM: | |
237 | field_width=15; | |
238 | field_height=15; | |
239 | break; | |
240 | case IDM_DIFFICULT: | |
241 | field_width=25; | |
242 | field_height=20; | |
243 | break; | |
244 | } | |
245 | wxGetApp().Game.Init(field_width, field_height); | |
246 | ||
247 | if (bmp) | |
248 | delete bmp; | |
249 | bmp=NULL; | |
250 | ||
251 | wxWindow::Refresh(); | |
252 | } |