diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2016-05-02 08:49:54 -0400 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2016-05-02 08:49:54 -0400 |
commit | f102149e15ca1ac36cbb4e2627e5ce44f2d5273a (patch) | |
tree | fcf939ba1c26bd25c693ae7b05bd79c00ce2a691 | |
parent | 6a728a46d837384074228959d6330ba29e03aee0 (diff) | |
parent | 13cd55136ffd09afd9f4828a00716ed9f94f0e0b (diff) |
Merge branch 'master' of https://github.com/tcsullivan/gamedev
-rw-r--r-- | assets/door.png | bin | 252 -> 0 bytes | |||
-rw-r--r-- | assets/items/ITEM_SWORD.png | bin | 420 -> 0 bytes | |||
-rw-r--r-- | assets/style/classic/door.png | bin | 0 -> 289 bytes | |||
-rw-r--r-- | config/items.xml | 9 | ||||
-rw-r--r-- | include/entities.hpp | 6 | ||||
-rw-r--r-- | include/inventory.hpp | 23 | ||||
-rw-r--r-- | include/world.hpp | 2 | ||||
-rw-r--r-- | main.cpp | 1 | ||||
-rw-r--r-- | src/entities.cpp | 34 | ||||
-rw-r--r-- | src/inventory.cpp | 37 | ||||
-rw-r--r-- | src/items.cpp | 98 | ||||
-rw-r--r-- | src/mob.cpp | 2 | ||||
-rw-r--r-- | src/ui.cpp | 5 | ||||
-rw-r--r-- | src/world.cpp | 16 | ||||
-rw-r--r-- | xml/playerSpawnHill1.xml | 1 |
15 files changed, 206 insertions, 28 deletions
diff --git a/assets/door.png b/assets/door.png Binary files differdeleted file mode 100644 index 7db551d..0000000 --- a/assets/door.png +++ /dev/null diff --git a/assets/items/ITEM_SWORD.png b/assets/items/ITEM_SWORD.png Binary files differdeleted file mode 100644 index 306f58c..0000000 --- a/assets/items/ITEM_SWORD.png +++ /dev/null diff --git a/assets/style/classic/door.png b/assets/style/classic/door.png Binary files differnew file mode 100644 index 0000000..0142887 --- /dev/null +++ b/assets/style/classic/door.png diff --git a/config/items.xml b/config/items.xml index a70dd9a..0918c33 100644 --- a/config/items.xml +++ b/config/items.xml @@ -1,12 +1,17 @@ <?xml version="1.0"?> +<!-- CURRENCY --> <currency name="Abe Lincoln" value="1" sprite="assets/items/coin1.png"/> <currency name="George Washington" value="25" sprite="assets/items/coin2.png"/> <currency name="Barack Hussein Obama" value="100" sprite="assets/items/coin3.png"/> +<!-- OLD ITEMS --> <item name="Debug" type="Tool" value="10" maxStackSize="1" width="1" height="1" sprite="assets/items/ITEM_TEST.png" /> <item name="Dank MayMay" type="Tool" value="10" maxStackSize="420" width="10" height="10" sprite="assets/items/ITEM_TEST.png" /> <item name="Your Bag" type="Equip" value="32" maxStackSize="1" width="5" height="5" sprite="assets/items/ITEM_TEST.png" /> <item name="Flashlight" type="Tool" value="1" maxStackSize="1" width="4" height="8" sprite="assets/items/flashlight_off.png" /> -<item name="Wood Sword" type="Sword" value="69" maxStackSize="1" width="4" height="10" sprite="assets/items/SWORD_WOOD.png" /> -<item name="Fried Chicken" type="Cooked Food" value="10" maxStackSize="6" width="4" height="6" sprite="assets/items/FOOD_CHICKEN_FRIED.png" /> +<item name="Fried Chicken" type="Cooked Food" value="10" maxStackSize="6" sprite="assets/items/FOOD_CHICKEN_FRIED.png" /> + +<!-- NEW ITEMS --> +<item name="Wood Sword" type="Sword" damage="69" maxStackSize="1" sprite="assets/items/SWORD_WOOD.png" /> +<item name="Clyne is shit bow" type="Bow" damage="10" maxStackSize="1" sprite="assets/items/bow.png"/> diff --git a/include/entities.hpp b/include/entities.hpp index f8780df..5417dac 100644 --- a/include/entities.hpp +++ b/include/entities.hpp @@ -254,6 +254,12 @@ public: // causes the entity to take a player-inflicted hit void takeHit(unsigned int _health, unsigned int cooldown); + // returns the amount of cool down before next hit + unsigned int coolDown(); + + // set the cool down + void setCooldown(unsigned int c); + // handles hits if they've been taken void handleHits(void); diff --git a/include/inventory.hpp b/include/inventory.hpp index a41d4d4..bee2fbd 100644 --- a/include/inventory.hpp +++ b/include/inventory.hpp @@ -8,11 +8,17 @@ #define DEBUG +class Entity; + /** * The base item class * This stores the name, width, height, and texture(s) */ class Item { +private: + bool beingUsed; + + std::vector<Entity*> interact; public: // what we want to call each item std::string name; @@ -29,6 +35,16 @@ public: // how much the item is rotated in the hand float rotation = 0.0f; + // return if the item is currently in use + virtual bool inUse(); + + // set the state of the item + virtual void setUse(bool use); + + // add entities to the list of those being interacted + virtual void addInteract(Entity* e); + virtual void addInteract(std::vector<Entity*> e); + /** * The function we use to call the child classes ability * Note: Since this function is abstract, we HAVE to create one for each @@ -73,6 +89,8 @@ private: */ float damage; + Ray hitbox; + //can touch this public: /** @@ -82,6 +100,9 @@ public: //TODO move float getDamage(); + // set the damage of the sword + void setDamage(float d); + /** * handles the swinging of the sword */ @@ -187,6 +208,8 @@ public: ~Inventory(void); // Free's allocated memory int useCurrent(); + void currentAddInteract(Entity* e); + void currentAddInteract(std::vector<Entity*> e); int addItem(std::string name,uint count); int takeItem(std::string name,uint count); diff --git a/include/world.hpp b/include/world.hpp index 200b065..5d30161 100644 --- a/include/world.hpp +++ b/include/world.hpp @@ -189,6 +189,8 @@ public: // gets a pointer to the most recently added mob Mob *getLastMob(void); + std::vector<Entity*> getMobs(void); + // gets the nearest interactable entity to the given one Entity *getNearInteractable(Entity &e); @@ -290,6 +290,7 @@ void mainLoop(void){ fps = 1000 / game::time::getDeltaTime(); debugY = player->loc.y; } + SDL_Delay(1); } SDL_Delay(1); diff --git a/src/entities.cpp b/src/entities.cpp index d5d9af2..58c1651 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -111,18 +111,38 @@ void Entity::spawn(float x, float y) void Entity::takeHit(unsigned int _health, unsigned int cooldown) { - // modify variables - health = fmax(health - _health, 0); - forcedMove = true; - hitCooldown = cooldown; + if (hitCooldown <= 1) { + // modify variables + health = fmax(health - _health, 0); + forcedMove = true; + hitCooldown = cooldown; + + // pushback + vel.x = player->left ? -0.5f : 0.5f; + vel.y = 0.2f; + } +} + +unsigned int Entity::coolDown() +{ + return hitCooldown; +} - // pushback - vel.x = player->left ? -0.5f : 0.5f; - vel.y = 0.2f; +void Entity::setCooldown(unsigned int c) +{ + hitCooldown = c; } + + void Entity::handleHits(void) { + int c = hitCooldown - game::time::getDeltaTime(); + if (c >= 0) + hitCooldown = c; + else + hitCooldown = 0; + if (!forcedMove) return; diff --git a/src/inventory.cpp b/src/inventory.cpp index 83c1f0a..b617d09 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -41,6 +41,8 @@ void items(void) XMLElement *exml = xml.FirstChildElement("item"); XMLElement *cxml = xml.FirstChildElement("currency"); + Sword *tmpSword = new Sword(); + while (cxml) { // NEWEWEWEWEWEWEWEW @@ -60,7 +62,8 @@ void items(void) // if the type is a sword } else if (strCaseCmp(name, "sword")) { - ItemMap.push_back(new Sword()); + tmpSword->setDamage(exml->FloatAttribute("damage")); + ItemMap.push_back(tmpSword->clone()); // if the type is a bow } else if (strCaseCmp(name, "bow")) { @@ -68,7 +71,7 @@ void items(void) ItemMap.push_back(new Bow()); // uncooked / raw food - } else if (strCaseCmp(name, "rawfood")) { + } else if (strCaseCmp(name, "raw food")) { ItemMap.push_back(new RawFood()); @@ -103,7 +106,7 @@ void items(void) int Inventory::addItem(std::string name, uint count) { - std::cout << "Adding: " << count << name << "\'s" << std::endl; + std::cout << "Adding: " << count << " " << name << std::endl; for (uint i = 0; i < ItemMap.size(); i++) { if (strCaseCmp(ItemMap[i]->name, name)) { for (auto &it : Items) { @@ -587,14 +590,20 @@ void Inventory::draw(void) { void itemDraw(Player *p, Item *d) { itemLoc.y = p->loc.y+(p->height/3); - itemLoc.x = p->left?p->loc.x:p->loc.x+p->width; + itemLoc.x = p->left?p->loc.x-d->dim.x/2:p->loc.x+p->width-d->dim.x/2; glPushMatrix(); glUseProgram(shaderProgram); glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); - glTranslatef(itemLoc.x,itemLoc.y,0); - glRotatef(d->rotation, 0.0f, 0.0f, 1.0f); - glTranslatef(-itemLoc.x,-itemLoc.y,0); + if (p->left) { + glTranslatef(itemLoc.x+d->dim.x/2,itemLoc.y,0); + glRotatef(d->rotation, 0.0f, 0.0f, 1.0f); + glTranslatef(-itemLoc.x-d->dim.x/2,-itemLoc.y,0); + } else { + glTranslatef(itemLoc.x+d->dim.x/2,itemLoc.y,0); + glRotatef(d->rotation, 0.0f, 0.0f, 1.0f); + glTranslatef(-itemLoc.x-d->dim.x/2,-itemLoc.y,0); + } glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,d->tex->image[0]); glColor4ub(255,255,255,255); @@ -620,11 +629,23 @@ int Inventory::useItem(void) int Inventory::useCurrent() { - if(Items[sel].second) + if (Items[sel].second) return Items[sel].first->useItem(); return -1; } +void Inventory::currentAddInteract(Entity* e) +{ + if (Items[sel].second) + Items[sel].first->addInteract(e); +} + +void Inventory::currentAddInteract(std::vector<Entity*> e) +{ + if (Items[sel].second) + Items[sel].first->addInteract(e); +} + bool Inventory::detectCollision(vec2 one, vec2 two) { (void)one; (void)two; diff --git a/src/items.cpp b/src/items.cpp index 403c49e..f88186a 100644 --- a/src/items.cpp +++ b/src/items.cpp @@ -18,11 +18,68 @@ int BaseItem::useItem() int Sword::useItem() { - std::cout << "Swing!" << std::endl; - if (player->left) - rotation += 10.0f; - else - rotation -= 10.0f; + if (inUse()) + return -1; + + std::thread([this]{ + setUse(true); + volatile bool swing = true; + bool back = false; + float coef = 0.0f; + + while (swing) { + + // handle swinging + if (!back) + coef += .8f; + else + coef -= .4f; + + if (player->left) + rotation = coef; + else + rotation = -coef; + + if (coef > 80 && !back) + back = true; + + if (coef <= 0 && back) { + swing = false; + coef = 0.0f; + rotation = 0.0f; + } + + if (!back) { + // handle collision with interaction + hitbox.start.y = player->loc.y+(player->height/3); + hitbox.start.x = player->left ? player->loc.x : player->loc.x + player->width; + + for (auto &e : interact) { + float dist = 0.0f; + while (dist < dim.y) { + hitbox.end = hitbox.start; + hitbox.end.x += dist * cos(rotation*PI/180); + hitbox.end.y += dist * sin(rotation*PI/180); + + if (hitbox.end.x > e->loc.x && hitbox.end.x < e->loc.x + e->width) { + if (hitbox.end.y > e->loc.y && hitbox.end.y < e->loc.y + e->height) { + e->takeHit(damage, 600); + } + } + + dist += HLINES(1); + } + } + } + + // add a slight delay + SDL_Delay(1); + } + for (auto &e : interact) + e->setCooldown(0); + setUse(false); + }).detach(); + return 0; } @@ -81,9 +138,26 @@ RawFood* RawFood::clone() * ITEM * **************************************************/ -Item::~Item() +bool Item::inUse() { - delete tex; + return beingUsed; +} + +void Item::setUse(bool use) +{ + beingUsed = use; +} + +void Item::addInteract(Entity* e) +{ + interact.push_back(e); +} + +void Item::addInteract(std::vector<Entity*> e) +{ + for (auto &v : e) { + interact.push_back(v); + } } GLuint Item::rtex() @@ -96,6 +170,11 @@ GLuint Item::rtex(int n) return tex->image[n]; } +Item::~Item() +{ + delete tex; +} + /************************************************** * SWORD * **************************************************/ @@ -105,6 +184,11 @@ float Sword::getDamage() return damage; } +void Sword::setDamage(float d) +{ + damage = d; +} + /************************************************** * BOW * **************************************************/ diff --git a/src/mob.cpp b/src/mob.cpp index a9015f9..1829240 100644 --- a/src/mob.cpp +++ b/src/mob.cpp @@ -58,7 +58,7 @@ Door::Door(void) : Mob() maxHealth = health = 50; width = HLINES(12); height = HLINES(20); - tex = TextureIterator({"assets/door.png"}); + tex = TextureIterator({"assets/style/classic/door.png"}); } void Door::act(void) @@ -964,8 +964,11 @@ EXIT: dialogAdvance(); } else { // left click uses item - if (e.button.button & SDL_BUTTON_LEFT) + if (e.button.button & SDL_BUTTON_LEFT) { + player->inv->currentAddInteract(currentWorld->getMobs()); player->inv->useCurrent(); + } + } if(mouse.x > player->loc.x && mouse.x < player->loc.x + player->width && diff --git a/src/world.cpp b/src/world.cpp index 477432c..223a8bc 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -636,11 +636,13 @@ detect(Player *p) int l; // handle the player - std::thread(&World::singleDetect, this, p).detach(); + singleDetect(p); + //std::thread(&World::singleDetect, this, p).detach(); // handle other entities for (auto &e : entity) - std::thread(&World::singleDetect, this, e).detach(); + singleDetect(e); + //std::thread(&World::singleDetect, this, e).detach(); // handle particles for (auto &part : particles) { @@ -791,6 +793,16 @@ getLastMob(void) return mob.back(); } +std::vector<Entity*> World:: +getMobs(void) +{ + std::vector<Entity*> meme; + for (auto &m : mob) { + meme.push_back(m); + } + return meme; +} + /** * Get the interactable entity that is closest to the entity provided. */ diff --git a/xml/playerSpawnHill1.xml b/xml/playerSpawnHill1.xml index 785758d..aa0a36c 100644 --- a/xml/playerSpawnHill1.xml +++ b/xml/playerSpawnHill1.xml @@ -79,6 +79,7 @@ And it wasn't stormy. <text id="0" pause="true"> Here have this sword! <give id="Wood Sword" count="1"/> + <give id="Clyne is shit bow" count="1"/> <give id="Fried Chicken" count="1"/> </text> </Dialog> |