Add collision detection for chars and boundary

main
Jerry Aldrich 11 years ago
parent 673dd55d48
commit 78a4a99ca8
  1. 16
      collisionDetection.c
  2. 8
      drawWindows.c
  3. 23
      gameLoop.c
  4. 3
      initializeWorld.c
  5. 3
      structs.h
  6. 4
      weaponsSystem.c
  7. 2
      world.h
  8. 20
      zombies.c

@ -1,4 +1,5 @@
#include <world.h> #include <world.h>
#include <string.h>
struct CollisionEvent collisionDetect(int objYpos, int objXpos){ struct CollisionEvent collisionDetect(int objYpos, int objXpos){
int i; int i;
for(i=1; i<MAX_ENTITIES; i++){ for(i=1; i<MAX_ENTITIES; i++){
@ -17,7 +18,20 @@ struct CollisionEvent collisionDetect(int objYpos, int objXpos){
} }
} }
} }
struct CollisionEvent collisionEvent = {.collidedWithItem=0,.collidedWithEntity=0};
for(i=0; i<strlen(unpassableChars); i++){
if (mvwinch(viewportWin,objYpos,objXpos)==unpassableChars[i]){
struct CollisionEvent collisionEvent = {.collidedWithUnPassableChar=1};
return collisionEvent;
}
}
if(objYpos < 1 || objYpos > 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; return collisionEvent;
} }

@ -4,6 +4,9 @@
#include <weaponsSystem.h> #include <weaponsSystem.h>
void drawViewport(){ void drawViewport(){
mvwprintw(viewportWin,10,10,"++++");
mvwprintw(viewportWin,11,10,"+ +");
mvwprintw(viewportWin,12,10,"+ +");
int i; int i;
for(i=0; i<MAX_ITEMS; i++){ for(i=0; i<MAX_ITEMS; i++){
if(allItems[i].isAlive){ if(allItems[i].isAlive){
@ -25,14 +28,9 @@ void drawViewport(){
else if(mvwinch(viewportWin,allProjectiles[i].curYpos,allProjectiles[i].curXpos)==allProjectiles[i].symbol){ else if(mvwinch(viewportWin,allProjectiles[i].curYpos,allProjectiles[i].curXpos)==allProjectiles[i].symbol){
mvwaddch(viewportWin, allProjectiles[i].curYpos, allProjectiles[i].curXpos, ' '); mvwaddch(viewportWin, allProjectiles[i].curYpos, allProjectiles[i].curXpos, ' ');
} }
checkProjectileCollision(&allProjectiles[i]);
if(mvwinch(viewportWin,allProjectiles[i].prevYpos, allProjectiles[i].prevXpos)==allProjectiles[i].symbol){ if(mvwinch(viewportWin,allProjectiles[i].prevYpos, allProjectiles[i].prevXpos)==allProjectiles[i].symbol){
mvwaddch(viewportWin, allProjectiles[i].prevYpos, allProjectiles[i].prevXpos, ' '); mvwaddch(viewportWin, allProjectiles[i].prevYpos, allProjectiles[i].prevXpos, ' ');
} }
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;
mvwaddch(viewportWin, allProjectiles[i].curYpos, allProjectiles[i].curXpos, ' ');
}
} }
box(viewportWin,0,0); box(viewportWin,0,0);
wnoutrefresh(viewportWin); wnoutrefresh(viewportWin);

@ -17,16 +17,19 @@ void gameLoop(){
switch(ch){ switch(ch){
case 'w': case 'w':
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--; allEntities[0].nextYpos--;
if(allEntities[0].nextYpos < 0){ };
allEntities[0].nextYpos = 0;
}
}
break; break;
} }
case 's': case 's':
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){ if(allEntities[0].curYpos < viewportWinRows - 2){
allEntities[0].nextYpos++; allEntities[0].nextYpos++;
if(allEntities[0].nextYpos > viewportWinRows-1){ if(allEntities[0].nextYpos > viewportWinRows-1){
@ -37,6 +40,11 @@ void gameLoop(){
} }
case 'a': case 'a':
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){ if(allEntities[0].curXpos > 1){
allEntities[0].nextXpos--; allEntities[0].nextXpos--;
if(allEntities[0].nextXpos < 0){ if(allEntities[0].nextXpos < 0){
@ -47,6 +55,11 @@ void gameLoop(){
} }
case 'd': case 'd':
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){ if(allEntities[0].curXpos < stdscrCols-2){
allEntities[0].nextXpos++; allEntities[0].nextXpos++;
if(allEntities[0].nextXpos > viewportWinCols-1){ if(allEntities[0].nextXpos > viewportWinCols-1){

@ -18,6 +18,9 @@ void initializeWorld() {
struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; 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="-\\|/-\\|/"}; struct Weapon pistol = {.type="Pistol", .isAlive=1, .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"};
passableChars="#";
unpassableChars="+\\|";
viewportWinRows = 21; viewportWinRows = 21;
viewportWinCols = 87; viewportWinCols = 87;
scoreWinRows = 7; scoreWinRows = 7;

@ -35,6 +35,7 @@ struct Item{
int curXpos; int curXpos;
}; };
struct Projectile{ struct Projectile{
int isAlive; int isAlive;
char symbol; char symbol;
@ -52,6 +53,8 @@ struct Projectile{
struct CollisionEvent{ struct CollisionEvent{
struct Entity * collidedWithEntity; struct Entity * collidedWithEntity;
struct Item * collidedWithItem; struct Item * collidedWithItem;
int collidedWithUnPassableChar;
int collidedWithBoundary;
}; };
#endif #endif

@ -7,6 +7,7 @@ void moveProjectiles(){
if(allProjectiles[i].isAlive){ if(allProjectiles[i].isAlive){
allProjectiles[i].prevYpos=allProjectiles[i].curYpos; allProjectiles[i].prevYpos=allProjectiles[i].curYpos;
allProjectiles[i].prevXpos=allProjectiles[i].curXpos; allProjectiles[i].prevXpos=allProjectiles[i].curXpos;
checkProjectileCollision(&allProjectiles[i]);
switch(allProjectiles[i].direction){ switch(allProjectiles[i].direction){
case 'w':{ case 'w':{
allProjectiles[i].curYpos--; allProjectiles[i].curYpos--;
@ -30,6 +31,9 @@ void moveProjectiles(){
} }
allProjectiles[i].distanceTraveled++; 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;
}
} }
} }
} }

@ -28,4 +28,6 @@ struct Projectile allProjectiles[MAX_PROJECTILES];
int zombieModifier; int zombieModifier;
int itemModifier; int itemModifier;
char *passableChars,*unpassableChars;
#endif #endif

@ -31,17 +31,17 @@ void moveZombies(){
getNextPos(allEntities[i].curYpos,allEntities[i].curXpos,allEntities[0].curYpos,allEntities[0].curXpos); getNextPos(allEntities[i].curYpos,allEntities[i].curXpos,allEntities[0].curYpos,allEntities[0].curXpos);
allEntities[i].nextYpos = nextPos.y; allEntities[i].nextYpos = nextPos.y;
allEntities[i].nextXpos = nextPos.x; allEntities[i].nextXpos = nextPos.x;
char charAtNextPos=mvwinch(viewportWin,allEntities[i].nextYpos,allEntities[i].nextXpos); struct CollisionEvent collisionEvent = collisionDetect(allEntities[i].nextYpos,allEntities[i].nextXpos);
if(charAtNextPos!='@' && charAtNextPos!=' '){
allEntities[i].nextYpos = allEntities[i].curYpos; if(collisionEvent.collidedWithBoundary || collisionEvent.collidedWithUnPassableChar || collisionEvent.collidedWithItem || collisionEvent.collidedWithEntity){
allEntities[i].nextXpos = allEntities[i].curXpos; if(collisionEvent.collidedWithEntity){
} if(collisionEvent.collidedWithEntity->type,"zombie"){
allEntities[i].nextYpos = allEntities[i].curYpos;
if(allEntities[i].nextYpos < 1 || allEntities[i].nextYpos>viewportWinRows-2){ allEntities[i].nextXpos = allEntities[i].curXpos;
}
}
allEntities[i].nextYpos = allEntities[i].curYpos; allEntities[i].nextYpos = allEntities[i].curYpos;
}
if(allEntities[i].nextXpos < 1 || allEntities[i].nextXpos>viewportWinCols-2){
allEntities[i].nextXpos = allEntities[i].curXpos; allEntities[i].nextXpos = allEntities[i].curXpos;
} }
} }

Loading…
Cancel
Save