From 9cef5e64ddd1ef20369b25cc19b1980084ebaefe Mon Sep 17 00:00:00 2001 From: Andy Belle-Isle Date: Mon, 7 Oct 2019 15:06:24 -0400 Subject: Added image based hitbox detection --- Assets/world/world1/layers/0/hitbox.png | Bin 3972 -> 4795 bytes Assets/world/world1/layers/0/texture.png | Bin 4573 -> 6142 bytes Scripts/init.lua | 2 +- src/world.cpp | 5 +++-- src/world.hpp | 14 +++++++------- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Assets/world/world1/layers/0/hitbox.png b/Assets/world/world1/layers/0/hitbox.png index 0a9a37e..881b13e 100644 Binary files a/Assets/world/world1/layers/0/hitbox.png and b/Assets/world/world1/layers/0/hitbox.png differ diff --git a/Assets/world/world1/layers/0/texture.png b/Assets/world/world1/layers/0/texture.png index 149273f..429107e 100644 Binary files a/Assets/world/world1/layers/0/texture.png and b/Assets/world/world1/layers/0/texture.png differ diff --git a/Scripts/init.lua b/Scripts/init.lua index ec9e350..1693d0c 100644 --- a/Scripts/init.lua +++ b/Scripts/init.lua @@ -86,7 +86,7 @@ ball = { dofile("Scripts/world.lua") playerSpawn = game.spawn(player); -game.spawn(ball); +--game.spawn(ball); ------------------- -- SERIALIZING -- diff --git a/src/world.cpp b/src/world.cpp index 8c15ccc..a3923fa 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -128,11 +128,12 @@ double World::getHeight(double x, double y, double z) int h = 0.0; for (auto b : l.hitbox[wx]) { - if (b) + if (b == true) Y = h; h++; } - return Y; + std::cout << l.drawLayer << "," << wx << "," << Y << std::endl; + return (Y/unitSize); } } return 0; diff --git a/src/world.hpp b/src/world.hpp index fe4e400..6776e2c 100644 --- a/src/world.hpp +++ b/src/world.hpp @@ -88,22 +88,22 @@ private: public: SolidLayer(float z, sol::table tab) : Layer(z, tab) { if (tab["hitbox"] != nullptr) { - int width, height; + int width, height, channels; unsigned char* box = SOIL_load_image(std::string(tab["hitbox"]).c_str(), - &width, &height, 0, + &width, &height, &channels, SOIL_LOAD_RGBA); - for (int w = 0; w < width; w++) { + for (int w = 0; w < width*4; w+=4) { hitbox.push_back(std::vector(height)); for (int h = 0; h < height; h++) { - unsigned char* c = &box[(h) + (height*w*4)]; - // we want to read the red channel + unsigned char* c = &box[(w) + (width*h*4)]; + // we want to read the alpha if (c[3]) { - hitbox[w][h] = true; + hitbox[w/4][height-h] = true; } else - hitbox[w][h] = false; + hitbox[w/4][height-h] = false; } } -- cgit v1.2.3