From f5997f5e2f8fc29140bb045f915b1f15976ffafe Mon Sep 17 00:00:00 2001 From: mvladimirovich Date: Thu, 29 Dec 2016 16:03:56 +0700 Subject: [PATCH 1/5] [invaders] - first try of developing game on CPP. Maybe will grow to something bigger. --- ckb.pro | 1 + src/ckb-invaders/ckb-invaders.pro | 18 ++++ src/ckb-invaders/main.c | 149 ++++++++++++++++++++++++++++++ 3 files changed, 168 insertions(+) create mode 100644 src/ckb-invaders/ckb-invaders.pro create mode 100644 src/ckb-invaders/main.c diff --git a/ckb.pro b/ckb.pro index f5adb0d..bda7149 100644 --- a/ckb.pro +++ b/ckb.pro @@ -6,6 +6,7 @@ SUBDIRS = \ src/ckb-ripple \ src/ckb-wave \ src/ckb-gradient \ + src/ckb-invaders \ src/ckb-pinwheel \ src/ckb-random \ src/ckb-rain diff --git a/src/ckb-invaders/ckb-invaders.pro b/src/ckb-invaders/ckb-invaders.pro new file mode 100644 index 0000000..76e263d --- /dev/null +++ b/src/ckb-invaders/ckb-invaders.pro @@ -0,0 +1,18 @@ +TEMPLATE = app +TARGET = ckb-invaders + +QMAKE_CFLAGS += -std=c99 +QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 + +macx { + DESTDIR = $$PWD/../../ckb.app/Contents/Resources/ckb-animations +} else { + DESTDIR = $$PWD/../../bin/ckb-animations +} + +CONFIG = +QT = +LIBS = + +SOURCES += \ + main.c diff --git a/src/ckb-invaders/main.c b/src/ckb-invaders/main.c new file mode 100644 index 0000000..0946c21 --- /dev/null +++ b/src/ckb-invaders/main.c @@ -0,0 +1,149 @@ +#include "../ckb/ckb-anim.h" +#include +#include + +void ckb_info(){ + // Plugin info + CKB_NAME("Invaders"); + CKB_VERSION("0.1"); + CKB_COPYRIGHT("2017", "Maksim Vladimirovich "); + CKB_LICENSE("GPLv3"); + CKB_GUID("{54DD2975-E192-457D-BCFC-D912A24E33B9}"); + CKB_DESCRIPTION("Space invaders - like game"); + + // Effect parameters + CKB_PARAM_AGRADIENT("color", "Color:", "", "ffffffff"); + CKB_PARAM_BOOL("kphold", "Freeze until key is released", TRUE); + + // Timing/input parameters + CKB_KPMODE(CKB_KP_NAME); + CKB_TIMEMODE(CKB_TIME_DURATION); + CKB_LIVEPARAMS(TRUE); + + // Presets + CKB_PRESET_START("Test settings"); + CKB_PRESET_PARAM("color", "ff000000"); + CKB_PRESET_PARAM("duration", "0.1"); + CKB_PRESET_PARAM("stop", "0"); + CKB_PRESET_PARAM("kpstop", "0"); + CKB_PRESET_END; +} + +ckb_gradient animcolor = { 0 }; +int kphold = 0, kprelease = 0; + +int bullet_row = 1; +float bullet_position = 0; +int enemy_row = 1; +float enemy_position = 12; +int fire = 1; + +char* row1[14] = { "grave", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "back" }; +char* row2[14] = { "tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\" }; +char* row3[14] = { "caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", ";", "'", "enter" }; +char* row4[13] = { "lshift", "z", "x", "c", "v", "b", "n", "m", ",", ".", ".", "/", "rshift" }; + +void ckb_init(ckb_runctx* context){ + srand(time(NULL)); +} + +void ckb_parameter(ckb_runctx* context, const char* name, const char* value){ + CKB_PARSE_AGRADIENT("color", &animcolor){} + CKB_PARSE_BOOL("kphold", &kphold){} + CKB_PARSE_BOOL("kprelease", &kprelease){} +} + +void ckb_keypress(ckb_runctx* context, ckb_key* key, int x, int y, int state){ + // Start or stop animation on key + char* keyname = key->name; + if(fire == 0) { + if (strcmp(keyname, row1[0]) == 0) { + fire = 1; + bullet_row = 1; + } + if (strcmp(keyname, row2[0]) == 0) { + fire = 1; + bullet_row = 2; + } + if (strcmp(keyname, row3[0]) == 0) { + fire = 1; + bullet_row = 3; + } + } +} + +void ckb_start(ckb_runctx* context, int state) { +} + +char* get_bullet_key_name() { + int bp = round(bullet_position); + if(bullet_row == 1) { + return row1[bp]; + } else if (bullet_row == 2) { + return row2[bp]; + } else if (bullet_row == 3) { + return row3[bp]; + } + return "esc"; +} + +char* get_enemy_key_name() { + int ep = round(enemy_position); + if(enemy_row == 1) { + return row1[ep]; + } else if (enemy_row == 2) { + return row2[ep]; + } else if (enemy_row == 3) { + return row3[ep]; + } + return "esc"; +} + +void explode_enemy(){ + enemy_position = 12; + bullet_position = 0; + fire = 0; + enemy_row = rand() % 3 + 1; +} + +void ckb_time(ckb_runctx* context, double delta){ + if(fire == 1) { + bullet_position += 0.08; + } + if(bullet_position > 12) { + fire = 0; + bullet_position = 0; + } + enemy_position -= 0.04; + if(enemy_position == 0 + || round(enemy_position) == round(bullet_position) && bullet_row == enemy_row) { + explode_enemy(); + } + unsigned count = context->keycount; + for(unsigned i = 0; i < count; i++){ + ckb_key* key = context->keys + i; + char* key_name = key->name; + char* bullet_key_name = get_bullet_key_name(); + char* enemy_key_name = get_enemy_key_name(); + key->a = 255; + if (strcmp(key_name, bullet_key_name) == 0 && fire == 1) { + key->r = 0; + key->g = 255; + key->b = 0; + } else if (strcmp(key_name, enemy_key_name) == 0) { + key->r = 255; + key->g = 0; + key->b = 0; + } else { + key->r = 0; + key->g = 0; + key->b = 0; + } + } +} + +int ckb_frame(ckb_runctx* context){ + // Draw key colors + unsigned count = context->keycount; + return 0; +} From f547dad1d9d88b5996772ddfb4ce82a9f5bad42b Mon Sep 17 00:00:00 2001 From: mvladimirovich Date: Thu, 29 Dec 2016 17:45:18 +0700 Subject: [PATCH 2/5] [invaders] - added fourth line, speedup --- src/ckb-invaders/main.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/ckb-invaders/main.c b/src/ckb-invaders/main.c index 0946c21..a6331d6 100644 --- a/src/ckb-invaders/main.c +++ b/src/ckb-invaders/main.c @@ -36,12 +36,12 @@ int bullet_row = 1; float bullet_position = 0; int enemy_row = 1; float enemy_position = 12; -int fire = 1; +int fire = 0; -char* row1[14] = { "grave", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "back" }; -char* row2[14] = { "tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\" }; -char* row3[14] = { "caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", ";", "'", "enter" }; -char* row4[13] = { "lshift", "z", "x", "c", "v", "b", "n", "m", ",", ".", ".", "/", "rshift" }; +char* row1[14] = { "grave", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "minus", "equal", "back" }; +char* row2[14] = { "tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "lbrace", "rbrace", "bslash" }; +char* row3[13] = { "caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "colon", "quote", "enter" }; +char* row4[12] = { "lshift", "z", "x", "c", "v", "b", "n", "m", "comma", "dot", "slash", "rshift" }; void ckb_init(ckb_runctx* context){ srand(time(NULL)); @@ -56,6 +56,11 @@ void ckb_parameter(ckb_runctx* context, const char* name, const char* value){ void ckb_keypress(ckb_runctx* context, ckb_key* key, int x, int y, int state){ // Start or stop animation on key char* keyname = key->name; + + if(strcmp(keyname, "esc") == 0) { + restart(); + } + if(fire == 0) { if (strcmp(keyname, row1[0]) == 0) { fire = 1; @@ -69,6 +74,10 @@ void ckb_keypress(ckb_runctx* context, ckb_key* key, int x, int y, int state){ fire = 1; bullet_row = 3; } + if (strcmp(keyname, row4[0]) == 0) { + fire = 1; + bullet_row = 4; + } } } @@ -83,6 +92,8 @@ char* get_bullet_key_name() { return row2[bp]; } else if (bullet_row == 3) { return row3[bp]; + } else if (bullet_row == 4) { + return row4[bp]; } return "esc"; } @@ -95,26 +106,36 @@ char* get_enemy_key_name() { return row2[ep]; } else if (enemy_row == 3) { return row3[ep]; + } else if (enemy_row == 4) { + return row4[ep]; } return "esc"; } +void restart() { + enemy_row = 1; + bullet_row = 1; + fire = 0; + enemy_position = 12; + bullet_position = 0; +} + void explode_enemy(){ + enemy_row = rand() % 4 + 1; enemy_position = 12; bullet_position = 0; fire = 0; - enemy_row = rand() % 3 + 1; } void ckb_time(ckb_runctx* context, double delta){ if(fire == 1) { - bullet_position += 0.08; + bullet_position += 0.4; } if(bullet_position > 12) { fire = 0; bullet_position = 0; } - enemy_position -= 0.04; + enemy_position -= 0.08; if(enemy_position == 0 || round(enemy_position) == round(bullet_position) && bullet_row == enemy_row) { explode_enemy(); From 29f55a3482d83a3502ebfcb55be02525a5ec0b17 Mon Sep 17 00:00:00 2001 From: mvladimirovich Date: Thu, 29 Dec 2016 18:36:23 +0700 Subject: [PATCH 3/5] [invaders] - adjusted difficult --- src/ckb-invaders/main.c | 103 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/src/ckb-invaders/main.c b/src/ckb-invaders/main.c index a6331d6..b205967 100644 --- a/src/ckb-invaders/main.c +++ b/src/ckb-invaders/main.c @@ -37,12 +37,16 @@ float bullet_position = 0; int enemy_row = 1; float enemy_position = 12; int fire = 0; +int enemies = 0; +int level = 0; char* row1[14] = { "grave", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "minus", "equal", "back" }; char* row2[14] = { "tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "lbrace", "rbrace", "bslash" }; char* row3[13] = { "caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "colon", "quote", "enter" }; char* row4[12] = { "lshift", "z", "x", "c", "v", "b", "n", "m", "comma", "dot", "slash", "rshift" }; +char* levels[12] = {"f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12" }; + void ckb_init(ckb_runctx* context){ srand(time(NULL)); } @@ -127,18 +131,108 @@ void explode_enemy(){ fire = 0; } +void game_over(){ + +} + +void draw_level(ckb_runctx* context, int level) { + unsigned count = context->keycount; + for (unsigned i = 0; i < count; i++) { + ckb_key *key = context->keys + i; + char *key_name = key->name; + if (strcmp(key_name, "f1") == 0 && level > 0) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f2") == 0 && level > 1) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f3") == 0 && level > 2) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f4") == 0 && level > 3) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f5") == 0 && level > 4) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f6") == 0 && level > 5) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f7") == 0 && level > 6) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f8") == 0 && level > 7) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f9") == 0 && level > 8) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f10") == 0 && level > 9) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f11") == 0 && level > 10) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + if (strcmp(key_name, "f12") == 0 && level > 11) { + key->a = 255; + key->r = 0; + key->g = 0; + key->b = 255; + } + } +} + void ckb_time(ckb_runctx* context, double delta){ if(fire == 1) { - bullet_position += 0.4; + bullet_position += (0.4 + level * 0.02); } if(bullet_position > 12) { fire = 0; bullet_position = 0; } - enemy_position -= 0.08; - if(enemy_position == 0 - || round(enemy_position) == round(bullet_position) && bullet_row == enemy_row) { + enemy_position -= (0.08 + level * 0.02); + if(enemy_position == 0) { + game_over(); + } else if (round(enemy_position) == round(bullet_position) && bullet_row == enemy_row) { explode_enemy(); + enemies++; + if(enemies > 8) { + level++; + enemies = 0; + } } unsigned count = context->keycount; for(unsigned i = 0; i < count; i++){ @@ -161,6 +255,7 @@ void ckb_time(ckb_runctx* context, double delta){ key->b = 0; } } + draw_level(context, level); } int ckb_frame(ckb_runctx* context){ From 5e2450429a6fb9ff6e87f9dd4cbc0c70bb5e98b4 Mon Sep 17 00:00:00 2001 From: mvladimirovich Date: Fri, 30 Dec 2016 09:51:40 +0700 Subject: [PATCH 4/5] [invaders] - add light for control buttons --- src/ckb-invaders/main.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/ckb-invaders/main.c b/src/ckb-invaders/main.c index b205967..04567af 100644 --- a/src/ckb-invaders/main.c +++ b/src/ckb-invaders/main.c @@ -241,7 +241,27 @@ void ckb_time(ckb_runctx* context, double delta){ char* bullet_key_name = get_bullet_key_name(); char* enemy_key_name = get_enemy_key_name(); key->a = 255; - if (strcmp(key_name, bullet_key_name) == 0 && fire == 1) { + if (strcmp(key_name, row1[0]) == 0) { + key->r = 255; + key->g = 255; + key->b = 255; + } else if (strcmp(key_name, row2[0]) == 0) { + key->r = 255; + key->g = 255; + key->b = 255; + } else if (strcmp(key_name, row3[0]) == 0) { + key->r = 255; + key->g = 255; + key->b = 255; + } else if (strcmp(key_name, row4[0]) == 0) { + key->r = 255; + key->g = 255; + key->b = 255; + } else if (strcmp(key_name, "scroll") == 0) { + key->r = 255; + key->g = 0; + key->b = 255; + } else if (strcmp(key_name, bullet_key_name) == 0 && fire == 1) { key->r = 0; key->g = 255; key->b = 0; From 3f154d215f427ac02cf4750cb05c82a8142ef932 Mon Sep 17 00:00:00 2001 From: mvladimirovich Date: Fri, 30 Dec 2016 11:23:37 +0700 Subject: [PATCH 5/5] [invaders] - fixed settings name --- src/ckb-invaders/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ckb-invaders/main.c b/src/ckb-invaders/main.c index 04567af..89a516e 100644 --- a/src/ckb-invaders/main.c +++ b/src/ckb-invaders/main.c @@ -21,7 +21,7 @@ void ckb_info(){ CKB_LIVEPARAMS(TRUE); // Presets - CKB_PRESET_START("Test settings"); + CKB_PRESET_START("Default Settings"); CKB_PRESET_PARAM("color", "ff000000"); CKB_PRESET_PARAM("duration", "0.1"); CKB_PRESET_PARAM("stop", "0"); @@ -29,7 +29,6 @@ void ckb_info(){ CKB_PRESET_END; } -ckb_gradient animcolor = { 0 }; int kphold = 0, kprelease = 0; int bullet_row = 1; @@ -52,7 +51,6 @@ void ckb_init(ckb_runctx* context){ } void ckb_parameter(ckb_runctx* context, const char* name, const char* value){ - CKB_PARSE_AGRADIENT("color", &animcolor){} CKB_PARSE_BOOL("kphold", &kphold){} CKB_PARSE_BOOL("kprelease", &kprelease){} }