]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
Added particles
authordrumsetmonkey <abelleisle@roadrunner.com>
Mon, 14 Dec 2015 13:25:15 +0000 (08:25 -0500)
committerdrumsetmonkey <abelleisle@roadrunner.com>
Mon, 14 Dec 2015 13:25:15 +0000 (08:25 -0500)
assets/fountain1.png [new file with mode: 0644]
assets/house2.png [new file with mode: 0644]
include/entities.h
include/world.h
main.cpp
src/entities.cpp
src/gameplay.cpp
src/inventory.cpp
src/ui.cpp
src/world.cpp

diff --git a/assets/fountain1.png b/assets/fountain1.png
new file mode 100644 (file)
index 0000000..46f7c44
Binary files /dev/null and b/assets/fountain1.png differ
diff --git a/assets/house2.png b/assets/house2.png
new file mode 100644 (file)
index 0000000..7404cd9
Binary files /dev/null and b/assets/house2.png differ
index e0c08873cfd12dbfef0dc87303f94750d0aafe3c..dbaf9f56579cc54eda27d4eb87be5669262e0e75 100644 (file)
@@ -34,22 +34,48 @@ enum MOB_SUB {
        MS_TRIGGER
 };
 
-struct Particles{
+enum BUILD_SUB{
+       TOWN_HALL = 1,
+       HOUSE,
+       HOUSE2,
+       HOUSE3,
+       HOUSE4,
+       FOUNTAIN
+};
+
+class Particles{
+public:
        vec2 loc;
        float width;
        float height;
+       float velx;
+       float vely;
        Color color;
-       Particles(float x, float y, float w, float h, Color c){
+       int duration;
+       bool canMove;
+       Particles(float x, float y, float w, float h, float vx, float vy, Color c, int d){
                loc.x = (x);
                loc.y = (y);
                width = (w);
                height = (h);
+               velx = vx;
+               vely = vy;
                color.red = (c.red);
                color.green = (c.green);
                color.blue = (c.blue);
+               duration = d;
        }
+       ~Particles(){}
        void draw(){
-               std::cout << "Drawing Particles\n";
+               glColor3f(color.red,color.green,color.blue);
+               glRectf(loc.x,loc.y,loc.x+width,loc.y+height);
+       }
+       bool kill(float delta){
+               duration -= delta;
+               if(duration <= 0){
+                       return true;
+               }
+               else return false;
        }
 };
 
@@ -77,6 +103,7 @@ public:
        bool canMove;                   // Enables movement
        bool right,left;                // Direction faced by Entity
        bool alive;
+       bool hit;
        unsigned char ground;   // Shows how the Entity is grounded (if it is)
 
        /*
@@ -137,11 +164,12 @@ class Structures : public Entity{
 public:
        void *inWorld;
        void *inside;
+       BUILD_SUB bsubtype;
        
        Structures();
        ~Structures();
        
-       unsigned int spawn(_TYPE, float, float);
+       unsigned int spawn(_TYPE, BUILD_SUB, float, float);
 };
 
 class Mob : public Entity{
index 5a1627738b54d328bb1b4f1e5c938de8112ae922..dbaaf2c6e8323005a256c413588679502da3b6f8 100644 (file)
@@ -161,12 +161,13 @@ public:
        std::vector<Object              *>      object;
        std::vector<Particles   *>      particles;
        
-       void addStructure(_TYPE t,float x,float y,World *outside,World *inside);
+       void addStructure(_TYPE t,BUILD_SUB sub,float x,float y,World *outside,World *inside);
+       void addVillage(int bCount, int npcMin, int npcMax,_TYPE t,float x,float y,World *outside,World *inside);
        void addMob(int t,float x,float y);
        void addMob(int t,float x,float y,void (*hey)(Mob *));
        void addNPC(float x,float y);
        void addObject(ITEM_ID, bool, const char *, float, float);
-       void addParticle(float x, float y, float w, float h, Color color);
+       void addParticle(float, float, float, float, float, float, Color color, int);
        
        void update(Player *p,unsigned int delta);
        
index 931f6882b3dc72246f0e447e7024cf93b256b442..50f5c7529cdb7d123e1667cbba023fd3a06ee71b 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -838,10 +838,16 @@ void logic(){
                        */
 
                        if(n->canMove) n->wander((rand() % 120 + 30));
-
-                       if(player->inv->usingi && player->inv->detectCollision(vec2{n->loc.x, n->loc.y},vec2{n->loc.x+n->width,n->loc.y+n->height})){
+                       if(!player->inv->usingi) n->hit = false;
+                       if(player->inv->usingi && !n->hit && player->inv->detectCollision(vec2{n->loc.x, n->loc.y},vec2{n->loc.x+n->width,n->loc.y+n->height})){
                                n->health -= 25;
-                               currentWorld->addParticle(n->loc.x, n->loc.y, HLINE*3, HLINE*3, {255,0,0});
+                               n->hit = true;
+                               for(int r = 0; r < (rand()%5);r++)
+                                       currentWorld->addParticle(rand()%HLINE*3 + n->loc.x - .05f,n->loc.y + n->height*.5, HLINE,HLINE, -(rand()%10)*.01,((rand()%4)*.001-.002), {(rand()%75+10)/100.0f,0,0}, 10000);
+                               if(n->health <= 0){
+                                       for(int r = 0; r < (rand()%30)+15;r++)
+                                               currentWorld->addParticle(rand()%HLINE*3 + n->loc.x - .05f,n->loc.y + n->height*.5, HLINE,HLINE, -(rand()%10)*.01,((rand()%10)*.01-.05), {(rand()%75)+10/100.0f,0,0}, 10000);
+                               }
                        }
                        /*
                         *      Don't bother handling the NPC if another has already been handled.
@@ -866,9 +872,7 @@ void logic(){
                                 *      considered legal. In other words, require the player to be close to
                                 *      the NPC in order to interact with it.
                                 *
-                                *      This uses the Pythagorean theorem to check for NPCs within a certain
-                                *      radius (40 HLINEs) of the player's coordinates.
-                                *
+                                *      This uses the Pythagorean theorem to check for NPCs within a certain                     *
                                */
 
                                if(pow((n->loc.x - player->loc.x),2) + pow((n->loc.y - player->loc.y),2) <= pow(40*HLINE,2)){
@@ -928,7 +932,7 @@ void logic(){
                                if(ui::mouse.x >= o->loc.x                              &&
                                   ui::mouse.x <= o->loc.x + o->width   &&
                                   ui::mouse.y >= o->loc.y                              &&
-                                  ui::mouse.y <= o->loc.y + o->width   ){
+                                  ui::mouse.y <= o->loc.y + o->height  ){
                                        if(pow((o->loc.x - player->loc.x),2) + pow((o->loc.y - player->loc.y),2) <= pow(40*HLINE,2)){
 
                                                /*
@@ -948,6 +952,12 @@ void logic(){
                        }
                }
        }
+       for(auto &b : currentWorld->build){
+               if(b->bsubtype == FOUNTAIN){
+                       for(int r = 0; r < (rand()%20)+10;r++)
+                               currentWorld->addParticle(rand()%HLINE*3 + b->loc.x + b->width/2,b->loc.y + b->height, HLINE,HLINE, rand()%2 == 0?-(rand()%7)*.01:(rand()%7)*.01,((4+rand()%6)*.05), {0,0,1.0f}, 2500);
+               }
+       }
        
        /*
         *      Switch between day and night (SUNNY and DARK) if necessary.
index a04b6389467f3652bfffd2a6acbf125788009f01..1fefa9a478bfbb72f8aef5a7c910c7f960851ba8 100644 (file)
@@ -10,6 +10,8 @@ extern Player *player;
 
 extern const char *itemName;
 
+extern 
+
 void getRandomName(Entity *e){
        int tempNum,max=0;
        char *bufs;
@@ -57,6 +59,7 @@ void Entity::spawn(float x, float y){ //spawns the entity you pass to it based o
        near    = false;
        canMove = true;
        ground  = false;
+       hit     = false;
        
        ticksToUse = 0;
        
@@ -116,12 +119,12 @@ NPC::~NPC(){
 }
 
 Structures::Structures(){ //sets the structure type
-       health = maxHealth = 1;
+       health = maxHealth = 25;
        
        alive = false;
        near  = false;
        
-       tex = new Texturec(1,"assets/house1.png");
+       tex = new Texturec(3,"assets/house1.png", "assets/house2.png", "assets/fountain1.png");
        
        inWorld = NULL;
        name = NULL;
@@ -211,6 +214,7 @@ void Entity::draw(void){            //draws the entities
                static int texState = 0;
                static bool up = true;
                if(loops % (int)((float)4/(float)speed) == 0){
+                       //currentWorld->addParticle(loc.x,loc.y-HLINE,HLINE,HLINE,0,0,{0.0f,.17f,0.0f},1000);
                        if(up){
                                if(++texState==2)up=false;
                                tex->bindNext();
@@ -241,6 +245,19 @@ void Entity::draw(void){           //draws the entities
                                break;
                }
                break;
+       case STRUCTURET:
+               for(auto &strt : currentWorld->build){
+                       if(this == strt){
+                               if(strt->bsubtype == HOUSE){
+                                       tex->bind(0);
+                               }else if(strt->bsubtype == HOUSE2){
+                                       tex->bind(1);
+                               }else if(strt->bsubtype == FOUNTAIN){
+                                       tex->bind(2);
+                               }
+                       }
+               } 
+               break;
        default:
                tex->bind(0);
                break;
@@ -369,7 +386,7 @@ void Object::interact(void){
  *                                                     point to have non-normal traits so it could be invisible or invincible...
 */
 
-unsigned int Structures::spawn(_TYPE t, float x, float y){
+unsigned int Structures::spawn(_TYPE t, BUILD_SUB sub, float x, float y){
        loc.x = x;
        loc.y = y;
        type = t;
@@ -378,6 +395,7 @@ unsigned int Structures::spawn(_TYPE t, float x, float y){
 
        width =  50 * HLINE;
        height = 40 * HLINE;
+       bsubtype = sub;
 
        /*
         *      tempN is the amount of entities that will be spawned in the village. Currently the village
index b9aa328a6d9e5f7608f2672291e6e4f3525babbb..54ef432d293f68e5418ce78219735101d127312d 100644 (file)
@@ -127,7 +127,11 @@ void initEverything(void){
 
        playerSpawnHill->addMob(MS_TRIGGER,player->loc.x,0,story);
 
-       playerSpawnHill->addStructure(STRUCTURET,(rand()%120*HLINE),100,test,iw);
+       playerSpawnHill->addStructure(STRUCTURET,HOUSE,(rand()%120*HLINE),100,test,iw);
+       playerSpawnHill->addStructure(STRUCTURET,FOUNTAIN,(rand()%120*HLINE)+100*HLINE,100,test,iw);
+       //playerSpawnHill->addStructure(STRUCTURET,HOUSE2,(rand()%120*HLINE)+300*HLINE,100,test,iw);
+
+       //playerSpawnHill->addVillage(5,1,4,STRUCTURET,rand()%500+120,(float)200,playerSpawnHill,iw);
        playerSpawnHill->addMob(MS_TRIGGER,-1300,0,CUTSCENEEE);
        
        playerSpawnHill->addObject(SWORD_WOOD, false, "", 480,200);
index 585af471e91099d989e2a34c9ab69b16b9af3e57..5ae97b41610080b499de0e18b808bd99283c8188 100644 (file)
@@ -26,7 +26,7 @@ void initInventorySprites(void){
        }
 
        swordSwing = Mix_LoadWAV("assets/sounds/shortSwing.wav");
-       Mix_Volume(2,75);
+       Mix_Volume(2,100);
 }
 
 char *getItemTexturePath(ITEM_ID id){
@@ -317,10 +317,14 @@ int Inventory::useItem(void){
                case SWORD:
                        if(swing){
                                if(!player->left){
-                                       /*if(hangle==-15){up=true;Mix_PlayChannel(2,swordSwing,0);}
+                                       if(hangle==-15){up=true;Mix_PlayChannel(2,swordSwing,0);}
                                        if(up)hangle-=.75*deltaTime;
-                                       if(hangle<=-90)hangle=-14;*/
+                                       if(hangle<=-90)hangle=-14;
                                }else{
+                                       if(hangle==15){up=true;Mix_PlayChannel(2,swordSwing,0);}
+                                       if(up)hangle+=.75*deltaTime;
+                                       if(hangle>=90)hangle=14;
+                                       /*
                                        if(hangle<90&&!up)hangle+=.75*deltaTime;
                                        if(hangle>=90&&!up)up=true;
                                        if(up)hangle-=.75*deltaTime;
@@ -329,7 +333,7 @@ int Inventory::useItem(void){
                                                swing=false;
                                                hangle=15;
                                                return 0;
-                                       }
+                                       }*/
                                }
                        }else if(!swing){
                                swing=true;
index ff5a84aaf24732cb9479b6c7a4128e06785a0907..013d1aea48e6c189763038fbf20608209ca4bcf5 100644 (file)
@@ -682,7 +682,7 @@ DONE:
                                                }
                                                break;
                                        case SDLK_LSHIFT:
-                                               player->speed = debug ? 4.0f : 3.0f;
+                                               player->speed = debug ? 4.0f : 1.75f;
                                                break;
                                        case SDLK_LCTRL:
                                                player->speed = .5;
index 7a47c97e926894269360a799f1182084e9af18bb..8994f6c81ff5b41a686fbafff64523f54fca05d9 100644 (file)
@@ -108,7 +108,14 @@ void World::deleteEntities(void){
                delete object.back();
                object.pop_back();
        }
-       while(!entity.empty()) entity.pop_back();
+       while(!entity.empty()){
+               entity.pop_back();
+       }
+
+       while(!particles.empty()){
+               delete particles.back();
+               particles.pop_back();
+       }//particles.clear();
 }
 
 World::~World(void){
@@ -294,6 +301,28 @@ void World::update(Player *p,unsigned int delta){
           else if(e->vel.x > 0)e->left = false;
                }
        }
+       uint oh = 0;
+       for(auto &pa : particles){
+               if(pa->kill(deltaTime)){
+                       delete pa;
+                       particles.erase(particles.begin()+oh);
+               }else if(pa->canMove){
+                       pa->loc.y += pa->vely * deltaTime;
+                       pa->loc.x += pa->velx * deltaTime;
+
+                       for(auto &b : build){
+                               if(b->bsubtype==FOUNTAIN){
+                                       if(pa->loc.x >= b->loc.x && pa->loc.x <= b->loc.x+b->width){
+                                               if(pa->loc.y <= b->loc.y + b->height*.25){
+                                                       delete pa;
+                                                       particles.erase(particles.begin()+oh);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               oh++;
+       }oh=0;
        
        if(ui::dialogImportant){
                Mix_FadeOutMusic(2000);
@@ -523,7 +552,7 @@ LOOP2:
                //b->loc.y+=(yoff-DRAW_Y_OFFSET);
                b->draw();
                //b->loc.y-=(yoff-DRAW_Y_OFFSET);
-               std::cout<<b->loc.x<<" "<<b->loc.y<<std::endl;
+               //std::cout<<b->loc.x<<" "<<b->loc.y<<std::endl;
        }
        
        /*
@@ -604,7 +633,7 @@ LOOP2:
        /*
         *      Draw non-structure entities.
        */
-               
+       for(auto &part : particles){part->draw();}
        for(auto &n : current->npc){
                n->loc.y+=(yoff-DRAW_Y_OFFSET);
                n->draw();
@@ -621,7 +650,7 @@ LOOP2:
                        o->draw();
                        o->loc.y-=(yoff-DRAW_Y_OFFSET);
                }
-       }for(auto &o : particles){o->draw();}
+       }
 
        
        /*
@@ -851,23 +880,52 @@ void World::detect(Player *p){
        */
        
 LOOOOP:
+       static int what = 0;
        for(auto &e : hey->entity)
                hey->singleDetect(e);
+       for(auto &part : particles){
+               int l;
+               unsigned int i;
+               l=(part->loc.x + part->width / 2 - x_start) / HLINE;
+               if(l < 0) l=0;
+               i = l;
+               if(i > lineCount-1) i=lineCount-1;
+               if(part->loc.y < line[i].y){
+                       part->loc.y = line[i].y;
+                       part->vely = 0;
+                       part->velx = 0;
+                       part->canMove = false;
+               }else{
+                       if(part->vely > -2)part->vely-=.003 * deltaTime;
+               }
+               what++;
+       }what=0;
        if(hey->infront){
                hey = hey->infront;
                goto LOOOOP;
        }
 }
-
-void World::addStructure(_TYPE t,float x,float y,World *outside,World *inside){
+void World::addStructure(_TYPE t,BUILD_SUB sub, float x,float y,World *outside,World *inside){
        build.push_back(new Structures());
-       build.back()->spawn(t,x,y);
+       build.back()->spawn(t,sub,x,y);
        build.back()->inWorld=outside;
        build.back()->inside=(void *)inside;
        
        entity.push_back(build.back());
 }
        
+void World::addVillage(int bCount, int npcMin, int npcMax,_TYPE t,float x,float y,World *outside,World *inside){
+       std::cout << npcMin << ", " << npcMax << std::endl;
+       int xwasd;
+       for(int i = 0; i < bCount; i++){
+               xwasd = (rand()%(int)x+1000*HLINE);
+               HERE:
+               for(auto &bu : build){
+                       if(xwasd > bu->loc.x && xwasd < bu->loc.x+bu->width)goto HERE;
+               }
+               addStructure(t,HOUSE,xwasd,y,outside,inside);
+       }
+}
 void World::addMob(int t,float x,float y){
        mob.push_back(new Mob(t));
        mob.back()->spawn(x,y);
@@ -897,8 +955,9 @@ void World::addObject(ITEM_ID i, bool q, const char *p, float x, float y){
        entity.push_back(object.back());
 }
 
-void World::addParticle(float x, float y, float w, float h, Color color){
-       particles.push_back(new Particles(x,y,w,h,color));
+void World::addParticle(float x, float y, float w, float h, float vx, float vy, Color color, int d){
+       particles.push_back(new Particles(x,y,w,h,vx,vy,color,d));
+       particles.back()->canMove = true;
 }
 
 /*void World::removeObject(Object i){