Ball collides with blocks
This commit is contained in:
parent
61a470f0fb
commit
a29178ec55
21
breakout.c
21
breakout.c
@ -150,6 +150,7 @@ bool BALL_CollideWithRect(Ball * obj, SDL_Rect * rect){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Folgender Algorithmus ist gefickt, wenn der Ballmittelpunkt im rechteck liegt!
|
// 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)) {
|
if ((ballCenter.x) < (rect->x) || (ballCenter.x) > (rect->x) + (rect->w)) {
|
||||||
(obj->Momentum).x = -(obj->Momentum).x;
|
(obj->Momentum).x = -(obj->Momentum).x;
|
||||||
}
|
}
|
||||||
@ -206,7 +207,7 @@ void BALL_Update(Ball * obj, Paddle * paddle){
|
|||||||
(obj->Location) = oldLocation; // Maybe remove this
|
(obj->Location) = oldLocation; // Maybe remove this
|
||||||
BALL_SteerMomentum(obj, paddle); // Sets it to unit vector!
|
BALL_SteerMomentum(obj, paddle); // Sets it to unit vector!
|
||||||
// Following assumes that the paddle position was udated before the ball was updated
|
// 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
|
while (RECT_Collide(&(obj->TargetRect), &(paddle->TargetRect))) { // Move away from rect in small steps
|
||||||
(obj->Location) = vectorAdd((obj->Location), (obj->Momentum));
|
(obj->Location) = vectorAdd((obj->Location), (obj->Momentum));
|
||||||
RECT_SetTargetPos(&(obj->TargetRect), &(obj->Location));
|
RECT_SetTargetPos(&(obj->TargetRect), &(obj->Location));
|
||||||
@ -214,11 +215,14 @@ void BALL_Update(Ball * obj, Paddle * paddle){
|
|||||||
(obj->Momentum) = vectorScaleTo((obj->Momentum), BALL_Speed);
|
(obj->Momentum) = vectorScaleTo((obj->Momentum), BALL_Speed);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < BlockCount; i++) {
|
for (size_t i = 0; i < BlockCount; i++) {
|
||||||
|
if (blocks[i].HP <= 0) continue;
|
||||||
oldMomentum = obj->Momentum;
|
oldMomentum = obj->Momentum;
|
||||||
BALL_CollideWithRect(obj, &(blocks[i].TargetRect));
|
if (BALL_CollideWithRect(obj, &(blocks[i].TargetRect))) {
|
||||||
|
BLOCK_DealDamage(blocks + i, 1);
|
||||||
(obj->Location) = vectorSub((obj->Location), oldMomentum); // Maybe remove this
|
(obj->Location) = vectorSub((obj->Location), oldMomentum); // Maybe remove this
|
||||||
(obj->Location) = vectorAdd((obj->Location), (obj->Momentum));
|
(obj->Location) = vectorAdd((obj->Location), (obj->Momentum));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((obj->Location).y > BREAKOUT_BoxHeight)
|
if ((obj->Location).y > BREAKOUT_BoxHeight)
|
||||||
(obj->Location) = (Vector) {.x = BREAKOUT_BoxWidth / 2 + 300, .y = BREAKOUT_BoxHeight / 2 }; // Dead
|
(obj->Location) = (Vector) {.x = BREAKOUT_BoxWidth / 2 + 300, .y = BREAKOUT_BoxHeight / 2 }; // Dead
|
||||||
@ -226,8 +230,7 @@ void BALL_Update(Ball * obj, Paddle * paddle){
|
|||||||
(obj->Momentum).y = -(obj->Momentum).y;
|
(obj->Momentum).y = -(obj->Momentum).y;
|
||||||
if ((obj->Location).x < 0.0f || (obj->Location).x > BREAKOUT_BoxWidth - (2 * (obj->Size)))
|
if ((obj->Location).x < 0.0f || (obj->Location).x > BREAKOUT_BoxWidth - (2 * (obj->Size)))
|
||||||
(obj->Momentum).x = -(obj->Momentum).x;
|
(obj->Momentum).x = -(obj->Momentum).x;
|
||||||
(obj->TargetRect).x = (int)round((obj->Location).x);
|
RECT_SetTargetPos(&(obj->TargetRect), &(obj->Location));
|
||||||
(obj->TargetRect).y = (int)round((obj->Location).y);
|
|
||||||
} /* BALL_Update */
|
} /* BALL_Update */
|
||||||
void BALL_DestroyObject(Ball * obj){
|
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)));
|
constrain(&((obj->TargetRect).x), 0, (BREAKOUT_BoxWidth - ((obj->TargetRect).w)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PADDLE_DestroyObject(Paddle * obj){
|
void PADDLE_DestroyObject(Paddle * obj){
|
||||||
}
|
}
|
||||||
void PADDLE_Deinitialize(){
|
void PADDLE_Deinitialize(){
|
||||||
@ -335,14 +339,21 @@ Block BLOCK_CreateDefault() {
|
|||||||
|
|
||||||
return (Block) {
|
return (Block) {
|
||||||
.TargetRect = (SDL_Rect) {.x = (BREAKOUT_BoxWidth - defaultpaddlewidth) / 2, .y = BREAKOUT_BoxHeight - 100, .w = 150, .h = 75 },
|
.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
|
}; // Objekt für die Eigenschaften des Balls
|
||||||
}
|
}
|
||||||
|
|
||||||
void BLOCK_Draw(SDL_Renderer * renderer, Block * obj){
|
void BLOCK_Draw(SDL_Renderer * renderer, Block * obj){
|
||||||
|
if ((obj->HP) > 0) {
|
||||||
// printf("Block drawn at (%d|%d)!\n", (obj->TargetRect).x, (obj->TargetRect).y);
|
// printf("Block drawn at (%d|%d)!\n", (obj->TargetRect).x, (obj->TargetRect).y);
|
||||||
SDL_RenderCopy(renderer, BLOCK_Texture, (BLOCK_SourceRects + (obj->TextureIndex)), &(obj->TargetRect));
|
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){
|
void BLOCK_Update(Block * obj){
|
||||||
// Do nothing currently
|
// Do nothing currently
|
||||||
|
@ -24,7 +24,7 @@ typedef struct paddleStruct {
|
|||||||
|
|
||||||
typedef struct blockStruct {
|
typedef struct blockStruct {
|
||||||
SDL_Rect TargetRect;
|
SDL_Rect TargetRect;
|
||||||
int TextureIndex;
|
int TextureIndex, HP;
|
||||||
} Block; // Objekt für die Eigenschaften des Paddles
|
} Block; // Objekt für die Eigenschaften des Paddles
|
||||||
// End Structs
|
// End Structs
|
||||||
|
|
||||||
@ -56,6 +56,7 @@ void PADDLE_Deinitialize();
|
|||||||
void BLOCK_Initialize(SDL_Renderer * renderer);
|
void BLOCK_Initialize(SDL_Renderer * renderer);
|
||||||
Block BLOCK_CreateDefault() ;
|
Block BLOCK_CreateDefault() ;
|
||||||
void BLOCK_Draw(SDL_Renderer * renderer, Block * obj);
|
void BLOCK_Draw(SDL_Renderer * renderer, Block * obj);
|
||||||
|
void BLOCK_DealDamage(Block * obj, int dmg);
|
||||||
void BLOCK_Update(Block * obj);
|
void BLOCK_Update(Block * obj);
|
||||||
void BLOCK_DestroyObject(Block * obj);
|
void BLOCK_DestroyObject(Block * obj);
|
||||||
void BLOCK_Deinitialize();
|
void BLOCK_Deinitialize();
|
||||||
|
Loading…
Reference in New Issue
Block a user