diff --git a/collisionDetection.c b/collisionDetection.c index 44a7440..686f0f0 100644 --- a/collisionDetection.c +++ b/collisionDetection.c @@ -1,4 +1,5 @@ #include +#include struct CollisionEvent collisionDetect(int objYpos, int objXpos){ int i; for(i=1; i viewportWinRows-2 || objXpos < 1 || objXpos > viewportWinCols-2 ){ + struct CollisionEvent collisionEvent = {.collidedWithBoundary=1}; + return collisionEvent; + } + + struct CollisionEvent collisionEvent = {.collidedWithItem=0,.collidedWithEntity=0,.collidedWithUnPassableChar=0,.collidedWithBoundary=0}; return collisionEvent; } diff --git a/drawWindows.c b/drawWindows.c index 726c1f0..ee07f70 100644 --- a/drawWindows.c +++ b/drawWindows.c @@ -4,6 +4,9 @@ #include void drawViewport(){ + mvwprintw(viewportWin,10,10,"++++"); + mvwprintw(viewportWin,11,10,"+ +"); + mvwprintw(viewportWin,12,10,"+ +"); int i; for(i=0; i=allProjectiles[i].range || allProjectiles[i].curYpos > viewportWinRows || allProjectiles[i].curYpos < 0 || allProjectiles[i].curXpos > viewportWinCols || allProjectiles[i].curXpos < 0){ - allProjectiles[i].isAlive=0; - mvwaddch(viewportWin, allProjectiles[i].curYpos, allProjectiles[i].curXpos, ' '); - } } box(viewportWin,0,0); wnoutrefresh(viewportWin); diff --git a/gameLoop.c b/gameLoop.c index 2671d42..248c55e 100644 --- a/gameLoop.c +++ b/gameLoop.c @@ -17,16 +17,19 @@ void gameLoop(){ switch(ch){ case 'w': case 'W':{ - if(allEntities[0].curYpos > 1){ + struct CollisionEvent collisionEvent = collisionDetect(allEntities[0].nextYpos-1,allEntities[0].curXpos); + if(!collisionEvent.collidedWithUnPassableChar && !collisionEvent.collidedWithBoundary){ allEntities[0].nextYpos--; - if(allEntities[0].nextYpos < 0){ - allEntities[0].nextYpos = 0; - } - } + }; break; } case 's': case 'S':{ + struct CollisionEvent collisionEvent = collisionDetect(allEntities[0].nextYpos+1,allEntities[0].curXpos); + if(!collisionEvent.collidedWithUnPassableChar && !collisionEvent.collidedWithBoundary){ + allEntities[0].nextYpos++; + }; + break; if(allEntities[0].curYpos < viewportWinRows - 2){ allEntities[0].nextYpos++; if(allEntities[0].nextYpos > viewportWinRows-1){ @@ -37,6 +40,11 @@ void gameLoop(){ } case 'a': case 'A':{ + struct CollisionEvent collisionEvent = collisionDetect(allEntities[0].curYpos,allEntities[0].nextXpos-1); + if(!collisionEvent.collidedWithUnPassableChar && !collisionEvent.collidedWithBoundary){ + allEntities[0].nextXpos--; + }; + break; if(allEntities[0].curXpos > 1){ allEntities[0].nextXpos--; if(allEntities[0].nextXpos < 0){ @@ -47,6 +55,11 @@ void gameLoop(){ } case 'd': case 'D':{ + struct CollisionEvent collisionEvent = collisionDetect(allEntities[0].curYpos,allEntities[0].nextXpos+1); + if(!collisionEvent.collidedWithUnPassableChar && !collisionEvent.collidedWithBoundary){ + allEntities[0].nextXpos++; + }; + break; if(allEntities[0].curXpos < stdscrCols-2){ allEntities[0].nextXpos++; if(allEntities[0].nextXpos > viewportWinCols-1){ diff --git a/initializeWorld.c b/initializeWorld.c index e53cbc9..3221f90 100644 --- a/initializeWorld.c +++ b/initializeWorld.c @@ -18,6 +18,9 @@ void initializeWorld() { struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; struct Weapon pistol = {.type="Pistol", .isAlive=1, .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; + passableChars="#"; + unpassableChars="+\\|"; + viewportWinRows = 21; viewportWinCols = 87; scoreWinRows = 7; diff --git a/structs.h b/structs.h index 284e61d..d6ae60f 100644 --- a/structs.h +++ b/structs.h @@ -35,6 +35,7 @@ struct Item{ int curXpos; }; + struct Projectile{ int isAlive; char symbol; @@ -52,6 +53,8 @@ struct Projectile{ struct CollisionEvent{ struct Entity * collidedWithEntity; struct Item * collidedWithItem; + int collidedWithUnPassableChar; + int collidedWithBoundary; }; #endif diff --git a/weaponsSystem.c b/weaponsSystem.c index 32995ea..1f15de5 100644 --- a/weaponsSystem.c +++ b/weaponsSystem.c @@ -7,6 +7,7 @@ void moveProjectiles(){ if(allProjectiles[i].isAlive){ allProjectiles[i].prevYpos=allProjectiles[i].curYpos; allProjectiles[i].prevXpos=allProjectiles[i].curXpos; + checkProjectileCollision(&allProjectiles[i]); switch(allProjectiles[i].direction){ case 'w':{ allProjectiles[i].curYpos--; @@ -30,6 +31,9 @@ void moveProjectiles(){ } allProjectiles[i].distanceTraveled++; + if(allProjectiles[i].distanceTraveled>=allProjectiles[i].range || allProjectiles[i].curYpos > viewportWinRows || allProjectiles[i].curYpos < 0 || allProjectiles[i].curXpos > viewportWinCols || allProjectiles[i].curXpos < 0){ + allProjectiles[i].isAlive=0; + } } } } diff --git a/world.h b/world.h index 6509449..29b3d30 100644 --- a/world.h +++ b/world.h @@ -28,4 +28,6 @@ struct Projectile allProjectiles[MAX_PROJECTILES]; int zombieModifier; int itemModifier; +char *passableChars,*unpassableChars; + #endif diff --git a/zombies.c b/zombies.c index fde94e8..ae68402 100644 --- a/zombies.c +++ b/zombies.c @@ -31,17 +31,17 @@ void moveZombies(){ getNextPos(allEntities[i].curYpos,allEntities[i].curXpos,allEntities[0].curYpos,allEntities[0].curXpos); allEntities[i].nextYpos = nextPos.y; allEntities[i].nextXpos = nextPos.x; - - char charAtNextPos=mvwinch(viewportWin,allEntities[i].nextYpos,allEntities[i].nextXpos); - if(charAtNextPos!='@' && charAtNextPos!=' '){ - allEntities[i].nextYpos = allEntities[i].curYpos; - allEntities[i].nextXpos = allEntities[i].curXpos; - } - - if(allEntities[i].nextYpos < 1 || allEntities[i].nextYpos>viewportWinRows-2){ + + struct CollisionEvent collisionEvent = collisionDetect(allEntities[i].nextYpos,allEntities[i].nextXpos); + + if(collisionEvent.collidedWithBoundary || collisionEvent.collidedWithUnPassableChar || collisionEvent.collidedWithItem || collisionEvent.collidedWithEntity){ + if(collisionEvent.collidedWithEntity){ + if(collisionEvent.collidedWithEntity->type,"zombie"){ + allEntities[i].nextYpos = allEntities[i].curYpos; + allEntities[i].nextXpos = allEntities[i].curXpos; + } + } allEntities[i].nextYpos = allEntities[i].curYpos; - } - if(allEntities[i].nextXpos < 1 || allEntities[i].nextXpos>viewportWinCols-2){ allEntities[i].nextXpos = allEntities[i].curXpos; } }