228 asc_scene_node_set_zindex(gamefield, -2); |
228 asc_scene_node_set_zindex(gamefield, -2); |
229 asc_scene_add_node(MAIN_SCENE, gamefield); |
229 asc_scene_add_node(MAIN_SCENE, gamefield); |
230 } |
230 } |
231 |
231 |
232 static asc_rect update_viewport_for_window_resize(asc_vec2u window_size) { |
232 static asc_rect update_viewport_for_window_resize(asc_vec2u window_size) { |
|
233 |
|
234 // TODO: special case: window is SO small that nothing would be rendered |
|
235 |
|
236 // remove margins |
|
237 const unsigned margin = 10; |
|
238 window_size.width -= 2*margin; |
|
239 window_size.height -= 2*margin; |
|
240 |
|
241 // remove space for score, power-ups, etc. |
|
242 const unsigned left_area = (unsigned) (asc_active_window->ui_scale*200); |
|
243 window_size.width -= left_area; |
|
244 |
233 // Compute scaling and offsets |
245 // Compute scaling and offsets |
234 unsigned viewport_size, offset_x = 0, offset_y = 0; |
246 unsigned viewport_size, offset_x = 0, offset_y = 0; |
235 if (window_size.width > window_size.height) { |
247 if (window_size.width > window_size.height) { |
236 // Wider window: letterbox (black bars on top/bottom) |
248 // Wider window: letterbox (black bars on top/bottom) |
237 offset_x = (window_size.width - window_size.height) / 2; |
249 offset_x = (window_size.width - window_size.height) / 2; |
239 } else { |
251 } else { |
240 // Taller window: pillarbox (black bars on sides) |
252 // Taller window: pillarbox (black bars on sides) |
241 offset_y = (window_size.height - window_size.width) / 2; |
253 offset_y = (window_size.height - window_size.width) / 2; |
242 viewport_size = window_size.width; |
254 viewport_size = window_size.width; |
243 } |
255 } |
|
256 offset_x += left_area + margin; |
|
257 offset_y += margin; |
244 |
258 |
245 // Set the viewport to the scaled and centered region |
259 // Set the viewport to the scaled and centered region |
246 return ASC_RECT(offset_x, offset_y, viewport_size, viewport_size); |
260 return ASC_RECT(offset_x, offset_y, viewport_size, viewport_size); |
247 } |
261 } |
248 |
262 |
259 |
273 |
260 // create window |
274 // create window |
261 AscWindowSettings settings; |
275 AscWindowSettings settings; |
262 asc_window_settings_init_defaults(&settings); |
276 asc_window_settings_init_defaults(&settings); |
263 settings.title = "Snake"; |
277 settings.title = "Snake"; |
264 settings.dimensions = ASC_VEC2U(800, 800); |
278 settings.dimensions = ASC_VEC2U(900, 600); |
|
279 // TODO: resize window depending on ui scale factor |
265 asc_window_initialize(0, &settings); |
280 asc_window_initialize(0, &settings); |
266 asc_ui_scale_auto(); |
281 asc_ui_scale_auto(); |
267 |
282 |
268 // load textures |
283 // load textures |
269 init_textures(); |
284 init_textures(); |