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. 16
      zombies.c

@ -1,4 +1,5 @@
#include <world.h>
#include <string.h>
struct CollisionEvent collisionDetect(int objYpos, int objXpos){
int 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;
}

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

@ -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){

@ -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;

@ -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

@ -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;
}
}
}
}

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

@ -32,16 +32,16 @@ void moveZombies(){
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;
}
struct CollisionEvent collisionEvent = collisionDetect(allEntities[i].nextYpos,allEntities[i].nextXpos);
if(allEntities[i].nextYpos < 1 || allEntities[i].nextYpos>viewportWinRows-2){
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;
}
}

Loading…
Cancel
Save