Tue, 28 Oct 2025 22:03:06 +0100
fix that dependencies for tools are always checked
| 0 | 1 | /* | 
| 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
| 3 | * Copyright 2023 Mike Becker. All rights reserved. | |
| 4 | * | |
| 5 | * Redistribution and use in source and binary forms, with or without | |
| 6 | * modification, are permitted provided that the following conditions are met: | |
| 7 | * | |
| 8 | * 1. Redistributions of source code must retain the above copyright | |
| 9 | * notice, this list of conditions and the following disclaimer. | |
| 10 | * | |
| 11 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 12 | * notice, this list of conditions and the following disclaimer in the | |
| 13 | * documentation and/or other materials provided with the distribution. | |
| 14 | * | |
| 15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| 19 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 20 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 21 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 22 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 23 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 24 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| 25 | * POSSIBILITY OF SUCH DAMAGE. | |
| 26 | */ | |
| 27 | ||
| 89 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 28 | #include <ascension/core.h> | 
| 48 | 29 | #include <ascension/ui.h> | 
| 143 
4db4f00493ad
prepare implementation of primitives
 Mike Becker <universe@uap-core.de> parents: 
141diff
changeset | 30 | #include <ascension/sprite.h> | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
149diff
changeset | 31 | #include <ascension/2d.h> | 
| 242 | 32 | #include <ascension/shader.h> | 
| 273 
966bfca56b9d
add random spawn positions
 Mike Becker <universe@uap-core.de> parents: 
272diff
changeset | 33 | #include <ascension/util.h> | 
| 48 | 34 | |
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 35 | #include <cx/printf.h> | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 36 | #include <cx/linked_list.h> | 
| 0 | 37 | |
| 242 | 38 | #define TEXTURE_2D_COUNT 3 | 
| 39 | static AscTexture tex2d[TEXTURE_2D_COUNT]; | |
| 40 | #define TEXTURE_PLAYER &tex2d[0] | |
| 41 | #define TEXTURE_PLAYER_COLOR_MAP &tex2d[1] | |
| 42 | #define TEXTURE_BACKDROP &tex2d[2] | |
| 43 | ||
| 44 | #define SHADER_ID_PLAYER 1 | |
| 89 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 45 | |
| 101 | 46 | #define BACKDROP_SCENE asc_window_scene(0) | 
| 47 | #define MAIN_SCENE asc_window_scene(1) | |
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 48 | #define HUD_WIDTH 400 | 
| 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 49 | |
| 206 | 50 | enum MoveDirection { | 
| 51 | MOVE_UP, | |
| 52 | MOVE_LEFT, | |
| 53 | MOVE_DOWN, | |
| 54 | MOVE_RIGHT | |
| 55 | }; | |
| 56 | ||
| 57 | static asc_transform rotations[4]; | |
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 58 | static asc_vec2i directions[4]; | 
| 206 | 59 | |
| 60 | typedef struct { | |
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 61 | asc_color color; | 
| 206 | 62 | enum MoveDirection direction; | 
| 216 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 63 | enum MoveDirection target_direction; | 
| 213 | 64 | /** | 
| 65 | * The speed in tiles per second. | |
| 66 | */ | |
| 67 | float speed; | |
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 68 | /** | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 69 | * A linked list of vec2u elements describing the current trace. | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 70 | */ | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 71 | CxList *trace; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 72 | /** | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 73 | * The new position of the player when @c reset_position is @c true. | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 74 | */ | 
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 75 | asc_vec2u new_position; | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 76 | unsigned health; | 
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 77 | bool alive; | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 78 | bool reset_position; | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 79 | uint8_t number; | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 80 | } Player; | 
| 206 | 81 | |
| 245 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 82 | #define GAME_FIELD_SIZE 32 | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 83 | #define GAME_FIELD_TILE_SIZE 32 | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 84 | |
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 85 | /** The bit in the tile data indicating if the tile exists. */ | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 86 | #define GAME_FIELD_TILE_EXISTS_FLAG 0x80 | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 87 | /** The bits in the tile data that identify the owner. */ | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 88 | #define GAME_FIELD_TILE_OWNER_MASK 0xF | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 89 | |
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 90 | typedef struct { | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 91 | AscSceneNode *nodes[GAME_FIELD_SIZE][GAME_FIELD_SIZE]; | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 92 | int8_t tile_data[GAME_FIELD_SIZE][GAME_FIELD_SIZE]; | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 93 | } GameField; | 
| 213 | 94 | |
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 95 | |
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 96 | #define GAME_STATE_MENU 0 | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 97 | #define GAME_STATE_PLAYING 1 | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 98 | #define GAME_STATE_GAME_OVER 2 | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 99 | |
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 100 | typedef struct { | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 101 | int state; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 102 | GameField *field; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 103 | Player *players[4]; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 104 | } GameState; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 105 | |
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 106 | GameState game = {0}; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 107 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 108 | static void globals_init(void) { | 
| 206 | 109 | asc_transform_identity(rotations[MOVE_UP]); | 
| 110 | asc_transform_roll(rotations[MOVE_LEFT], asc_rad(-90)); | |
| 111 | asc_transform_roll(rotations[MOVE_RIGHT], asc_rad(90)); | |
| 112 | asc_transform_roll(rotations[MOVE_DOWN], asc_rad(180)); | |
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 113 | directions[MOVE_UP] = ASC_VEC2I(0, -1); | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 114 | directions[MOVE_LEFT] = ASC_VEC2I(-1, 0); | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 115 | directions[MOVE_DOWN] = ASC_VEC2I(0, 1); | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 116 | directions[MOVE_RIGHT] = ASC_VEC2I(1, 0); | 
| 206 | 117 | } | 
| 118 | ||
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 119 | static void textures_destroy(void) { | 
| 242 | 120 | asc_texture_destroy(tex2d, TEXTURE_2D_COUNT); | 
| 93 
52611a99e574
add memory pool to gl context
 Mike Becker <universe@uap-core.de> parents: 
89diff
changeset | 121 | } | 
| 
52611a99e574
add memory pool to gl context
 Mike Becker <universe@uap-core.de> parents: 
89diff
changeset | 122 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 123 | static void textures_init(void) { | 
| 242 | 124 | asc_texture_init_2d(tex2d, TEXTURE_2D_COUNT); | 
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 125 | asc_texture_from_file(TEXTURE_PLAYER, "player.png"); | 
| 242 | 126 | asc_texture_from_file(TEXTURE_PLAYER_COLOR_MAP, "player-color-map.png"); | 
| 101 | 127 | asc_texture_from_file(TEXTURE_BACKDROP, "backdrop.png"); | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 128 | asc_gl_context_add_cleanup_func(asc_active_glctx, textures_destroy); | 
| 89 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 129 | } | 
| 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 130 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 131 | static void backdrop_scale(AscBehavior *behavior) { | 
| 213 | 132 | // scale the backdrop to the size of the window | 
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 133 | if (!asc_active_window->resized) return; | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 134 | asc_ptr_cast(AscSprite, sprite, behavior->node); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 135 | asc_vec2u window_size = asc_active_window->dimensions; | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 136 | asc_sprite_set_size(sprite, window_size); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 137 | } | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 138 | |
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 139 | static void main_scene_frame_scale(AscBehavior *behavior) { | 
| 262 
b47de42f4598
update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
 Mike Becker <universe@uap-core.de> parents: 
260diff
changeset | 140 | if (!asc_active_window->resized) return; | 
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 141 | asc_ptr_cast(AscRectangle, frame, behavior->node); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 142 | asc_rectangle_set_bounds(frame, MAIN_SCENE->camera.viewport); | 
| 213 | 143 | } | 
| 144 | ||
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 145 | static void backdrop_create(void) { | 
| 263 
cc5cd4c98e46
fix that backdrop texture scale was not inverting the ui scale
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 146 | const float scale = 1.f / asc_active_window->ui_scale; | 
| 213 | 147 | AscSceneNode *node = asc_sprite( | 
| 148 | .texture = TEXTURE_BACKDROP, | |
| 230 
02090b2d147e
replace ugly backdrop texture
 Mike Becker <universe@uap-core.de> parents: 
229diff
changeset | 149 | .texture_scale_mode = ASC_TEXTURE_SCALE_REPEAT, | 
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 150 | .texture_scale_x = scale, .texture_scale_y = scale, | 
| 213 | 151 | ); | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 152 | asc_behavior_add(node, .func = backdrop_scale); | 
| 213 | 153 | asc_scene_add_node(BACKDROP_SCENE, node); | 
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 154 | |
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 155 | // also add a frame for the main scene | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 156 | // add this to the UI layer so that the border size does not scale | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 157 | AscSceneNode *frame = asc_rectangle(.thickness = 2, .color = ASC_RGBi(66, 142, 161)); | 
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 158 | asc_behavior_add(frame, .func = main_scene_frame_scale); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
242diff
changeset | 159 | asc_ui_add_node(frame); | 
| 213 | 160 | } | 
| 161 | ||
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 162 | static void fps_counter_update(AscBehavior *behavior) { | 
| 193 
ddf690c0b36b
improves signature of asc_text_printf() and adds documentation
 Mike Becker <universe@uap-core.de> parents: 
189diff
changeset | 163 | asc_ptr_cast(AscText, node, behavior->node); | 
| 165 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
160diff
changeset | 164 | static float last_fps = 0.f; | 
| 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
160diff
changeset | 165 | if (fabsf(asc_context.frame_rate - last_fps) > 1) { | 
| 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
160diff
changeset | 166 | last_fps = asc_context.frame_rate; | 
| 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
160diff
changeset | 167 | asc_text_printf(node, "%.2f FPS", asc_context.frame_rate); | 
| 0 | 168 | } | 
| 148 
9f030f402699
implement interval for behaviors - fixes #383
 Mike Becker <universe@uap-core.de> parents: 
144diff
changeset | 169 | } | 
| 
9f030f402699
implement interval for behaviors - fixes #383
 Mike Becker <universe@uap-core.de> parents: 
144diff
changeset | 170 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 171 | static void fps_counter_tie_to_corner(AscBehavior *behavior) { | 
| 148 
9f030f402699
implement interval for behaviors - fixes #383
 Mike Becker <universe@uap-core.de> parents: 
144diff
changeset | 172 | // TODO: this should be replaced with some sort of UI layout manager | 
| 
9f030f402699
implement interval for behaviors - fixes #383
 Mike Becker <universe@uap-core.de> parents: 
144diff
changeset | 173 | AscSceneNode *node = behavior->node; | 
| 
9f030f402699
implement interval for behaviors - fixes #383
 Mike Becker <universe@uap-core.de> parents: 
144diff
changeset | 174 | if (asc_test_flag(node->flags, ASC_SCENE_NODE_GRAPHICS_UPDATED) || asc_active_window->resized) { | 
| 240 
5ed38debd4a7
redesign game field and make it larger (and the player faster)
 Mike Becker <universe@uap-core.de> parents: 
238diff
changeset | 175 | asc_scene_node_set_position2f(node, ASC_VEC2F(10, | 
| 
5ed38debd4a7
redesign game field and make it larger (and the player faster)
 Mike Becker <universe@uap-core.de> parents: 
238diff
changeset | 176 | asc_active_window->dimensions.y - ((AscText*)node)->dimension.height - 10 | 
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
186diff
changeset | 177 | )); | 
| 37 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
36diff
changeset | 178 | } | 
| 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
36diff
changeset | 179 | } | 
| 
8a8cc6725b48
add camera and render groups
 Mike Becker <universe@uap-core.de> parents: 
36diff
changeset | 180 | |
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 181 | static AscSceneNode *fps_counter_create(void) { | 
| 214 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
213diff
changeset | 182 | AscSceneNode *node = asc_text( | 
| 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
213diff
changeset | 183 | .name = "FPS Counter", | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 184 | .color = ASC_RGB(1, 1, 1), | 
| 214 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
213diff
changeset | 185 | .font = asc_font(ASC_FONT_REGULAR, 12), | 
| 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
213diff
changeset | 186 | ); | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 187 | asc_behavior_add(node, .func = fps_counter_update, .interval = asc_seconds(1)); | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 188 | asc_behavior_add(node, fps_counter_tie_to_corner); | 
| 279 
97a1a7fb4f1a
do not use different vocabulary (enable/disable vs. pause/unpause) for the behavior's enabled-state
 Mike Becker <universe@uap-core.de> parents: 
278diff
changeset | 189 | asc_behavior_disable_all_while_hidden(node); | 
| 155 
b598b4eb4b44
add new ui.c where several UI functions are now moved to
 Mike Becker <universe@uap-core.de> parents: 
154diff
changeset | 190 | asc_ui_add_node(node); | 
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 191 | return node; | 
| 70 | 192 | } | 
| 193 | ||
| 275 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 194 | static void game_over_text_keep_centered(AscBehavior *behavior) { | 
| 279 
97a1a7fb4f1a
do not use different vocabulary (enable/disable vs. pause/unpause) for the behavior's enabled-state
 Mike Becker <universe@uap-core.de> parents: 
278diff
changeset | 195 | if (!behavior->reactivated && !asc_active_window->resized) return; | 
| 275 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 196 | |
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 197 | AscSceneNode *node = behavior->node; | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 198 | // center the "game over" text in the game field viewport | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 199 | const asc_rect main_scene_viewport = MAIN_SCENE->camera.viewport; | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 200 | asc_scene_node_set_position2f(node, ASC_VEC2F( | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 201 | main_scene_viewport.pos.x + main_scene_viewport.size.x / 2.f, | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 202 | main_scene_viewport.pos.y + main_scene_viewport.size.y / 2.f - 36 | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 203 | )); | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 204 | } | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 205 | |
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 206 | static AscSceneNode *game_over_create_text(void) { | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 207 | AscSceneNode *node = asc_text( | 
| 278 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 208 | .name = "game_over_text", | 
| 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 209 | .text = "Game Over\nPress R to Restart", | 
| 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 210 | .color = ASC_RGB(1, 1, 1), | 
| 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 211 | .font = asc_font(ASC_FONT_REGULAR, 36), | 
| 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 212 | .alignment = ASC_TEXT_ALIGN_CENTER, | 
| 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 213 | .centered = true, | 
| 
634fa2996d4e
make behaviors aware of being unpaused
 Mike Becker <universe@uap-core.de> parents: 
275diff
changeset | 214 | ); | 
| 275 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 215 | |
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 216 | asc_scene_node_hide(node); | 
| 279 
97a1a7fb4f1a
do not use different vocabulary (enable/disable vs. pause/unpause) for the behavior's enabled-state
 Mike Becker <universe@uap-core.de> parents: 
278diff
changeset | 217 | asc_behavior_add(node, game_over_text_keep_centered, .disable_while_hidden = true); | 
| 275 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 218 | asc_ui_add_node(node); | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 219 | |
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 220 | return node; | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 221 | } | 
| 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 222 | |
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 223 | static bool game_field_tile_chown(asc_vec2u coords, Player *player) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 224 | unsigned x = coords.x, y = coords.y; | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 225 | asc_ptr_cast(AscRectangle, tile, game.field->nodes[x][y]); | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 226 | int old_owner = game.field->tile_data[x][y] & GAME_FIELD_TILE_OWNER_MASK; | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 227 | if (player == NULL) { | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 228 | asc_clear_flag(game.field->tile_data[x][y], GAME_FIELD_TILE_OWNER_MASK); | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 229 | tile->color = ASC_RGBi(16, 50, 160); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 230 | } else { | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 231 | asc_set_flag_masked(game.field->tile_data[x][y], GAME_FIELD_TILE_OWNER_MASK, player->number); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 232 | tile->color = player->color; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 233 | } | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 234 | int new_owner = game.field->tile_data[x][y] & GAME_FIELD_TILE_OWNER_MASK; | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 235 | return old_owner != new_owner; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 236 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 237 | |
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 238 | static void game_field_create() { | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 239 | // TODO: create a more interesting map than just a basic grid | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 240 | AscSceneNode *node = asc_scene_node_empty(); | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 241 | game.field = asc_scene_node_allocate_data(node, sizeof(GameField)); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 242 | for (unsigned x = 0; x < GAME_FIELD_SIZE; x++) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 243 | for (unsigned y = 0; y < GAME_FIELD_SIZE; y++) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 244 | AscSceneNode *tile = asc_rectangle( | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 245 | .x = x*GAME_FIELD_TILE_SIZE, .y = y*GAME_FIELD_TILE_SIZE, .filled = true, .thickness = 2, | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 246 | .width = GAME_FIELD_TILE_SIZE, .height = GAME_FIELD_TILE_SIZE, | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 247 | .color = ASC_RGBi(16, 50, 160), | 
| 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 248 | .border_color = ASC_RGBi(20, 84, 128), | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 249 | ); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 250 | |
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 251 | game.field->tile_data[x][y] = GAME_FIELD_TILE_EXISTS_FLAG; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 252 | game.field->nodes[x][y] = tile; | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 253 | |
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 254 | asc_scene_node_link(node, tile); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 255 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 256 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 257 | asc_scene_node_set_zindex(node, -2); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 258 | asc_scene_add_node(MAIN_SCENE, node); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 259 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 260 | |
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 261 | static asc_vec2u game_field_tile_at_position(asc_vec3f position) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 262 | return ASC_VEC2U((int)position.x / GAME_FIELD_TILE_SIZE, (int)position.y / GAME_FIELD_TILE_SIZE); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 263 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 264 | |
| 242 | 265 | typedef struct { | 
| 266 | AscShaderProgram program; | |
| 267 | asc_uniform_loc map_albedo; | |
| 268 | asc_uniform_loc map_color; | |
| 269 | asc_uniform_loc color; | |
| 270 | } PlayerShader; | |
| 271 | ||
| 272 | static void player_shader_init(AscShaderProgram *p, cx_attr_unused int flags) { | |
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 273 | asc_shader_set_uniform_loc_by_name(p, PlayerShader, map_albedo); | 
| 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 274 | asc_shader_set_uniform_loc_by_name(p, PlayerShader, map_color); | 
| 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 275 | asc_shader_set_uniform_loc_by_name(p, PlayerShader, color); | 
| 242 | 276 | } | 
| 277 | ||
| 278 | static AscShaderProgram *player_shader_create(cx_attr_unused int unused) { | |
| 279 | return asc_shader_create((AscShaderCodes) { | |
| 280 | .vtx = {.source_file = "sprite_vtx.glsl"}, | |
| 281 | .frag = {.source_file = "player.glsl",}, | |
| 282 | }, sizeof(PlayerShader), player_shader_init, 0); | |
| 283 | } | |
| 284 | ||
| 285 | static void player_draw(const AscCamera *camera, const AscSceneNode *node) { | |
| 286 | asc_cptr_cast(AscSprite, sprite, node); | |
| 287 | const Player *player = node->user_data; | |
| 288 | ||
| 289 | // TODO: we shall finally add the shader information to the node | |
| 290 | const AscShaderProgram *s = asc_shader_lookup( | |
| 291 | SHADER_ID_PLAYER, player_shader_create, 0 | |
| 292 | ); | |
| 293 | if (asc_shader_use(s, camera)) return; | |
| 294 | asc_cptr_cast(PlayerShader, shader, s); | |
| 295 | ||
| 296 | asc_shader_upload_model_matrix(s, node); | |
| 297 | ||
| 298 | // Bind texture | |
| 299 | asc_texture_bind(TEXTURE_PLAYER, shader->map_albedo, 0); | |
| 300 | asc_texture_bind(TEXTURE_PLAYER_COLOR_MAP, shader->map_color, 1); | |
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 301 | asc_shader_upload_color(shader->color, player->color); | 
| 242 | 302 | asc_mesh_draw_triangle_strip(&sprite->mesh); | 
| 303 | } | |
| 304 | ||
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 305 | static void player_position(Player *pl, unsigned x, unsigned y) { | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 306 | pl->new_position.x = x; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 307 | pl->new_position.y = y; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 308 | pl->reset_position = true; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 309 | } | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 310 | |
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 311 | static void player_position_random(Player *pl) { | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 312 | // TODO: check if the spawn location is viable when there is more action on the board | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 313 | player_position( | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 314 | pl, | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 315 | 4u + asc_util_rand(GAME_FIELD_SIZE - 8u), | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 316 | 4u + asc_util_rand(GAME_FIELD_SIZE - 8u) | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 317 | ); | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 318 | } | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 319 | |
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 320 | static void player_main_behavior(AscBehavior *behavior) { | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 321 | AscSceneNode *node = behavior->node; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 322 | Player *player = node->user_data; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 323 | |
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 324 | if (player->alive && player->health == 0) { | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 325 | player->alive = false; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 326 | asc_scene_node_hide(node); | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 327 | // TODO: probably we don't want the entire trace to disappear instantly | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 328 | cxListClear(player->trace); | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 329 | // TODO: this should be controlled by another behavior that watches all players | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 330 | game.state = GAME_STATE_GAME_OVER; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 331 | } | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 332 | |
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 333 | // TODO: replace with respawn event | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 334 | if (!player->alive && player->health > 0) { | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 335 | player_position_random(player); | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 336 | player->alive = true; | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 337 | asc_scene_node_show(node); | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 338 | } | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 339 | } | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 340 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 341 | static void player_move(AscBehavior *behavior) { | 
| 206 | 342 | AscSceneNode *node = behavior->node; | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 343 | Player *player = node->user_data; | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 344 | |
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 345 | const float ts = (float) GAME_FIELD_TILE_SIZE; | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 346 | |
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 347 | // check if the position is set programmatically | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 348 | if (player->reset_position) { | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 349 | asc_scene_node_set_position2f(node, | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 350 | ASC_VEC2F( | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 351 | ts * (player->new_position.x + .5f), | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 352 | ts * (player->new_position.y + .5f) | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 353 | )); | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 354 | player->reset_position = false; | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 355 | return; | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 356 | } | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 357 | |
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 358 | // normal movement | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 359 | const float speed = ts * player->speed * asc_context.frame_factor; | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 360 | const asc_vec2i dir = directions[player->direction]; | 
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 361 | const asc_vec2f movement = asc_vec2f_scale(asc_vec2_itof(dir), speed); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 362 | |
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 363 | // check if we are supposed to change the direction | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 364 | if (player->direction == player->target_direction) { | 
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 365 | // move without changing the direction | 
| 216 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 366 | asc_scene_node_move2f(node, movement); | 
| 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 367 | } else { | 
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 368 | // determine axis | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 369 | // and check if we are about to cross the center | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 370 | // this relies on positive positions! | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 371 | bool rotate = false; | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 372 | if (movement.x == 0) { | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 373 | // vertical movement | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 374 | const float y_0 = floorf(node->position.y / ts); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 375 | const float y_curr = node->position.y / ts - y_0; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 376 | const float y_next = (node->position.y+movement.y) / ts - y_0; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 377 | const bool side_curr = y_curr > 0.5f; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 378 | const bool side_next = y_next > 0.5f; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 379 | rotate = side_curr ^ side_next; | 
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 380 | } else { | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 381 | // horizontal movement | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 382 | const float x0 = floorf(node->position.x / ts); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 383 | const float x_curr = node->position.x / ts - x0; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 384 | const float x_next = (node->position.x+movement.x) / ts - x0; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 385 | const bool side_curr = x_curr > 0.5f; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 386 | const bool side_next = x_next > 0.5f; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 387 | rotate = side_curr ^ side_next; | 
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 388 | } | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 389 | if (rotate) { | 
| 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 390 | // snap position to the center of the tile | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 391 | asc_scene_node_set_position2f(node, | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 392 | ASC_VEC2F( | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 393 | (.5f+floorf(node->position.x / ts)) * ts, | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 394 | (.5f+floorf(node->position.y / ts)) * ts | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 395 | )); | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 396 | player->direction = player->target_direction; | 
| 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 397 | asc_scene_node_set_rotation(node, rotations[player->direction]); | 
| 216 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 398 | } else { | 
| 217 
4b3c974eab44
improve snap-to-grid-movement
 Mike Becker <universe@uap-core.de> parents: 
216diff
changeset | 399 | // changing the direction not permitted, yet, continue movement | 
| 216 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 400 | asc_scene_node_move2f(node, movement); | 
| 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 401 | } | 
| 
943980fa37b5
snap the movement to the grid
 Mike Becker <universe@uap-core.de> parents: 
215diff
changeset | 402 | } | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 403 | |
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 404 | // die when leaving the game field | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 405 | if (node->position.x < 0 || node->position.y < 0 || | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 406 | node->position.x > GAME_FIELD_SIZE*GAME_FIELD_TILE_SIZE || | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 407 | node->position.y > GAME_FIELD_SIZE*GAME_FIELD_TILE_SIZE) { | 
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 408 | // TODO: replace setting health to zero with a "kill" event | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 409 | player->health = 0; | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 410 | return; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 411 | } | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 412 | |
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 413 | // TODO: collision detection | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 414 | |
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 415 | // update the trace, if necessary. | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 416 | // remark: some calculations are repeated here, but they are cheap enough | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 417 | { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 418 | const asc_vec2u tile_coords = game_field_tile_at_position(node->position); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 419 | if (tile_coords.x > GAME_FIELD_SIZE || tile_coords.y > GAME_FIELD_SIZE) return; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 420 | if (game_field_tile_chown(tile_coords, player)) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 421 | // new owner of the tile! | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 422 | asc_vec2u p = tile_coords; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 423 | cxListAdd(player->trace, &p); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 424 | if (cxListSize(player->trace) > 7) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 425 | // TODO: implement power-up which makes the trace longer | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 426 | cxListRemove(player->trace, 0); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 427 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 428 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 429 | } | 
| 205 
d1e44c861426
hack a quick example for both rotation directions
 Mike Becker <universe@uap-core.de> parents: 
204diff
changeset | 430 | } | 
| 
d1e44c861426
hack a quick example for both rotation directions
 Mike Becker <universe@uap-core.de> parents: 
204diff
changeset | 431 | |
| 272 
6ed9fb9662c0
move player controls into a behavior
 Mike Becker <universe@uap-core.de> parents: 
271diff
changeset | 432 | static void player_controls(AscBehavior *behavior) { | 
| 
6ed9fb9662c0
move player controls into a behavior
 Mike Becker <universe@uap-core.de> parents: 
271diff
changeset | 433 | Player *player = behavior->node->user_data; | 
| 
6ed9fb9662c0
move player controls into a behavior
 Mike Becker <universe@uap-core.de> parents: 
271diff
changeset | 434 | // TODO: different key bindings for different player number in hot seat mode | 
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 435 | if (asc_key_pressed(ASC_KEY(LEFT))) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 436 | if (player->direction != MOVE_RIGHT) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 437 | player->target_direction = MOVE_LEFT; | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 438 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 439 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 440 | if (asc_key_pressed(ASC_KEY(RIGHT))) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 441 | if (player->direction != MOVE_LEFT) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 442 | player->target_direction = MOVE_RIGHT; | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 443 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 444 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 445 | if (asc_key_pressed(ASC_KEY(UP))) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 446 | if (player->direction != MOVE_DOWN) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 447 | player->target_direction = MOVE_UP; | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 448 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 449 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 450 | if (asc_key_pressed(ASC_KEY(DOWN))) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 451 | if (player->direction != MOVE_UP) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 452 | player->target_direction = MOVE_DOWN; | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 453 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 454 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 455 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 456 | |
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 457 | static void player_destroy(CxAllocator *allocator, Player *player) { | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 458 | cxListFree(player->trace); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 459 | cxFree(allocator, player); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 460 | } | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 461 | |
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 462 | static void player_trace_release_tile(asc_vec2u *coords) { | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 463 | game_field_tile_chown(*coords, NULL); | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 464 | } | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 465 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 466 | static Player *player_create(void) { | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 467 | AscSceneNode *node = asc_sprite( | 
| 114 | 468 | .name = "Player", | 
| 245 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 469 | .width = GAME_FIELD_TILE_SIZE, | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 470 | .height = GAME_FIELD_TILE_SIZE, | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 471 | .origin_x = GAME_FIELD_TILE_SIZE / 2, | 
| 
0cc396ade3b0
add a simple struct for the game field that may be extended later
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 472 | .origin_y = GAME_FIELD_TILE_SIZE / 2, | 
| 88 
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
 Mike Becker <universe@uap-core.de> parents: 
86diff
changeset | 473 | ); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 474 | asc_scene_add_node(MAIN_SCENE, node); | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 475 | Player *player = asc_scene_node_allocate_data(node, sizeof(Player)); | 
| 240 
5ed38debd4a7
redesign game field and make it larger (and the player faster)
 Mike Becker <universe@uap-core.de> parents: 
238diff
changeset | 476 | player->speed = 3.f; // start with 3 tiles/sec | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 477 | player->number = 1; | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 478 | player->health = 100; | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 479 | player->color = ASC_RGB(1, 0, 0); | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 480 | player->trace = cxLinkedListCreateSimple(sizeof(asc_vec2u)); | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 481 | cxDefineDestructor(player->trace, player_trace_release_tile); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 482 | node->draw_func = player_draw; | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 483 | node->user_data_free_func = (cx_destructor_func2)player_destroy; | 
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 484 | |
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 485 | // add behaviors | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 486 | asc_behavior_add(node, player_main_behavior, .always_enabled = true); | 
| 272 
6ed9fb9662c0
move player controls into a behavior
 Mike Becker <universe@uap-core.de> parents: 
271diff
changeset | 487 | asc_behavior_add(node, player_controls); | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 488 | asc_behavior_add(node, player_move); | 
| 279 
97a1a7fb4f1a
do not use different vocabulary (enable/disable vs. pause/unpause) for the behavior's enabled-state
 Mike Becker <universe@uap-core.de> parents: 
278diff
changeset | 489 | asc_behavior_disable_all_while_hidden(node); | 
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 490 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 491 | return player; | 
| 88 
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
 Mike Becker <universe@uap-core.de> parents: 
86diff
changeset | 492 | } | 
| 
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
 Mike Becker <universe@uap-core.de> parents: 
86diff
changeset | 493 | |
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 494 | static asc_rect main_scene_viewport_update(asc_vec2u window_size) { | 
| 229 
5c05b5164a16
first idea of what the main scene could look like
 Mike Becker <universe@uap-core.de> parents: 
227diff
changeset | 495 | |
| 233 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 496 | // margins | 
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 497 | const unsigned margin = 16; | 
| 233 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 498 | |
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 499 | // space for score, power-ups, etc. | 
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 500 | const unsigned left_area = (unsigned) (asc_active_window->ui_scale*HUD_WIDTH); | 
| 229 
5c05b5164a16
first idea of what the main scene could look like
 Mike Becker <universe@uap-core.de> parents: 
227diff
changeset | 501 | |
| 233 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 502 | // calculate how many pixels need to be removed from width and height | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 503 | const unsigned rw = 2*margin + left_area; | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 504 | const unsigned rh = 2*margin; | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 505 | |
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 506 | // check if there is still a viewport left and chicken out when not | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 507 | if (window_size.width < rw || window_size.height < rh) { | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 508 | return ASC_RECT(0, 0, 0, 0); | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 509 | } | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 510 | window_size.width -= rw; | 
| 
bda74199223f
handle the edge-case when a viewport vanishes
 Mike Becker <universe@uap-core.de> parents: 
231diff
changeset | 511 | window_size.height -= rh; | 
| 229 
5c05b5164a16
first idea of what the main scene could look like
 Mike Becker <universe@uap-core.de> parents: 
227diff
changeset | 512 | |
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 513 | // Compute scaling and offsets | 
| 105 | 514 | unsigned viewport_size, offset_x = 0, offset_y = 0; | 
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 515 | if (window_size.width > window_size.height) { | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 516 | // Wider window: letterbox (black bars on top/bottom) | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 517 | offset_x = (window_size.width - window_size.height) / 2; | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 518 | viewport_size = window_size.height; | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 519 | } else { | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 520 | // Taller window: pillarbox (black bars on sides) | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 521 | offset_y = (window_size.height - window_size.width) / 2; | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 522 | viewport_size = window_size.width; | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 523 | } | 
| 229 
5c05b5164a16
first idea of what the main scene could look like
 Mike Becker <universe@uap-core.de> parents: 
227diff
changeset | 524 | offset_x += left_area + margin; | 
| 
5c05b5164a16
first idea of what the main scene could look like
 Mike Becker <universe@uap-core.de> parents: 
227diff
changeset | 525 | offset_y += margin; | 
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 526 | |
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 527 | // Set the viewport to the scaled and centered region | 
| 186 
e9bb4d4f88a8
rename asc_recti to just asc_rect (there won't be an asc_rectu)
 Mike Becker <universe@uap-core.de> parents: 
183diff
changeset | 528 | return ASC_RECT(offset_x, offset_y, viewport_size, viewport_size); | 
| 99 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 529 | } | 
| 
ac143db979dc
add aspect-ration independent rendering
 Mike Becker <universe@uap-core.de> parents: 
98diff
changeset | 530 | |
| 105 | 531 | int main(void) { | 
| 0 | 532 | asc_context_initialize(); | 
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 533 | if (asc_has_error()) { | 
| 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 534 | SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, | 
| 89 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 535 | "Fatal Error",asc_get_error(), NULL); | 
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 536 | return 1; | 
| 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 537 | } | 
| 0 | 538 | |
| 206 | 539 | // initialize globals | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 540 | globals_init(); | 
| 206 | 541 | |
| 231 
0da563c4e39c
make initial window size depend on UI scaling factor
 Mike Becker <universe@uap-core.de> parents: 
230diff
changeset | 542 | // create the window | 
| 257 
67d7b79997df
remove AscWindowSettings struct
 Mike Becker <universe@uap-core.de> parents: 
256diff
changeset | 543 | asc_window_initialize(0, asc_gl_context_settings_default(4, 0)); | 
| 231 
0da563c4e39c
make initial window size depend on UI scaling factor
 Mike Becker <universe@uap-core.de> parents: 
230diff
changeset | 544 | asc_window_set_title(0, "Snake"); | 
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 545 | asc_window_set_size(0, asc_vec2_ftou( | 
| 264 
653869cd653f
fix that the window would take a little more than the full height not giving space for potential docks on the desktop
 Mike Becker <universe@uap-core.de> parents: 
263diff
changeset | 546 | asc_vec2f_scale(ASC_VEC2F(1000+HUD_WIDTH, 1000), asc_ui_scale_auto()))); | 
| 238 
e22abcd22e47
make the default window scaling and positioning screen resolution dependent
 Mike Becker <universe@uap-core.de> parents: 
234diff
changeset | 547 | asc_window_center(0); | 
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 548 | |
| 101 | 549 | // load textures | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 550 | textures_init(); | 
| 101 | 551 | |
| 263 
cc5cd4c98e46
fix that backdrop texture scale was not inverting the ui scale
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 552 | // initialize backdrop scene | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
217diff
changeset | 553 | asc_scene_init(BACKDROP_SCENE, "backdrop", | 
| 101 | 554 | .type = ASC_CAMERA_ORTHO, | 
| 555 | .projection_update_func = asc_camera_ortho_update_size | |
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
118diff
changeset | 556 | ); | 
| 263 
cc5cd4c98e46
fix that backdrop texture scale was not inverting the ui scale
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 557 | backdrop_create(); | 
| 
cc5cd4c98e46
fix that backdrop texture scale was not inverting the ui scale
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 558 | |
| 
cc5cd4c98e46
fix that backdrop texture scale was not inverting the ui scale
 Mike Becker <universe@uap-core.de> parents: 
262diff
changeset | 559 | // Initialize main scene | 
| 220 
6b266e907f89
resolve several minor TODOs
 Mike Becker <universe@uap-core.de> parents: 
217diff
changeset | 560 | asc_scene_init(MAIN_SCENE, "main", | 
| 100 
5231da78831e
change asc_scene_init() to also request parameters for camera initialization
 Mike Becker <universe@uap-core.de> parents: 
99diff
changeset | 561 | .type = ASC_CAMERA_ORTHO, | 
| 247 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 562 | .ortho.rect = ASC_RECT( | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 563 | -GAME_FIELD_TILE_SIZE, | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 564 | -GAME_FIELD_TILE_SIZE, | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 565 | (GAME_FIELD_SIZE+2)*GAME_FIELD_TILE_SIZE, | 
| 
3547254742a7
add player's trace and removes the origin offsets from the game field's tiles
 Mike Becker <universe@uap-core.de> parents: 
245diff
changeset | 566 | (GAME_FIELD_SIZE+2)*GAME_FIELD_TILE_SIZE | 
| 213 | 567 | ), | 
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
118diff
changeset | 568 | .viewport_clear = true, | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
249diff
changeset | 569 | .clear_color = ASC_RGBi(0, 32, 16), | 
| 234 
a1d70b8018c1
improve structure of the game code and add a function to set the player position
 Mike Becker <universe@uap-core.de> parents: 
233diff
changeset | 570 | .viewport_update_func = main_scene_viewport_update | 
| 121 
ede9a9e92ff9
add viewport_clear flag to camera settings
 Mike Becker <universe@uap-core.de> parents: 
118diff
changeset | 571 | ); | 
| 89 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 572 | |
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 573 | // create the fps counter | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 574 | AscSceneNode *fps_counter = fps_counter_create(); | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 575 | asc_scene_node_hide(fps_counter); | 
| 213 | 576 | |
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 577 | // create game over text | 
| 275 
2256af1440db
move game over text to the UI scene
 Mike Becker <universe@uap-core.de> parents: 
274diff
changeset | 578 | AscSceneNode *text_game_over = game_over_create_text(); | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 579 | |
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 580 | // initialize the game state | 
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 581 | // TODO: add a main menu and start with the menu | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 582 | game.state = GAME_STATE_PLAYING; | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 583 | game.players[0] = player_create(); | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 584 | game_field_create(); | 
| 88 
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
 Mike Becker <universe@uap-core.de> parents: 
86diff
changeset | 585 | |
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 586 | // Main Loop | 
| 29 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
25diff
changeset | 587 | do { | 
| 0 | 588 | // quit application on any error | 
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 589 | if (asc_has_error()) { | 
| 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 590 | SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, | 
| 65 
9c44c55d327a
consistently refer to windows by ID - fixes #381
 Mike Becker <universe@uap-core.de> parents: 
63diff
changeset | 591 | "Fatal Error", asc_get_error(), | 
| 
9c44c55d327a
consistently refer to windows by ID - fixes #381
 Mike Becker <universe@uap-core.de> parents: 
63diff
changeset | 592 | asc_active_window->window); | 
| 33 
e7ddb52facd3
add behavior nodes + restructure test program
 Mike Becker <universe@uap-core.de> parents: 
32diff
changeset | 593 | asc_clear_error(); | 
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
62diff
changeset | 594 | asc_context_quit(); | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
62diff
changeset | 595 | } | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
62diff
changeset | 596 | |
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 597 | // game states | 
| 272 
6ed9fb9662c0
move player controls into a behavior
 Mike Becker <universe@uap-core.de> parents: 
271diff
changeset | 598 | // TODO: move this into a behavior - probably add a state machine that enables/disables behaviors | 
| 
6ed9fb9662c0
move player controls into a behavior
 Mike Becker <universe@uap-core.de> parents: 
271diff
changeset | 599 | if (game.state == GAME_STATE_GAME_OVER) { | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 600 | asc_scene_node_show(text_game_over); | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 601 | if (asc_key_pressed(ASC_KEY(R))) { | 
| 274 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 602 | // TODO: instead of setting the health, send a "respawn" event to the behavior | 
| 
ba7f043f9fdf
move the player's life "controller" to a behavior
 Mike Becker <universe@uap-core.de> parents: 
273diff
changeset | 603 | game.players[0]->health = 100; | 
| 265 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 604 | // TODO: re-load the "level" | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 605 | game.state = GAME_STATE_PLAYING; | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 606 | asc_scene_node_hide(text_game_over); | 
| 
5c915d01bdc0
add simple game over screen
 Mike Becker <universe@uap-core.de> parents: 
264diff
changeset | 607 | } | 
| 200 
cf0579d3bbc4
add rotation functions, but rotation with special point of origin is still broken
 Mike Becker <universe@uap-core.de> parents: 
195diff
changeset | 608 | } | 
| 
cf0579d3bbc4
add rotation functions, but rotation with special point of origin is still broken
 Mike Becker <universe@uap-core.de> parents: 
195diff
changeset | 609 | |
| 140 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
123diff
changeset | 610 | // debug-key for clearing the shader registry | 
| 141 
cd82643bb6d9
implement edge-triggered key press/release
 Mike Becker <universe@uap-core.de> parents: 
140diff
changeset | 611 | if (asc_key_pressed(ASC_KEY(S))) { | 
| 140 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
123diff
changeset | 612 | asc_shader_clear_registry(); | 
| 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
123diff
changeset | 613 | } | 
| 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
123diff
changeset | 614 | |
| 260 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 615 | // show/hide the FPS counter | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 616 | if (asc_key_pressed(ASC_KEY(F2))) { | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 617 | asc_scene_node_toggle_visibility(fps_counter); | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 618 | } | 
| 
2649d04f0287
start giving the game code more structure
 Mike Becker <universe@uap-core.de> parents: 
257diff
changeset | 619 | |
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
62diff
changeset | 620 | // quit application on ESC key press | 
| 141 
cd82643bb6d9
implement edge-triggered key press/release
 Mike Becker <universe@uap-core.de> parents: 
140diff
changeset | 621 | if (asc_key_pressed(ASC_KEY(ESCAPE))) { | 
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
62diff
changeset | 622 | asc_context_quit(); | 
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 623 | } | 
| 29 
1d001eb694dc
bring first scene graph to live
 Mike Becker <universe@uap-core.de> parents: 
25diff
changeset | 624 | } while (asc_loop_next()); | 
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 625 | |
| 89 
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
 Mike Becker <universe@uap-core.de> parents: 
88diff
changeset | 626 | // cleanup | 
| 0 | 627 | asc_context_destroy(); | 
| 628 | return 0; | |
| 629 | } | |
| 630 |