From c1b05e13bf7bec171aa45c7e1ebf9255c0d9b332 Mon Sep 17 00:00:00 2001 From: Ewan Durand Date: Mon, 10 Mar 2025 17:48:29 +0100 Subject: [PATCH 1/8] =?UTF-8?q?Cr=C3=A9ation=20du=20projet=20shmup=5Fpatte?= =?UTF-8?q?rn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/shmup_pattern/shmup_pattern.cpp | 23 +++++++++++++++++++++++ examples/shmup_pattern/shmup_pattern.tscn | 19 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 examples/shmup_pattern/shmup_pattern.cpp create mode 100644 examples/shmup_pattern/shmup_pattern.tscn diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp new file mode 100644 index 0000000..2af8fa7 --- /dev/null +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -0,0 +1,23 @@ +#define RED 0xFFFF0000 +#define GREEN 0xFF00FF00 +#define BLUE 0xFF0000FF +#define BLACK 0xFF000000 + + +void render(uint x, uint y, uint p) +{ + if((x==15) && (y==16)) + data_0[p] = GREEN; + else + data_0[p] = BLACK; +} + +void main() +{ + uint x = gl_GlobalInvocationID.x; + uint y = gl_GlobalInvocationID.y; + uint p = x + y * WSX; + + + render(x,y,p); +} \ No newline at end of file diff --git a/examples/shmup_pattern/shmup_pattern.tscn b/examples/shmup_pattern/shmup_pattern.tscn new file mode 100644 index 0000000..10f79d5 --- /dev/null +++ b/examples/shmup_pattern/shmup_pattern.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://dtbyjsudidrbf"] + +[ext_resource type="Script" path="res://addons/compute_shader_studio/compute_shader_studio_2d.gd" id="1_xrsy7"] +[ext_resource type="Texture2D" uid="uid://demftcowdd5c6" path="res://examples/icon.svg" id="2_i6ewd"] + +[node name="ShmupPattern" type="Node2D"] + +[node name="ComputeShaderStudio2D" type="Node" parent="." node_paths=PackedStringArray("data")] +script = ExtResource("1_xrsy7") +WSX = 32 +WSY = 32 +glsl_file = "res://examples/shmup_pattern/shmup_pattern.cpp" +GLSL_code = "" +data = [NodePath("../Shader")] + +[node name="Shader" type="Sprite2D" parent="."] +position = Vector2(576, 324) +scale = Vector2(3, 3) +texture = ExtResource("2_i6ewd") From a67a27788e883e5cc129a4ad4df4738c4c20f6ff Mon Sep 17 00:00:00 2001 From: Ewan Durand Date: Tue, 11 Mar 2025 12:14:22 +0100 Subject: [PATCH 2/8] =?UTF-8?q?D=C3=A9placement=20d'objet=20simple?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/shmup_pattern/shmup_pattern.cpp | 82 +++++++++++++++++++++-- examples/shmup_pattern/shmup_pattern.tscn | 5 +- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index 2af8fa7..7c936a2 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -3,21 +3,93 @@ #define BLUE 0xFF0000FF #define BLACK 0xFF000000 +#define PI 3.1415926 +#define TWO_PI 2*PI +#define SPAWN vec2(32,32) +#define RAD 3 +#define NB_SPWN 6 + +/* Layers : + * data_0 : render + * data_1 : position + * data_2 : vector.x for movement (*1000) + * data_3 : vector.y for movement (*1000) + */ + +// Fonction d'initialisation des points d'apparition des bullets +// +void init(uint x, uint y, uint p) +{ + float angle = TWO_PI/NB_SPWN; + + if(int(x)==SPAWN.x && int(y)==SPAWN.y){ + data_1[p] = 1; + data_2[p] = 1000; + data_3[p] = 0; + } + else{ + data_1[p] = 0; + data_2[p] = 0; + data_3[p] = 0; + } +} + +// Fonction de calcul du deplacement de la bullet +void compute_movement(uint x, uint y, uint p) +{ + if(data_1[p] == 1){ + // New position + // Current position + movement based on vec2 + vec2 dir = vec2(float(data_2[p])/1000, float(data_3[p])/1000); + float speed = 1.0; + float angle = atan(dir.y, dir.x); + float bx = float(x) + round(cos(angle))*speed; + float by = float(y) + round(sin(angle))*speed; + + uint dp = uint(bx) + uint(by)*WSX; + if((bx>0 && bx0 && by Date: Wed, 12 Mar 2025 15:25:12 +0100 Subject: [PATCH 3/8] Apparition de groupes de bullets --- examples/shmup_pattern/shmup_pattern.cpp | 52 ++++++++++++++++------- examples/shmup_pattern/shmup_pattern.tscn | 3 +- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index 7c936a2..c852366 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -5,9 +5,11 @@ #define PI 3.1415926 #define TWO_PI 2*PI -#define SPAWN vec2(32,32) +#define SPAWN vec2(127,63) #define RAD 3 -#define NB_SPWN 6 +#define NB_SPWN 8 +#define OFFSET_ANGLE PI/NB_SPWN +#define ROTATION PI/12 /* Layers : * data_0 : render @@ -18,19 +20,32 @@ // Fonction d'initialisation des points d'apparition des bullets // -void init(uint x, uint y, uint p) +void init(uint p) { - float angle = TWO_PI/NB_SPWN; + data_1[p] = 0; + data_2[p] = 0; + data_3[p] = 0; +} + +vec4 compute_spawn_position_angle(int nb, int step) +{ + vec4 position_direction; - if(int(x)==SPAWN.x && int(y)==SPAWN.y){ + position_direction.x = SPAWN.x + cos(nb * (TWO_PI/NB_SPWN) + OFFSET_ANGLE + step*ROTATION) * RAD; + position_direction.y = SPAWN.y + sin(nb * (TWO_PI/NB_SPWN) + OFFSET_ANGLE + step*ROTATION) * RAD; + + position_direction.z = (position_direction.x - SPAWN.x)*1000; + position_direction.w = (position_direction.y - SPAWN.y)*1000; + + return position_direction; +} + +void spawn_bullet(uint x, uint y, uint p, vec4 position_direction) +{ + if((int(position_direction.x) == int(x)) && (int(position_direction.y) == int(y))){ data_1[p] = 1; - data_2[p] = 1000; - data_3[p] = 0; - } - else{ - data_1[p] = 0; - data_2[p] = 0; - data_3[p] = 0; + data_2[p] = int(position_direction.z); + data_3[p] = int(position_direction.w); } } @@ -41,10 +56,10 @@ void compute_movement(uint x, uint y, uint p) // New position // Current position + movement based on vec2 vec2 dir = vec2(float(data_2[p])/1000, float(data_3[p])/1000); - float speed = 1.0; + float speed = 2.0; float angle = atan(dir.y, dir.x); - float bx = float(x) + round(cos(angle))*speed; - float by = float(y) + round(sin(angle))*speed; + float bx = float(x) + round(cos(angle)*speed); + float by = float(y) + round(sin(angle)*speed); uint dp = uint(bx) + uint(by)*WSX; if((bx>0 && bx0 && by Date: Thu, 13 Mar 2025 10:05:39 +0100 Subject: [PATCH 4/8] =?UTF-8?q?G=C3=A9n=C3=A9ration=20de=20pattern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test : implémentation de pseudo aléatoire pour faire varier la vitesse --- examples/shmup_pattern/shmup_pattern.cpp | 101 ++++++++++++++--------- 1 file changed, 62 insertions(+), 39 deletions(-) diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index c852366..1906e9c 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -3,13 +3,38 @@ #define BLUE 0xFF0000FF #define BLACK 0xFF000000 +// Generation de bullets #define PI 3.1415926 #define TWO_PI 2*PI #define SPAWN vec2(127,63) -#define RAD 3 -#define NB_SPWN 8 -#define OFFSET_ANGLE PI/NB_SPWN -#define ROTATION PI/12 +#define RAD 5 +#define NB_SPWN 12 +#define OFFSET_ROTATION PI/20 +#define SPEED 2.0 + +// Aleatoire pour le deplacement des bullets +#define PHI 1.61803398874989484820459 +#define RND_MOVE 0.5 + +float compute_seed() +{ + float seed = 0.0; + int mult = 10; + int tmp = step; + while(true) + { + if(tmp == 0) break; + seed += (tmp%10)/mult; + tmp = tmp/10; + mult *= 10; + } + return seed; +} + +float gold_noise(vec2 xy, float seed) +{ + return fract(tan(distance(xy*PHI, xy)*seed)*xy.x); +} /* Layers : * data_0 : render @@ -27,12 +52,12 @@ void init(uint p) data_3[p] = 0; } -vec4 compute_spawn_position_angle(int nb, int step) +vec4 compute_spawn_position_angle(int nb, int r) { vec4 position_direction; - position_direction.x = SPAWN.x + cos(nb * (TWO_PI/NB_SPWN) + OFFSET_ANGLE + step*ROTATION) * RAD; - position_direction.y = SPAWN.y + sin(nb * (TWO_PI/NB_SPWN) + OFFSET_ANGLE + step*ROTATION) * RAD; + position_direction.x = SPAWN.x + cos(nb * (TWO_PI/NB_SPWN) + r*OFFSET_ROTATION) * RAD; + position_direction.y = SPAWN.y + sin(nb * (TWO_PI/NB_SPWN) + r*OFFSET_ROTATION) * RAD; position_direction.z = (position_direction.x - SPAWN.x)*1000; position_direction.w = (position_direction.y - SPAWN.y)*1000; @@ -53,38 +78,39 @@ void spawn_bullet(uint x, uint y, uint p, vec4 position_direction) void compute_movement(uint x, uint y, uint p) { if(data_1[p] == 1){ - // New position - // Current position + movement based on vec2 - vec2 dir = vec2(float(data_2[p])/1000, float(data_3[p])/1000); - float speed = 2.0; - float angle = atan(dir.y, dir.x); - float bx = float(x) + round(cos(angle)*speed); - float by = float(y) + round(sin(angle)*speed); - - uint dp = uint(bx) + uint(by)*WSX; - if((bx>0 && bx0 && by0 && bx0 && by Date: Thu, 13 Mar 2025 15:01:38 +0100 Subject: [PATCH 5/8] Pattern fonctionnel --- examples/shmup_pattern/shmup_pattern.cpp | 69 ++++++++++++------------ 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index 1906e9c..96d1301 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -9,32 +9,11 @@ #define SPAWN vec2(127,63) #define RAD 5 #define NB_SPWN 12 -#define OFFSET_ROTATION PI/20 +#define OFFSET_ROTATION PI/4 #define SPEED 2.0 // Aleatoire pour le deplacement des bullets -#define PHI 1.61803398874989484820459 -#define RND_MOVE 0.5 - -float compute_seed() -{ - float seed = 0.0; - int mult = 10; - int tmp = step; - while(true) - { - if(tmp == 0) break; - seed += (tmp%10)/mult; - tmp = tmp/10; - mult *= 10; - } - return seed; -} - -float gold_noise(vec2 xy, float seed) -{ - return fract(tan(distance(xy*PHI, xy)*seed)*xy.x); -} +#define RND_MOVE 0.9 /* Layers : * data_0 : render @@ -74,12 +53,34 @@ void spawn_bullet(uint x, uint y, uint p, vec4 position_direction) } } + +float compute_seed() +{ + int mult = 1; + int tmp = 2*step+current_pass; + bool loop = true; + while(loop) + { + if(tmp == 0) loop = false; + mult *= 10; + tmp = tmp/10; + } + return step/mult; +} + +float random(float seed) +{ + return fract(sin(seed)*2.85/cos(seed)*3.75); +} + + // Fonction de calcul du deplacement de la bullet void compute_movement(uint x, uint y, uint p) { if(data_1[p] == 1){ - float seed = fract(compute_seed()); - if(gold_noise(vec2(int(x), int(y)), seed) <= RND_MOVE){ + float random = random(float(int(x)*int(y)+2*step+current_pass)); + + if(random <= RND_MOVE){ // New position // Current position + movement based on vec2 vec2 dir = vec2(float(data_2[p])/1000, float(data_3[p])/1000); @@ -90,14 +91,16 @@ void compute_movement(uint x, uint y, uint p) uint dp = uint(bx) + uint(by)*WSX; if((bx>0 && bx0 && by Date: Thu, 13 Mar 2025 15:34:44 +0100 Subject: [PATCH 6/8] =?UTF-8?q?Param=C3=A9trage=20des=20patterns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/shmup_pattern/shmup_pattern.cpp | 51 ++++++++++++++--------- examples/shmup_pattern/shmup_pattern.tscn | 2 +- examples/simple_circle/simple_circle.tscn | 2 +- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index 96d1301..3e06de6 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -1,14 +1,17 @@ -#define RED 0xFFFF0000 +#define RED 0xFF0000FF #define GREEN 0xFF00FF00 -#define BLUE 0xFF0000FF +#define BLUE 0xFFFF0000 #define BLACK 0xFF000000 // Generation de bullets #define PI 3.1415926 #define TWO_PI 2*PI -#define SPAWN vec2(127,63) -#define RAD 5 -#define NB_SPWN 12 +#define SPAWN1 vec2(63,31) +#define SPAWN2 vec2(191,31) +#define RAD1 50 +#define RAD2 5 +#define NB_SPWN1 10 +#define NB_SPWN2 3 #define OFFSET_ROTATION PI/4 #define SPEED 2.0 @@ -31,23 +34,23 @@ void init(uint p) data_3[p] = 0; } -vec4 compute_spawn_position_angle(int nb, int r) +vec4 compute_spawn_position_angle(vec2 spawn, int nb, int nbRot, int rad, int nb_spwn) { vec4 position_direction; - position_direction.x = SPAWN.x + cos(nb * (TWO_PI/NB_SPWN) + r*OFFSET_ROTATION) * RAD; - position_direction.y = SPAWN.y + sin(nb * (TWO_PI/NB_SPWN) + r*OFFSET_ROTATION) * RAD; + position_direction.x = spawn.x + cos(nb * (TWO_PI/nb_spwn) + nbRot*OFFSET_ROTATION) * rad; + position_direction.y = spawn.y + sin(nb * (TWO_PI/nb_spwn) + nbRot*OFFSET_ROTATION) * rad; - position_direction.z = (position_direction.x - SPAWN.x)*1000; - position_direction.w = (position_direction.y - SPAWN.y)*1000; + position_direction.z = (position_direction.x - spawn.x)*1000; + position_direction.w = (position_direction.y - spawn.y)*1000; return position_direction; } -void spawn_bullet(uint x, uint y, uint p, vec4 position_direction) +void spawn_bullet(uint x, uint y, uint p, vec4 position_direction, int bullet_type) { if((int(position_direction.x) == int(x)) && (int(position_direction.y) == int(y))){ - data_1[p] = 1; + data_1[p] = bullet_type; data_2[p] = int(position_direction.z); data_3[p] = int(position_direction.w); } @@ -75,9 +78,9 @@ float random(float seed) // Fonction de calcul du deplacement de la bullet -void compute_movement(uint x, uint y, uint p) +void compute_movement(uint x, uint y, uint p, int bullet_type) { - if(data_1[p] == 1){ + if(data_1[p] == bullet_type){ float random = random(float(int(x)*int(y)+2*step+current_pass)); if(random <= RND_MOVE){ @@ -93,7 +96,7 @@ void compute_movement(uint x, uint y, uint p) if((bx>0 && bx0 && by Date: Mon, 17 Mar 2025 11:48:07 +0100 Subject: [PATCH 7/8] =?UTF-8?q?Ajout=20des=20contr=C3=B4les?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 2 patterns en simultané - variation des paramètres individuels avec les clicks souris --- examples/shmup_pattern/shmup_pattern.cpp | 145 +++++++++++++++++++--- examples/shmup_pattern/shmup_pattern.tscn | 4 +- 2 files changed, 132 insertions(+), 17 deletions(-) diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index 3e06de6..b1d6ac5 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -1,30 +1,94 @@ #define RED 0xFF0000FF +#define PINK 0xFFFE25D5 #define GREEN 0xFF00FF00 #define BLUE 0xFFFF0000 +#define CYAN 0xFFF8F901 #define BLACK 0xFF000000 +#define GREY 0xFF2c2c2c // Generation de bullets #define PI 3.1415926 #define TWO_PI 2*PI #define SPAWN1 vec2(63,31) -#define SPAWN2 vec2(191,31) -#define RAD1 50 -#define RAD2 5 -#define NB_SPWN1 10 -#define NB_SPWN2 3 -#define OFFSET_ROTATION PI/4 +#define SPAWN2 vec2(191,63) #define SPEED 2.0 // Aleatoire pour le deplacement des bullets -#define RND_MOVE 0.9 +#define RND_MOVE 1.0 /* Layers : * data_0 : render * data_1 : position * data_2 : vector.x for movement (*1000) * data_3 : vector.y for movement (*1000) + * data_4 : parameters for pattern management */ + +void init_pattern_parameters() +{ + // Pattern manager + data_4[0] = 0; + data_4[1] = 4; + data_4[2] = 0; + + // Initial parameter values for patterns + // Pattern1 + data_4[0+WSX] = 0; + data_4[1+WSX] = 0; + data_4[2+WSX] = 0; + data_4[3+WSX] = 0; + // Pattern2 + data_4[4+WSX] = 0; + data_4[5+WSX] = 0; + data_4[6+WSX] = 0; + data_4[7+WSX] = 0; + + // Parameters values + // NB_SPAWN + data_4[0+WSX*2] = 0; + data_4[1+WSX*2] = 1; + data_4[2+WSX*2] = 2; + data_4[3+WSX*2] = 3; + data_4[4+WSX*2] = 4; + data_4[5+WSX*2] = 5; + data_4[6+WSX*2] = 6; + data_4[7+WSX*2] = 8; + data_4[8+WSX*2] = 12; + + // RADIUS + data_4[0+WSX*3] = 5; + data_4[1+WSX*3] = 10; + data_4[2+WSX*3] = 20; + data_4[3+WSX*3] = 30; + data_4[4+WSX*3] = 50; + + // INITIAL_OFFSET + data_4[0+WSX*4] = 0; + data_4[1+WSX*4] = 4; + data_4[2+WSX*4] = 6; + data_4[3+WSX*4] = 8; + + // DYNAMIC_OFFSET + data_4[0+WSX*5] = 0; + data_4[1+WSX*5] = 6; + data_4[2+WSX*5] = 8; + data_4[3+WSX*5] = 12; + data_4[4+WSX*5] = 24; + + // SIZE for parameter choices + data_4[0+WSX*6] = 9; + data_4[1+WSX*6] = 5; + data_4[2+WSX*6] = 4; + data_4[3+WSX*6] = 5; + + // Button management + data_4[0+WSX*7] = 0; + data_4[1+WSX*7] = 0; + data_4[2+WSX*7] = 0; +} + + // Fonction d'initialisation des points d'apparition des bullets // void init(uint p) @@ -32,14 +96,27 @@ void init(uint p) data_1[p] = 0; data_2[p] = 0; data_3[p] = 0; + + if(p == 0){ + init_pattern_parameters(); + } } -vec4 compute_spawn_position_angle(vec2 spawn, int nb, int nbRot, int rad, int nb_spwn) +vec4 compute_spawn_position_angle(vec2 spawn, int pat) { vec4 position_direction; + float initial_offset; + float dynamic_offset; + + int nb_spwn = data_4[data_4[(pat*4)+WSX]+WSX*2]; + int rad = data_4[data_4[(pat*4)+1+WSX]+WSX*(3)]; + initial_offset = (data_4[data_4[(pat*4)+2+WSX]+WSX*(4)] == 0 ? 0 : PI/data_4[data_4[(pat*4)+2+WSX]+WSX*(4)]); + dynamic_offset = (data_4[data_4[(pat*4)+3+WSX]+WSX*(5)] == 0 ? 0 : PI/data_4[data_4[(pat*4)+3+WSX]+WSX*(5)]); - position_direction.x = spawn.x + cos(nb * (TWO_PI/nb_spwn) + nbRot*OFFSET_ROTATION) * rad; - position_direction.y = spawn.y + sin(nb * (TWO_PI/nb_spwn) + nbRot*OFFSET_ROTATION) * rad; + int nb = step%nb_spwn; + + position_direction.x = spawn.x + cos(nb * (TWO_PI/nb_spwn) + initial_offset + step*dynamic_offset) * rad; + position_direction.y = spawn.y + sin(nb * (TWO_PI/nb_spwn) + initial_offset + step*dynamic_offset) * rad; position_direction.z = (position_direction.x - spawn.x)*1000; position_direction.w = (position_direction.y - spawn.y)*1000; @@ -124,9 +201,41 @@ void compute_global_movement(uint x, uint y, uint p) void render(uint x, uint y, uint p) { if(data_1[p] == 1) - data_0[p] = GREEN; + data_0[p] = CYAN; if(data_1[p] == 2) - data_0[p] = RED; + data_0[p] = PINK; +} + + +void click_manager() +{ + if(mouse_button == 1) + data_4[0+WSX*7] += 1; + if(mouse_button == 2) + data_4[1+WSX*7] += 1; + if(mouse_button == 4) + data_4[2+WSX*7] += 1; +} + +void control_management() +{ + if(data_4[2+WSX*7] != 0){ + data_4[2+WSX*7] = 0; + data_4[2] = (data_4[2]+1)%2; + } + + if(data_4[1+WSX*7] != 0){ + data_4[1+WSX*7] = 0; + int pat = data_4[2]; + data_4[pat] = (data_4[pat]+1)%4 + (pat*4); + } + + if(data_4[0+WSX*7] != 0){ + data_4[0+WSX*7] = 0; + int pat = data_4[2]; + int s = data_4[(data_4[pat]%4)+WSX*6]; + data_4[data_4[pat]+WSX] = (data_4[data_4[pat]+WSX]+1)%s; + } } @@ -136,7 +245,7 @@ void main() uint y = gl_GlobalInvocationID.y; uint p = x + y * WSX; - data_0[p] = BLACK; + data_0[p] = GREY; if(step == 0){ // Initialisation du point d'apparition des bullets @@ -144,8 +253,14 @@ void main() } else{ // Apparition des bullets - spawn_bullet(x,y,p,compute_spawn_position_angle(SPAWN1, step%NB_SPWN1, step, RAD1, NB_SPWN1), 1); - spawn_bullet(x,y,p,compute_spawn_position_angle(SPAWN2, step%NB_SPWN2, step, RAD2, NB_SPWN2), 2); + spawn_bullet(x,y,p,compute_spawn_position_angle(SPAWN1, 0), 1); + spawn_bullet(x,y,p,compute_spawn_position_angle(SPAWN2, 1), 2); + + // Check for interactions + click_manager(); + if(mouse_button == 0) + control_management(); + // Calcul du deplacement puis affichage du rendu if(step%2 == 0) compute_global_movement(x,y,p); diff --git a/examples/shmup_pattern/shmup_pattern.tscn b/examples/shmup_pattern/shmup_pattern.tscn index c97691e..e0a1b17 100644 --- a/examples/shmup_pattern/shmup_pattern.tscn +++ b/examples/shmup_pattern/shmup_pattern.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://dtbyjsudidrbf"] -[ext_resource type="Script" path="res://addons/compute_shader_studio/compute_shader_studio_2d.gd" id="1_xrsy7"] +[ext_resource type="Script" uid="uid://c8esqdv0y26yp" path="res://addons/compute_shader_studio/compute_shader_studio_2d.gd" id="1_xrsy7"] [ext_resource type="Texture2D" uid="uid://demftcowdd5c6" path="res://examples/icon.svg" id="2_i6ewd"] [node name="ShmupPattern" type="Node2D"] @@ -11,7 +11,7 @@ WSX = 256 WSY = 256 glsl_file = "res://examples/shmup_pattern/shmup_pattern.cpp" GLSL_code = "" -data = [NodePath("../Shader"), null, null, null] +data = [NodePath("../Shader"), null, null, null, null] [node name="Shader" type="Sprite2D" parent="."] position = Vector2(576, 324) From ce0acbdd381781accc3514399a693320a4bc95a9 Mon Sep 17 00:00:00 2001 From: Ewan Durand Date: Tue, 18 Mar 2025 11:53:09 +0100 Subject: [PATCH 8/8] Nettoyage du code + README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code commenté --- examples/shmup_pattern/README | 22 +++++ examples/shmup_pattern/shmup_pattern.cpp | 120 +++++++++++++++++------ 2 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 examples/shmup_pattern/README diff --git a/examples/shmup_pattern/README b/examples/shmup_pattern/README new file mode 100644 index 0000000..26af4aa --- /dev/null +++ b/examples/shmup_pattern/README @@ -0,0 +1,22 @@ +Created by Ewan Durand, 5 March 2025 + +Inspired by Shoot'em up games + +Generates patterns with variable parameters : + - Number of bullets (per generation) + - Radius of the circle around spawn point + - An initial offset angle + - A dynamic offset angle (increases for each bullet of the generation) + +Can handle 2 patterns at the same time spawning at SPAWN1 and SPAWN2 + +Pattern parameters : + - Number of bullets + - Circle radius + - Initial offset + - Dynamic offset + +Control management : + - Middle click (mouse_button = 4) : switch managed pattern (default : 0) + - Right click (mouse_button = 2) : switch managed parameter (default : 0) + - Left click (mouse_button = 1) : switch parameter's value (default : 0) \ No newline at end of file diff --git a/examples/shmup_pattern/shmup_pattern.cpp b/examples/shmup_pattern/shmup_pattern.cpp index b1d6ac5..3a4d122 100644 --- a/examples/shmup_pattern/shmup_pattern.cpp +++ b/examples/shmup_pattern/shmup_pattern.cpp @@ -1,3 +1,19 @@ +/* + * Created by Ewan Durand, 5 March 2025 + * + * Inspired by Shoot'em up games + * + * Generates patterns with variable parameters : + * - Number of bullets (per generation) + * - Radius of the circle around spawn point + * - An initial offset angle + * - A dynamic offset angle (increases for each bullet of the generation) + * + * Can handle 2 patterns at the same time spawning at SPAWN1 and SPAWN2 + * + */ + +// Colors #define RED 0xFF0000FF #define PINK 0xFFFE25D5 #define GREEN 0xFF00FF00 @@ -6,28 +22,36 @@ #define BLACK 0xFF000000 #define GREY 0xFF2c2c2c -// Generation de bullets +// Bullet generation const #define PI 3.1415926 #define TWO_PI 2*PI #define SPAWN1 vec2(63,31) #define SPAWN2 vec2(191,63) #define SPEED 2.0 -// Aleatoire pour le deplacement des bullets +// Target value for randomness (1.0 == no random) #define RND_MOVE 1.0 -/* Layers : - * data_0 : render - * data_1 : position - * data_2 : vector.x for movement (*1000) - * data_3 : vector.y for movement (*1000) +/* Layers used : + * data_0 : rendering + * data_1 : position (pre-rendering) + * data_2 : vector.x for movement *1000 (integer matrixes) + * data_3 : vector.y for movement *1000 (integer matrixes) * data_4 : parameters for pattern management */ - +/* + * Initialize parameters for both patterns + * Sets possible values for each parameters + * + */ void init_pattern_parameters() { - // Pattern manager + /* + * Pattern manager + * data_4[2] : which pattern is controled (0 or 1) + * + */ data_4[0] = 0; data_4[1] = 4; data_4[2] = 0; @@ -89,8 +113,10 @@ void init_pattern_parameters() } -// Fonction d'initialisation des points d'apparition des bullets -// +/* + * Initialize rendering window and pattern parameters + * + */ void init(uint p) { data_1[p] = 0; @@ -102,6 +128,16 @@ void init(uint p) } } +/* + * Compute spawn position and direction vector from spawn point and pattern id + * @param + * - vec2 spawn : spawn point (x, y) + * - int id : pattern id (first = 0, second = 1) + * + * @return + * - vec4 position_direction : position(v.x, v.y), direction(v.z, v.w) + * + */ vec4 compute_spawn_position_angle(vec2 spawn, int pat) { vec4 position_direction; @@ -124,8 +160,15 @@ vec4 compute_spawn_position_angle(vec2 spawn, int pat) return position_direction; } -void spawn_bullet(uint x, uint y, uint p, vec4 position_direction, int bullet_type) + +/* + * Spawns bullets using compute_spawn_position_angle + * + */ +void spawn_bullet(uint x, uint y, uint p, vec2 spawn, int id, int bullet_type) { + vec4 position_direction = compute_spawn_position_angle(spawn, id); + if((int(position_direction.x) == int(x)) && (int(position_direction.y) == int(y))){ data_1[p] = bullet_type; data_2[p] = int(position_direction.z); @@ -134,27 +177,20 @@ void spawn_bullet(uint x, uint y, uint p, vec4 position_direction, int bullet_ty } -float compute_seed() -{ - int mult = 1; - int tmp = 2*step+current_pass; - bool loop = true; - while(loop) - { - if(tmp == 0) loop = false; - mult *= 10; - tmp = tmp/10; - } - return step/mult; -} - +/* + * Generates pseudo-random number using sine and cosine functions + * + */ float random(float seed) { return fract(sin(seed)*2.85/cos(seed)*3.75); } -// Fonction de calcul du deplacement de la bullet +/* + * Computes bullet movement from position and direction + * + */ void compute_movement(uint x, uint y, uint p, int bullet_type) { if(data_1[p] == bullet_type){ @@ -192,21 +228,32 @@ void compute_movement(uint x, uint y, uint p, int bullet_type) } } +/* + * Calls compute_movement for each pattern + * + */ void compute_global_movement(uint x, uint y, uint p) { compute_movement(x,y,p,1); compute_movement(x,y,p,2); } +/* + * Renders on rendering layer using data from pre-rendering layer + * + */ void render(uint x, uint y, uint p) { if(data_1[p] == 1) data_0[p] = CYAN; if(data_1[p] == 2) - data_0[p] = PINK; + data_0[p] = GREEN; } - +/* + * Manages recorded clicks + * + */ void click_manager() { if(mouse_button == 1) @@ -217,6 +264,12 @@ void click_manager() data_4[2+WSX*7] += 1; } + +/* + * Performs action using managed clicks from click_manager + * Prevents from clicking multiple times if mouse button is held + * + */ void control_management() { if(data_4[2+WSX*7] != 0){ @@ -238,7 +291,10 @@ void control_management() } } - +/* + * Main loop + * + */ void main() { uint x = gl_GlobalInvocationID.x; @@ -253,8 +309,8 @@ void main() } else{ // Apparition des bullets - spawn_bullet(x,y,p,compute_spawn_position_angle(SPAWN1, 0), 1); - spawn_bullet(x,y,p,compute_spawn_position_angle(SPAWN2, 1), 2); + spawn_bullet(x,y,p, SPAWN1, 0, 1); + spawn_bullet(x,y,p, SPAWN2, 1, 2); // Check for interactions click_manager();