Paddle and Ball
This commit is contained in:
37
include/object.h
Normal file
37
include/object.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#ifndef GAME_PADDLE_H
|
||||||
|
#define GAME_PADDLE_H 1
|
||||||
|
|
||||||
|
#include "game.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int column;
|
||||||
|
int pos;
|
||||||
|
int height;
|
||||||
|
char c;
|
||||||
|
} Paddle;
|
||||||
|
|
||||||
|
Paddle CreatePaddle(GameData* gd);
|
||||||
|
void DrawPaddle(Paddle*);
|
||||||
|
void MovePaddleUP(Paddle*);
|
||||||
|
void MovePaddleDown(Paddle*);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
|
||||||
|
int lastCharX;
|
||||||
|
int lastCharY;
|
||||||
|
char c;
|
||||||
|
int visible;
|
||||||
|
float vx;
|
||||||
|
float vy;
|
||||||
|
} Ball;
|
||||||
|
|
||||||
|
Ball CreateBall(GameData* gd);
|
||||||
|
void DrawBall(Ball*);
|
||||||
|
void UpdateBall(Ball* ball, Paddle* paddle);
|
||||||
|
int CheckBallLose(GameData* gd,Ball* ball);
|
||||||
|
int CheckBallCourtChange(GameData* gd,Ball* ball);
|
||||||
|
void HideBall(Ball* ball);
|
||||||
|
void ServeBall(Ball* ball, GameData* gd);
|
||||||
|
#endif
|
||||||
113
src/ball.c
Normal file
113
src/ball.c
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#include "../include/object.h"
|
||||||
|
|
||||||
|
#include <curses.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
Ball CreateBall(GameData* gd)
|
||||||
|
{
|
||||||
|
Ball b;
|
||||||
|
b.visible = false;
|
||||||
|
b.c = 'O';
|
||||||
|
b.y = TOP_ROW + 3;
|
||||||
|
b.x = RIGHT_COL - 3;
|
||||||
|
b.lastCharX = 0;
|
||||||
|
b.lastCharY = 0;
|
||||||
|
|
||||||
|
b.vx = -0.2;
|
||||||
|
b.vy = 0.2;
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
void UpdateBall(Ball* ball, Paddle* p)
|
||||||
|
{
|
||||||
|
int x = ball->x;
|
||||||
|
int y = ball->y;
|
||||||
|
|
||||||
|
float nx = ball->x + ball->vx;
|
||||||
|
float ny = ball->y + ball->vy;
|
||||||
|
|
||||||
|
if (floor(ny) == TOP_ROW || floor(ny) == BOT_ROW) {
|
||||||
|
ball->vy = -ball->vy;
|
||||||
|
ny = ball->y + ball->vy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (floor(nx) == p->column) {
|
||||||
|
if (ny >= p->pos && ny < p->pos + p->height) {
|
||||||
|
ball->vx = -ball->vx;
|
||||||
|
nx = ball->x + ball->vx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ball->x = nx;
|
||||||
|
ball->y = ny;
|
||||||
|
|
||||||
|
int ncx = ball->x;
|
||||||
|
int ncy = ball->y;
|
||||||
|
|
||||||
|
// if x y changes then re-draw
|
||||||
|
if (ncx != x || ncy != y)
|
||||||
|
DrawBall(ball);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckBallLose(GameData* gd, Ball* ball)
|
||||||
|
{
|
||||||
|
int loseCol = 0;
|
||||||
|
if (gd->host) {
|
||||||
|
if (ball->x <= LEFT_COL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (ball->x >= RIGHT_COL)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckBallCourtChange(GameData* gd, Ball* ball)
|
||||||
|
{
|
||||||
|
if (gd->host) {
|
||||||
|
if (ball->x >= RIGHT_COL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (ball->x <= LEFT_COL)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawBall(Ball* ball)
|
||||||
|
{
|
||||||
|
int x = ball->x;
|
||||||
|
int y = ball->y;
|
||||||
|
|
||||||
|
char lastChar = mvinch(ball->lastCharY, ball->lastCharX) & A_CHARTEXT;
|
||||||
|
if (lastChar == ball->c)
|
||||||
|
mvaddch(ball->lastCharY, ball->lastCharX, ' ');
|
||||||
|
|
||||||
|
mvaddch(y, x, ball->c);
|
||||||
|
ball->lastCharY = y;
|
||||||
|
ball->lastCharX = x;
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HideBall(Ball* ball)
|
||||||
|
{
|
||||||
|
ball->visible = false;
|
||||||
|
char lastChar = mvinch(ball->lastCharY, ball->lastCharX) & A_CHARTEXT;
|
||||||
|
if (lastChar == ball->c)
|
||||||
|
mvaddch(ball->lastCharY, ball->lastCharX, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServeBall(Ball* ball, GameData* gd) {
|
||||||
|
ball->visible = true;
|
||||||
|
|
||||||
|
float middle = TOP_ROW + (BOT_ROW-TOP_ROW)/2;
|
||||||
|
ball->y = middle;
|
||||||
|
|
||||||
|
if (gd->host)
|
||||||
|
ball->x = RIGHT_COL-2;
|
||||||
|
else ball->x = LEFT_COL + 2;
|
||||||
|
|
||||||
|
|
||||||
|
ball->vx = -0.2;
|
||||||
|
ball->vy = 0.2;
|
||||||
|
if (!gd->host) ball->vx *= -1;
|
||||||
|
}
|
||||||
69
src/paddle.c
Normal file
69
src/paddle.c
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#include "../include/object.h"
|
||||||
|
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
|
Paddle CreatePaddle(GameData* gd)
|
||||||
|
{
|
||||||
|
Paddle p;
|
||||||
|
GameData data = *gd;
|
||||||
|
|
||||||
|
// Set Column
|
||||||
|
if (data.playerNumber == 0)
|
||||||
|
p.column = LEFT_COL + 2;
|
||||||
|
else
|
||||||
|
p.column = RIGHT_COL - 2;
|
||||||
|
|
||||||
|
// Paddle height
|
||||||
|
p.height = 5;
|
||||||
|
|
||||||
|
// Find Middle of screen;
|
||||||
|
float middle = (BOT_ROW - TOP_ROW) / 2.0f;
|
||||||
|
middle -= p.height / 2;
|
||||||
|
|
||||||
|
// Set Y value to the top of the screen
|
||||||
|
p.pos = TOP_ROW + middle;
|
||||||
|
|
||||||
|
// Set char
|
||||||
|
p.c = '#';
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawPaddle(Paddle* paddle)
|
||||||
|
{
|
||||||
|
Paddle p = *paddle;
|
||||||
|
for (int i = 0; i < p.height; ++i) {
|
||||||
|
move(p.pos + i, p.column);
|
||||||
|
addch(p.c);
|
||||||
|
}
|
||||||
|
|
||||||
|
char topchar = mvinch(p.pos - 1, p.column) & A_CHARTEXT;
|
||||||
|
if (topchar == p.c)
|
||||||
|
mvaddch(p.pos - 1, p.column, ' ');
|
||||||
|
char bottomchar = mvinch(p.pos + p.height, p.column) & A_CHARTEXT;
|
||||||
|
if (bottomchar == p.c)
|
||||||
|
mvaddch(p.pos + p.height, p.column, ' ');
|
||||||
|
|
||||||
|
move(p.pos, p.column);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MovePaddleUP(Paddle* paddle)
|
||||||
|
{
|
||||||
|
int newPos = paddle->pos - 1;
|
||||||
|
|
||||||
|
if (newPos > TOP_ROW) {
|
||||||
|
paddle->pos = newPos;
|
||||||
|
}
|
||||||
|
DrawPaddle(paddle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MovePaddleDown(Paddle* paddle)
|
||||||
|
{
|
||||||
|
int newPos = paddle->pos + 1;
|
||||||
|
|
||||||
|
if (newPos + paddle->height <= BOT_ROW) {
|
||||||
|
paddle->pos = newPos;
|
||||||
|
}
|
||||||
|
DrawPaddle(paddle);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user