diff --git a/breakout.c b/breakout.c index 7270655..948a0af 100644 --- a/breakout.c +++ b/breakout.c @@ -150,6 +150,7 @@ bool BALL_CollideWithRect(Ball * obj, SDL_Rect * rect){ return false; } // Folgender Algorithmus ist gefickt, wenn der Ballmittelpunkt im rechteck liegt! + // BUG: Ball glitches through blocks after being pushed by another collision if ((ballCenter.x) < (rect->x) || (ballCenter.x) > (rect->x) + (rect->w)) { (obj->Momentum).x = -(obj->Momentum).x; } @@ -206,7 +207,7 @@ void BALL_Update(Ball * obj, Paddle * paddle){ (obj->Location) = oldLocation; // Maybe remove this BALL_SteerMomentum(obj, paddle); // Sets it to unit vector! // Following assumes that the paddle position was udated before the ball was updated -// BUG/GLITCH: Make sure that the postition of the ball is not shited into the borders of the game! + // BUG/GLITCH: Make sure that the postition of the ball is not shifted into the borders of the game! while (RECT_Collide(&(obj->TargetRect), &(paddle->TargetRect))) { // Move away from rect in small steps (obj->Location) = vectorAdd((obj->Location), (obj->Momentum)); RECT_SetTargetPos(&(obj->TargetRect), &(obj->Location)); @@ -214,10 +215,13 @@ void BALL_Update(Ball * obj, Paddle * paddle){ (obj->Momentum) = vectorScaleTo((obj->Momentum), BALL_Speed); } for (size_t i = 0; i < BlockCount; i++) { + if (blocks[i].HP <= 0) continue; oldMomentum = obj->Momentum; - BALL_CollideWithRect(obj, &(blocks[i].TargetRect)); - (obj->Location) = vectorSub((obj->Location), oldMomentum); // Maybe remove this - (obj->Location) = vectorAdd((obj->Location), (obj->Momentum)); + if (BALL_CollideWithRect(obj, &(blocks[i].TargetRect))) { + BLOCK_DealDamage(blocks + i, 1); + (obj->Location) = vectorSub((obj->Location), oldMomentum); // Maybe remove this + (obj->Location) = vectorAdd((obj->Location), (obj->Momentum)); + } } if ((obj->Location).y > BREAKOUT_BoxHeight) @@ -226,8 +230,7 @@ void BALL_Update(Ball * obj, Paddle * paddle){ (obj->Momentum).y = -(obj->Momentum).y; if ((obj->Location).x < 0.0f || (obj->Location).x > BREAKOUT_BoxWidth - (2 * (obj->Size))) (obj->Momentum).x = -(obj->Momentum).x; - (obj->TargetRect).x = (int)round((obj->Location).x); - (obj->TargetRect).y = (int)round((obj->Location).y); + RECT_SetTargetPos(&(obj->TargetRect), &(obj->Location)); } /* BALL_Update */ void BALL_DestroyObject(Ball * obj){ } @@ -303,6 +306,7 @@ void PADDLE_Update(Paddle * obj, Uint8 * keystate){ } constrain(&((obj->TargetRect).x), 0, (BREAKOUT_BoxWidth - ((obj->TargetRect).w))); } + void PADDLE_DestroyObject(Paddle * obj){ } void PADDLE_Deinitialize(){ @@ -335,13 +339,20 @@ Block BLOCK_CreateDefault() { return (Block) { .TargetRect = (SDL_Rect) {.x = (BREAKOUT_BoxWidth - defaultpaddlewidth) / 2, .y = BREAKOUT_BoxHeight - 100, .w = 150, .h = 75 }, - .TextureIndex = (rand() % BLOCK_TextureCount) + .TextureIndex = (rand() % BLOCK_TextureCount), + .HP = 1 }; // Objekt für die Eigenschaften des Balls } void BLOCK_Draw(SDL_Renderer * renderer, Block * obj){ - // printf("Block drawn at (%d|%d)!\n", (obj->TargetRect).x, (obj->TargetRect).y); - SDL_RenderCopy(renderer, BLOCK_Texture, (BLOCK_SourceRects + (obj->TextureIndex)), &(obj->TargetRect)); + if ((obj->HP) > 0) { + // printf("Block drawn at (%d|%d)!\n", (obj->TargetRect).x, (obj->TargetRect).y); + SDL_RenderCopy(renderer, BLOCK_Texture, (BLOCK_SourceRects + (obj->TextureIndex)), &(obj->TargetRect)); + } +} + +void BLOCK_DealDamage(Block * obj, int dmg){ + if (((obj->HP) -= dmg) <= 0) printf("Block was destroyed!\n"); } void BLOCK_Update(Block * obj){ diff --git a/breakout.h b/breakout.h index 0ea3f74..e476ed2 100644 --- a/breakout.h +++ b/breakout.h @@ -24,7 +24,7 @@ typedef struct paddleStruct { typedef struct blockStruct { SDL_Rect TargetRect; - int TextureIndex; + int TextureIndex, HP; } Block; // Objekt für die Eigenschaften des Paddles // End Structs @@ -56,6 +56,7 @@ void PADDLE_Deinitialize(); void BLOCK_Initialize(SDL_Renderer * renderer); Block BLOCK_CreateDefault() ; void BLOCK_Draw(SDL_Renderer * renderer, Block * obj); +void BLOCK_DealDamage(Block * obj, int dmg); void BLOCK_Update(Block * obj); void BLOCK_DestroyObject(Block * obj); void BLOCK_Deinitialize();