demo/snake/snake.c

Sun, 01 Feb 2026 13:58:07 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 01 Feb 2026 13:58:07 +0100
changeset 299
c0d3a1acc6ae
parent 298
fa91e2e06eee
child 300
22b232e3202a
permissions
-rw-r--r--

add TODO for improving alignment of text nodes

0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
28 #include <ascension/core.h>
48
6e5b5ba2752c create new UI subdir
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
29 #include <ascension/ui.h>
143
4db4f00493ad prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents: 141
diff changeset
30 #include <ascension/sprite.h>
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
31 #include <ascension/2d.h>
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
32 #include <ascension/shader.h>
273
966bfca56b9d add random spawn positions
Mike Becker <universe@uap-core.de>
parents: 272
diff changeset
33 #include <ascension/util.h>
48
6e5b5ba2752c create new UI subdir
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
34
16
c5dde81b6fb2 add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents: 15
diff 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: 245
diff changeset
36 #include <cx/linked_list.h>
0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
38 #define TEXTURE_2D_COUNT 3
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
39 static AscTexture tex2d[TEXTURE_2D_COUNT];
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
40 #define TEXTURE_PLAYER &tex2d[0]
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
41 #define TEXTURE_PLAYER_COLOR_MAP &tex2d[1]
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
42 #define TEXTURE_BACKDROP &tex2d[2]
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
43
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
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: 88
diff changeset
45
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
46 #define BACKDROP_SCENE asc_window_scene(0)
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
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: 234
diff changeset
48 #define HUD_WIDTH 400
e22abcd22e47 make the default window scaling and positioning screen resolution dependent
Mike Becker <universe@uap-core.de>
parents: 234
diff changeset
49
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
50 enum MoveDirection {
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
51 MOVE_UP,
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
52 MOVE_LEFT,
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
53 MOVE_DOWN,
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
54 MOVE_RIGHT
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
55 };
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
56
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
57 static asc_transform rotations[4];
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
58 static asc_vec2i directions[4];
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
59
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
60 typedef struct {
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
61 AscSceneNode *node;
256
60014484121c remove the asc_col4i datatype in favor of a unified asc_color type
Mike Becker <universe@uap-core.de>
parents: 249
diff changeset
62 asc_color color;
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
63 enum MoveDirection direction;
216
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
64 enum MoveDirection target_direction;
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
65 /**
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
66 * The number of tiles this player can look.
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
67 */
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
68 float view_distance;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
69 /**
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
70 * The speed in tiles per second.
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
71 */
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
72 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: 245
diff changeset
73 /**
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
74 * 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: 245
diff changeset
75 */
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
76 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: 245
diff changeset
77 /**
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
78 * 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: 245
diff changeset
79 */
274
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
80 asc_vec2u new_position;
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
81 unsigned health;
274
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
82 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: 233
diff changeset
83 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: 245
diff changeset
84 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: 233
diff changeset
85 } Player;
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
86
245
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
87 #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: 244
diff changeset
88 #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: 244
diff changeset
89
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
90 /** 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: 244
diff changeset
91 #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: 244
diff changeset
92 /** The bits in the tile data that identify the owner. */
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
93 #define GAME_FIELD_TILE_OWNER_MASK 0x0F
245
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
94
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
95 typedef struct {
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
96 AscSceneNode *nodes[GAME_FIELD_SIZE][GAME_FIELD_SIZE];
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
97 uint8_t tile_data[GAME_FIELD_SIZE][GAME_FIELD_SIZE];
245
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
98 } GameField;
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
99
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
100
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
101 #define GAME_STATE_MENU 0
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
102 #define GAME_STATE_PLAYING 1
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
103 #define GAME_STATE_GAME_OVER 2
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
104
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
105 typedef struct {
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
106 int state;
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
107 GameField *field;
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
108 Player *players[4];
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
109 } GameState;
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
110
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
111 GameState game = {0};
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
112
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
113 static void globals_init(void) {
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
114 asc_transform_identity(rotations[MOVE_UP]);
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
115 asc_transform_roll(rotations[MOVE_LEFT], asc_rad(-90));
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
116 asc_transform_roll(rotations[MOVE_RIGHT], asc_rad(90));
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
117 asc_transform_roll(rotations[MOVE_DOWN], asc_rad(180));
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
118 directions[MOVE_UP] = ASC_VEC2I(0, -1);
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
119 directions[MOVE_LEFT] = ASC_VEC2I(-1, 0);
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
120 directions[MOVE_DOWN] = ASC_VEC2I(0, 1);
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
121 directions[MOVE_RIGHT] = ASC_VEC2I(1, 0);
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
122 }
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
123
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
124 static void textures_destroy(void) {
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
125 asc_texture_destroy(tex2d, TEXTURE_2D_COUNT);
93
52611a99e574 add memory pool to gl context
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
126 }
52611a99e574 add memory pool to gl context
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
127
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
128 static void textures_init(void) {
296
f4f7886f10f0 recreate player sprite from scratch and remove all the interpolation noise
Mike Becker <universe@uap-core.de>
parents: 294
diff changeset
129 // don't use interpolation for pixel art
f4f7886f10f0 recreate player sprite from scratch and remove all the interpolation noise
Mike Becker <universe@uap-core.de>
parents: 294
diff changeset
130 asc_texture_init(tex2d, 2, ASC_TEXTURE_2D,
f4f7886f10f0 recreate player sprite from scratch and remove all the interpolation noise
Mike Becker <universe@uap-core.de>
parents: 294
diff changeset
131 ASC_TEXTURE_MIN_FILTER_NEAREST, ASC_TEXTURE_MAG_FILTER_NEAREST);
238
e22abcd22e47 make the default window scaling and positioning screen resolution dependent
Mike Becker <universe@uap-core.de>
parents: 234
diff changeset
132 asc_texture_from_file(TEXTURE_PLAYER, "player.png");
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
133 asc_texture_from_file(TEXTURE_PLAYER_COLOR_MAP, "player-color-map.png");
296
f4f7886f10f0 recreate player sprite from scratch and remove all the interpolation noise
Mike Becker <universe@uap-core.de>
parents: 294
diff changeset
134 // interpolate larger, not pixelated, textures
f4f7886f10f0 recreate player sprite from scratch and remove all the interpolation noise
Mike Becker <universe@uap-core.de>
parents: 294
diff changeset
135 asc_texture_init(tex2d+2, 1, ASC_TEXTURE_2D,
f4f7886f10f0 recreate player sprite from scratch and remove all the interpolation noise
Mike Becker <universe@uap-core.de>
parents: 294
diff changeset
136 ASC_TEXTURE_MIN_FILTER_LINEAR, ASC_TEXTURE_MAG_FILTER_LINEAR);
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
137 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: 233
diff changeset
138 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: 88
diff changeset
139 }
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
140
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
141 static void backdrop_scale(AscBehavior *behavior) {
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
142 // 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: 242
diff changeset
143 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: 242
diff changeset
144 asc_ptr_cast(AscSprite, sprite, behavior->node);
294
4df350dac84f add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents: 290
diff changeset
145 asc_vec2u window_size = asc_active_window->rect.size;
244
ceab8a9f0366 add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
Mike Becker <universe@uap-core.de>
parents: 242
diff changeset
146 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: 242
diff changeset
147 }
ceab8a9f0366 add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
Mike Becker <universe@uap-core.de>
parents: 242
diff changeset
148
ceab8a9f0366 add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
Mike Becker <universe@uap-core.de>
parents: 242
diff changeset
149 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: 260
diff changeset
150 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: 242
diff changeset
151 asc_ptr_cast(AscRectangle, frame, behavior->node);
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
152 asc_rectangle_set_bounds(frame, asc_scene_viewport(MAIN_SCENE));
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
153 }
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
154
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
155 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: 262
diff changeset
156 const float scale = 1.f / asc_active_window->ui_scale;
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
157 AscSceneNode *node = asc_sprite(
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
158 .texture = TEXTURE_BACKDROP,
230
02090b2d147e replace ugly backdrop texture
Mike Becker <universe@uap-core.de>
parents: 229
diff changeset
159 .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: 234
diff changeset
160 .texture_scale_x = scale, .texture_scale_y = scale,
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
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: 233
diff changeset
162 asc_behavior_add(node, .func = backdrop_scale);
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
163 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: 242
diff changeset
164
ceab8a9f0366 add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
Mike Becker <universe@uap-core.de>
parents: 242
diff changeset
165 // 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: 242
diff changeset
166 // 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: 249
diff changeset
167 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: 242
diff changeset
168 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: 242
diff changeset
169 asc_ui_add_node(frame);
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
170 }
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
171
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
172 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: 189
diff changeset
173 asc_ptr_cast(AscText, node, behavior->node);
165
590a9e822b6b add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
174 static float last_fps = 0.f;
590a9e822b6b add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
175 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: 160
diff changeset
176 last_fps = asc_context.frame_rate;
298
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
177 asc_text_printf(node,
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
178 "%.2f FPS\n"
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
179 "%llu draw calls\n"
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
180 "%llu triangles\n"
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
181 "%llu vertices",
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
182 asc_context.frame_rate,
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
183 asc_active_glctx->counters.draw_calls,
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
184 asc_active_glctx->counters.triangles_rendered,
fa91e2e06eee add counters for draw calls, vertices, trianagles
Mike Becker <universe@uap-core.de>
parents: 297
diff changeset
185 asc_active_glctx->counters.vertices_rendered);
0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
186 }
148
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 144
diff changeset
187 }
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 144
diff changeset
188
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
189 static void fps_counter_tie_to_corner(AscBehavior *behavior) {
148
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 144
diff changeset
190 // 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: 144
diff changeset
191 AscSceneNode *node = behavior->node;
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 144
diff changeset
192 if (asc_test_flag(node->flags, ASC_SCENE_NODE_GRAPHICS_UPDATED) || asc_active_window->resized) {
299
c0d3a1acc6ae add TODO for improving alignment of text nodes
Mike Becker <universe@uap-core.de>
parents: 298
diff changeset
193 // TODO: this is visually wrong for one frame
c0d3a1acc6ae add TODO for improving alignment of text nodes
Mike Becker <universe@uap-core.de>
parents: 298
diff changeset
194 // instead there should be alignment settings with which we can control if (0,0) is in top left or bottom left corner
240
5ed38debd4a7 redesign game field and make it larger (and the player faster)
Mike Becker <universe@uap-core.de>
parents: 238
diff changeset
195 asc_scene_node_set_position2f(node, ASC_VEC2F(10,
294
4df350dac84f add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents: 290
diff changeset
196 asc_active_window->rect.size.height - ((AscText*)node)->dimension.height - 10
189
2c063b225183 remove separate vectors for position, rotation, scale from scene node
Mike Becker <universe@uap-core.de>
parents: 186
diff changeset
197 ));
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
198 }
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
199 }
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
200
260
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
201 static AscSceneNode *fps_counter_create(void) {
214
9d460888a83e remove global active font and color (also fixes #693)
Mike Becker <universe@uap-core.de>
parents: 213
diff changeset
202 AscSceneNode *node = asc_text(
9d460888a83e remove global active font and color (also fixes #693)
Mike Becker <universe@uap-core.de>
parents: 213
diff changeset
203 .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: 249
diff changeset
204 .color = ASC_RGB(1, 1, 1),
214
9d460888a83e remove global active font and color (also fixes #693)
Mike Becker <universe@uap-core.de>
parents: 213
diff changeset
205 .font = asc_font(ASC_FONT_REGULAR, 12),
9d460888a83e remove global active font and color (also fixes #693)
Mike Becker <universe@uap-core.de>
parents: 213
diff changeset
206 );
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
207 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: 233
diff changeset
208 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: 278
diff changeset
209 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: 154
diff changeset
210 asc_ui_add_node(node);
260
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
211 return node;
70
81a089a47eff redesign FPS counter
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
212 }
81a089a47eff redesign FPS counter
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
213
275
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
214 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: 278
diff changeset
215 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: 274
diff changeset
216
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
217 AscSceneNode *node = behavior->node;
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
218 // center the "game over" text in the game field viewport
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
219 const asc_rect main_scene_viewport = asc_scene_viewport(MAIN_SCENE);
275
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
220 asc_scene_node_set_position2f(node, ASC_VEC2F(
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
221 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: 274
diff changeset
222 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: 274
diff changeset
223 ));
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
224 }
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
225
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
226 static AscSceneNode *game_over_create_text(void) {
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
227 AscSceneNode *node = asc_text(
278
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
228 .name = "game_over_text",
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
229 .text = "Game Over\nPress R to Restart",
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
230 .color = ASC_RGB(1, 1, 1),
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
231 .font = asc_font(ASC_FONT_REGULAR, 36),
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
232 .alignment = ASC_TEXT_ALIGN_CENTER,
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
233 .centered = true,
634fa2996d4e make behaviors aware of being unpaused
Mike Becker <universe@uap-core.de>
parents: 275
diff changeset
234 );
275
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
235
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
236 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: 278
diff changeset
237 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: 274
diff changeset
238 asc_ui_add_node(node);
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
239
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
240 return node;
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
241 }
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
242
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
243 static bool game_field_tile_occupied(asc_vec2u coords) {
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
244 unsigned x = coords.x, y = coords.y;
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
245 return game.field->tile_data[x][y] & GAME_FIELD_TILE_OWNER_MASK;
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
246 }
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
247
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
248 static void game_field_tile_chown(asc_vec2u coords, Player *player) {
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
249 unsigned x = coords.x, y = coords.y;
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
250 asc_ptr_cast(AscRectangle, tile, game.field->nodes[x][y]);
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
251 if (player == NULL) {
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
252 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: 249
diff changeset
253 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: 245
diff changeset
254 } else {
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
255 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: 245
diff changeset
256 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: 245
diff changeset
257 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
258 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
259
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
260 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: 245
diff changeset
261 // 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: 245
diff changeset
262 AscSceneNode *node = asc_scene_node_empty();
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
263 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: 245
diff changeset
264 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: 245
diff changeset
265 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: 245
diff changeset
266 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: 245
diff changeset
267 .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: 245
diff changeset
268 .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: 249
diff changeset
269 .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: 249
diff changeset
270 .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: 245
diff changeset
271 );
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
272
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
273 game.field->tile_data[x][y] = GAME_FIELD_TILE_EXISTS_FLAG;
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
274 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: 245
diff changeset
275
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
276 asc_scene_node_add(node, 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: 245
diff changeset
277 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
278 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
279 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: 245
diff changeset
280 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: 245
diff changeset
281 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
282
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
283 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: 245
diff changeset
284 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: 245
diff changeset
285 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
286
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
287 typedef struct {
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
288 AscShaderProgram program;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
289 asc_uniform_loc map_albedo;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
290 asc_uniform_loc map_color;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
291 asc_uniform_loc color;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
292 } PlayerShader;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
293
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
294 static void player_shader_init(AscShaderProgram *p, CX_UNUSED int flags) {
270
3031d1bb5957 further improve names and docu of the uniform location init functions
Mike Becker <universe@uap-core.de>
parents: 269
diff changeset
295 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: 269
diff changeset
296 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: 269
diff changeset
297 asc_shader_set_uniform_loc_by_name(p, PlayerShader, color);
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
298 }
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
299
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
300 static AscShaderProgram *player_shader_create(CX_UNUSED int unused) {
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
301 return asc_shader_create((AscShaderCodes) {
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
302 .vtx = {.source_file = "sprite_vtx.glsl"},
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
303 .frag = {.source_file = "player.glsl",},
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
304 }, sizeof(PlayerShader), player_shader_init, 0);
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
305 }
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
306
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
307 static void player_draw(const AscCamera *camera, const AscSceneNode *node) {
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
308 asc_cptr_cast(AscSprite, sprite, node);
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
309 const Player *player = node->user_data;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
310
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
311 // TODO: we shall finally add the shader information to the node
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
312 const AscShaderProgram *s = asc_shader_lookup(
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
313 SHADER_ID_PLAYER, player_shader_create, 0
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
314 );
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
315 if (asc_shader_use(s, camera)) return;
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
316 asc_cptr_cast(PlayerShader, shader, s);
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
317
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
318 asc_shader_upload_model_matrix(s, node);
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
319
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
320 // Bind texture
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
321 asc_texture_bind(TEXTURE_PLAYER, shader->map_albedo, 0);
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
322 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: 249
diff changeset
323 asc_shader_upload_color(shader->color, player->color);
242
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
324 asc_mesh_draw_triangle_strip(&sprite->mesh);
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
325 }
6eeb987f1681 add player colors
Mike Becker <universe@uap-core.de>
parents: 240
diff changeset
326
274
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
327 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: 273
diff changeset
328 pl->new_position.x = x;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
329 pl->new_position.y = y;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
330 pl->reset_position = true;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
331 }
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
332
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
333 static void player_position_random(Player *pl) {
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
334 // 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: 273
diff changeset
335 player_position(
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
336 pl,
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
337 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: 273
diff changeset
338 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: 273
diff changeset
339 );
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
340 }
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
341
274
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
342 static void player_main_behavior(AscBehavior *behavior) {
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
343 AscSceneNode *node = behavior->node;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
344 Player *player = node->user_data;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
345
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
346 if (player->alive && player->health == 0) {
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
347 player->alive = false;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
348 asc_scene_node_hide(node);
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
349 // 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: 273
diff changeset
350 cxListClear(player->trace);
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
351 // 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: 273
diff changeset
352 game.state = GAME_STATE_GAME_OVER;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
353 }
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
354
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
355 // TODO: replace with respawn event
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
356 if (!player->alive && player->health > 0) {
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
357 player_position_random(player);
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
358 player->alive = true;
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
359 asc_scene_node_show(node);
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
360 }
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
361 }
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
362
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
363 static void player_move(AscBehavior *behavior) {
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
364 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: 233
diff changeset
365 Player *player = node->user_data;
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
366
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
367 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: 233
diff changeset
368
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
369 // determine the current tile's coordinates
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
370 const asc_vec2u old_tile = game_field_tile_at_position(node->position);
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
371
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
372 // 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: 233
diff changeset
373 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: 233
diff changeset
374 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: 233
diff changeset
375 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: 245
diff changeset
376 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: 245
diff changeset
377 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: 245
diff changeset
378 ));
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
379 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: 233
diff changeset
380 return;
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
381 }
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
382
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
383 // 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: 245
diff changeset
384 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: 233
diff changeset
385 const asc_vec2i dir = directions[player->direction];
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
386 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: 245
diff changeset
387
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
388 // 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: 233
diff changeset
389 if (player->direction == player->target_direction) {
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
390 // move without changing the direction
216
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
391 asc_scene_node_move2f(node, movement);
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
392 } else {
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
393 // determine axis
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
394 // and check if we are about to cross the center
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
395 // this relies on positive positions!
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
396 bool rotate = false;
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
397 if (movement.x == 0) {
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
398 // 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: 245
diff changeset
399 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: 245
diff changeset
400 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: 245
diff changeset
401 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: 245
diff changeset
402 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: 245
diff changeset
403 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: 245
diff changeset
404 rotate = side_curr ^ side_next;
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
405 } else {
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
406 // 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: 245
diff changeset
407 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: 245
diff changeset
408 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: 245
diff changeset
409 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: 245
diff changeset
410 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: 245
diff changeset
411 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: 245
diff changeset
412 rotate = side_curr ^ side_next;
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
413 }
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
414 if (rotate) {
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
415 // 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: 245
diff changeset
416 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: 245
diff changeset
417 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: 245
diff changeset
418 (.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: 245
diff changeset
419 (.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: 245
diff changeset
420 ));
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
421 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: 233
diff changeset
422 asc_scene_node_set_rotation(node, rotations[player->direction]);
216
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
423 } else {
217
4b3c974eab44 improve snap-to-grid-movement
Mike Becker <universe@uap-core.de>
parents: 216
diff changeset
424 // changing the direction not permitted, yet, continue movement
216
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
425 asc_scene_node_move2f(node, movement);
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
426 }
943980fa37b5 snap the movement to the grid
Mike Becker <universe@uap-core.de>
parents: 215
diff changeset
427 }
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
428
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
429 // die when leaving the game field
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
430 if (node->position.x < 0 || node->position.y < 0 ||
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
431 node->position.x > GAME_FIELD_SIZE*ts ||
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
432 node->position.y > GAME_FIELD_SIZE*ts) {
274
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
433 // 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: 273
diff changeset
434 player->health = 0;
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
435 return;
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
436 }
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
437
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
438 // TODO: collision with other players
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
439
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
440 // determine the new tile's coordinates
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
441 const asc_vec2u new_tile = game_field_tile_at_position(node->position);
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
442
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
443 // tile did not change - stop here
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
444 if (asc_vec2u_eq(old_tile, new_tile)) return;
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
445
297
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
446 // die when colliding with a player's trace
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
447 if (game_field_tile_occupied(new_tile)) {
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
448 // TODO: replace setting health to zero with a "kill" event
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
449 player->health = 0;
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
450 return;
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
451 }
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
452
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
453 // update own trace
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
454 game_field_tile_chown(old_tile, player);
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
455 cxListAdd(player->trace, &old_tile);
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
456 if (cxListSize(player->trace) > 7) {
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
457 // TODO: implement power-up which makes the trace longer
02ce7c6251a9 implement that your own trace kills you
Mike Becker <universe@uap-core.de>
parents: 296
diff changeset
458 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: 245
diff changeset
459 }
205
d1e44c861426 hack a quick example for both rotation directions
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
460 }
d1e44c861426 hack a quick example for both rotation directions
Mike Becker <universe@uap-core.de>
parents: 204
diff changeset
461
272
6ed9fb9662c0 move player controls into a behavior
Mike Becker <universe@uap-core.de>
parents: 271
diff changeset
462 static void player_controls(AscBehavior *behavior) {
6ed9fb9662c0 move player controls into a behavior
Mike Becker <universe@uap-core.de>
parents: 271
diff changeset
463 Player *player = behavior->node->user_data;
6ed9fb9662c0 move player controls into a behavior
Mike Becker <universe@uap-core.de>
parents: 271
diff changeset
464 // 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: 257
diff changeset
465 if (asc_key_pressed(ASC_KEY(LEFT))) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
466 if (player->direction != MOVE_RIGHT) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
467 player->target_direction = MOVE_LEFT;
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
468 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
469 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
470 if (asc_key_pressed(ASC_KEY(RIGHT))) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
471 if (player->direction != MOVE_LEFT) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
472 player->target_direction = MOVE_RIGHT;
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
473 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
474 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
475 if (asc_key_pressed(ASC_KEY(UP))) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
476 if (player->direction != MOVE_DOWN) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
477 player->target_direction = MOVE_UP;
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
478 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
479 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
480 if (asc_key_pressed(ASC_KEY(DOWN))) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
481 if (player->direction != MOVE_UP) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
482 player->target_direction = MOVE_DOWN;
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
483 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
484 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
485 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
486
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
487 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: 245
diff changeset
488 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: 245
diff changeset
489 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: 245
diff changeset
490 }
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
491
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
492 static void player_trace_release_tile(asc_vec2u *coords) {
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
493 game_field_tile_chown(*coords, NULL);
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
494 }
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
495
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
496 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: 245
diff changeset
497 AscSceneNode *node = asc_sprite(
114
5b91bbab1ac0 give them nodes names
Mike Becker <universe@uap-core.de>
parents: 110
diff changeset
498 .name = "Player",
245
0cc396ade3b0 add a simple struct for the game field that may be extended later
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
499 .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: 244
diff changeset
500 .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: 244
diff changeset
501 .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: 244
diff changeset
502 .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: 86
diff changeset
503 );
247
3547254742a7 add player's trace and removes the origin offsets from the game field's tiles
Mike Becker <universe@uap-core.de>
parents: 245
diff changeset
504 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: 245
diff changeset
505 Player *player = asc_scene_node_allocate_data(node, sizeof(Player));
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
506 player->node = node;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
507 player->view_distance = 7.f; // start with 7 tiles
240
5ed38debd4a7 redesign game field and make it larger (and the player faster)
Mike Becker <universe@uap-core.de>
parents: 238
diff changeset
508 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: 245
diff changeset
509 player->number = 1;
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
510 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: 249
diff changeset
511 player->color = ASC_RGB(1, 0, 0);
290
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
512 player->trace = cxLinkedListCreate(NULL, sizeof(asc_vec2u));
2eb3813562e7 update uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
513 cxSetDestructor(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: 245
diff changeset
514 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: 245
diff changeset
515 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: 273
diff changeset
516
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
517 // add behaviors
ba7f043f9fdf move the player's life "controller" to a behavior
Mike Becker <universe@uap-core.de>
parents: 273
diff changeset
518 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: 271
diff changeset
519 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: 245
diff changeset
520 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: 278
diff changeset
521 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: 273
diff changeset
522
234
a1d70b8018c1 improve structure of the game code and add a function to set the player position
Mike Becker <universe@uap-core.de>
parents: 233
diff changeset
523 return player;
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
524 }
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
525
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
526 static void main_scene_viewport_update(AscCamera *camera, asc_vec2u window_size) {
233
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
527 // margins
238
e22abcd22e47 make the default window scaling and positioning screen resolution dependent
Mike Becker <universe@uap-core.de>
parents: 234
diff changeset
528 const unsigned margin = 16;
233
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
529
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
530 // 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: 234
diff changeset
531 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: 227
diff changeset
532
233
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
533 // 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: 231
diff changeset
534 const unsigned rw = 2*margin + left_area;
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
535 const unsigned rh = 2*margin;
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
536
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
537 // 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: 231
diff changeset
538 if (window_size.width < rw || window_size.height < rh) {
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
539 camera->viewport = ASC_RECT(0, 0, 0, 0);
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
540 return;
233
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
541 }
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
542 window_size.width -= rw;
bda74199223f handle the edge-case when a viewport vanishes
Mike Becker <universe@uap-core.de>
parents: 231
diff changeset
543 window_size.height -= rh;
229
5c05b5164a16 first idea of what the main scene could look like
Mike Becker <universe@uap-core.de>
parents: 227
diff changeset
544
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
545 // Compute scaling and offsets
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
546 unsigned viewport_size, offset_x = 0, offset_y = 0;
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
547 if (window_size.width > window_size.height) {
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
548 // Wider window: letterbox (black bars on top/bottom)
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
549 offset_x = (window_size.width - window_size.height) / 2;
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
550 viewport_size = window_size.height;
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
551 } else {
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
552 // Taller window: pillarbox (black bars on sides)
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
553 offset_y = (window_size.height - window_size.width) / 2;
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
554 viewport_size = window_size.width;
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
555 }
229
5c05b5164a16 first idea of what the main scene could look like
Mike Becker <universe@uap-core.de>
parents: 227
diff changeset
556 offset_x += left_area + margin;
5c05b5164a16 first idea of what the main scene could look like
Mike Becker <universe@uap-core.de>
parents: 227
diff changeset
557 offset_y += margin;
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
558
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
559 // Set the viewport to the scaled and centered region
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
560 camera->viewport = ASC_RECT(offset_x, offset_y, viewport_size, viewport_size);
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
561 }
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
562
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
563 static void main_scene_camera_update(AscCamera *camera) {
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
564 // follow the player
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
565 // TODO: for hot seat / split screen updates we need to attach custom data to the camera
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
566 // s.t. the camera knows which player to follow
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
567 const Player *player = game.players[0];
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
568
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
569 const AscSceneNode *player_node = player->node;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
570 const float view_distance = player->view_distance;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
571 const float cam_view_distance = (1+view_distance) * GAME_FIELD_TILE_SIZE;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
572 const float proj_size = 2 * cam_view_distance;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
573
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
574 // TODO: create camera API to avoid direct access to the matrices
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
575
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
576 // update the projection matrix
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
577 asc_mat4f_ortho_update_size(camera->projection, proj_size, proj_size);
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
578
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
579 // update the view matrix
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
580 asc_vec2f pos = asc_scene_node_get_position2f(player_node);
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
581 pos.x = -pos.x + cam_view_distance;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
582 pos.y = -pos.y + cam_view_distance;
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
583 asc_transform_translate2f(camera->view, pos);
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
584 }
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
585
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
586 int main(void) {
0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
587 asc_context_initialize();
33
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
588 if (asc_has_error()) {
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
589 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: 88
diff changeset
590 "Fatal Error",asc_get_error(), NULL);
33
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
591 return 1;
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
592 }
0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
593
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
594 // 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: 233
diff changeset
595 globals_init();
206
26726b7a89a7 complete basic movement
Mike Becker <universe@uap-core.de>
parents: 205
diff changeset
596
231
0da563c4e39c make initial window size depend on UI scaling factor
Mike Becker <universe@uap-core.de>
parents: 230
diff changeset
597 // create the window
257
67d7b79997df remove AscWindowSettings struct
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
598 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: 230
diff changeset
599 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: 234
diff changeset
600 asc_window_set_size(0, asc_vec2_ftou(
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
601 asc_vec2f_scale(ASC_VEC2F(600+HUD_WIDTH, 600), asc_ui_scale_auto())));
238
e22abcd22e47 make the default window scaling and positioning screen resolution dependent
Mike Becker <universe@uap-core.de>
parents: 234
diff changeset
602 asc_window_center(0);
16
c5dde81b6fb2 add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
603
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
604 // 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: 233
diff changeset
605 textures_init();
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
606
263
cc5cd4c98e46 fix that backdrop texture scale was not inverting the ui scale
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
607 // initialize backdrop scene
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
608 AscCamera backdrop_camera;
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
609 asc_camera_init(&backdrop_camera,
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
610 .type = ASC_CAMERA_ORTHO,
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
611 .viewport_update_func = asc_camera_ortho_update_size
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
612 );
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
613 asc_scene_init(BACKDROP_SCENE, "backdrop", &backdrop_camera);
263
cc5cd4c98e46 fix that backdrop texture scale was not inverting the ui scale
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
614 backdrop_create();
cc5cd4c98e46 fix that backdrop texture scale was not inverting the ui scale
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
615
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
616 // Initialize the main scene
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
617 AscCamera main_camera;
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
618 asc_camera_init(&main_camera,
100
5231da78831e change asc_scene_init() to also request parameters for camera initialization
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
619 .type = ASC_CAMERA_ORTHO,
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
620 .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: 249
diff changeset
621 .clear_color = ASC_RGBi(0, 32, 16),
288
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
622 .viewport_update_func = main_scene_viewport_update,
8796f03aac26 make the camera follow the player + add limited vision
Mike Becker <universe@uap-core.de>
parents: 287
diff changeset
623 .update_func = main_scene_camera_update
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
624 );
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 279
diff changeset
625 asc_scene_init(MAIN_SCENE, "main", &main_camera);
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
626
260
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
627 // create the fps counter
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
628 AscSceneNode *fps_counter = fps_counter_create();
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
629 asc_scene_node_hide(fps_counter);
213
3d252dbd7c8e add a tiled game field
Mike Becker <universe@uap-core.de>
parents: 206
diff changeset
630
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
631 // create game over text
275
2256af1440db move game over text to the UI scene
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
632 AscSceneNode *text_game_over = game_over_create_text();
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
633
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
634 // initialize the game state
260
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
635 // 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: 257
diff changeset
636 game.state = GAME_STATE_PLAYING;
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
637 game.players[0] = player_create();
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
638 game_field_create();
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
639
33
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
640 // Main Loop
29
1d001eb694dc bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents: 25
diff changeset
641 do {
0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
642 // quit application on any error
33
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
643 if (asc_has_error()) {
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
644 SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
65
9c44c55d327a consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
645 "Fatal Error", asc_get_error(),
294
4df350dac84f add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents: 290
diff changeset
646 asc_active_window->sdl);
33
e7ddb52facd3 add behavior nodes + restructure test program
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
647 asc_clear_error();
63
e3cacdd636e4 implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents: 62
diff changeset
648 asc_context_quit();
e3cacdd636e4 implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents: 62
diff changeset
649 }
e3cacdd636e4 implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents: 62
diff changeset
650
260
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
651 // game states
272
6ed9fb9662c0 move player controls into a behavior
Mike Becker <universe@uap-core.de>
parents: 271
diff changeset
652 // 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: 271
diff changeset
653 if (game.state == GAME_STATE_GAME_OVER) {
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
654 asc_scene_node_show(text_game_over);
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
655 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: 273
diff changeset
656 // 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: 273
diff changeset
657 game.players[0]->health = 100;
265
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
658 // TODO: re-load the "level"
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
659 game.state = GAME_STATE_PLAYING;
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
660 asc_scene_node_hide(text_game_over);
5c915d01bdc0 add simple game over screen
Mike Becker <universe@uap-core.de>
parents: 264
diff changeset
661 }
200
cf0579d3bbc4 add rotation functions, but rotation with special point of origin is still broken
Mike Becker <universe@uap-core.de>
parents: 195
diff changeset
662 }
cf0579d3bbc4 add rotation functions, but rotation with special point of origin is still broken
Mike Becker <universe@uap-core.de>
parents: 195
diff changeset
663
140
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 123
diff changeset
664 // debug-key for clearing the shader registry
141
cd82643bb6d9 implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
665 if (asc_key_pressed(ASC_KEY(S))) {
140
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 123
diff changeset
666 asc_shader_clear_registry();
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 123
diff changeset
667 }
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 123
diff changeset
668
260
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
669 // show/hide the FPS counter
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
670 if (asc_key_pressed(ASC_KEY(F2))) {
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
671 asc_scene_node_toggle_visibility(fps_counter);
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
672 }
2649d04f0287 start giving the game code more structure
Mike Becker <universe@uap-core.de>
parents: 257
diff changeset
673
63
e3cacdd636e4 implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents: 62
diff changeset
674 // quit application on ESC key press
141
cd82643bb6d9 implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
675 if (asc_key_pressed(ASC_KEY(ESCAPE))) {
63
e3cacdd636e4 implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents: 62
diff changeset
676 asc_context_quit();
16
c5dde81b6fb2 add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
677 }
29
1d001eb694dc bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents: 25
diff changeset
678 } while (asc_loop_next());
16
c5dde81b6fb2 add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
679
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
680 // cleanup
0
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
681 asc_context_destroy();
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
682 return 0;
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
683 }
593b60458157 initial commit
Mike Becker <universe@uap-core.de>
parents:
diff changeset
684

mercurial