mvp
This commit is contained in:
107
src/main.zig
107
src/main.zig
@@ -2,12 +2,16 @@ const std = @import("std");
|
|||||||
const pong = @import("pong");
|
const pong = @import("pong");
|
||||||
const rl = @import("raylib");
|
const rl = @import("raylib");
|
||||||
|
|
||||||
|
const State = enum { PAUSED, PLAYING };
|
||||||
|
|
||||||
const player = struct {
|
const player = struct {
|
||||||
rect: *pong.Rectangle,
|
rect: *pong.Rectangle,
|
||||||
|
score: u8,
|
||||||
|
|
||||||
fn init(rect: *pong.Rectangle) player {
|
fn init(rect: *pong.Rectangle) player {
|
||||||
return player{
|
return player{
|
||||||
.rect = rect,
|
.rect = rect,
|
||||||
|
.score = 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,14 +32,82 @@ const player = struct {
|
|||||||
self.rect.y -= speed;
|
self.rect.y -= speed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn aiUpdate(self: *player, myball: ball) void {
|
||||||
|
const centerY = self.rect.y + self.rect.height / 2.0;
|
||||||
|
const moveSpeed = 5;
|
||||||
|
|
||||||
|
if (myball.rect.y > centerY) {
|
||||||
|
self.rect.y += moveSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myball.rect.y < centerY) {
|
||||||
|
self.rect.y -= moveSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ball = struct {
|
||||||
|
rect: *pong.Rectangle,
|
||||||
|
vx: f32,
|
||||||
|
vy: f32,
|
||||||
|
|
||||||
|
fn init(rect: *pong.Rectangle, speed: f32, angle: f32) ball {
|
||||||
|
return ball{
|
||||||
|
.rect = rect,
|
||||||
|
.vx = speed * @cos(angle),
|
||||||
|
.vy = speed * @sin(angle),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(self: *ball) void {
|
||||||
|
self.rect.x += self.vx;
|
||||||
|
self.rect.y += self.vy;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hitCanvas(self: *ball, screenWidth: f32, screenHeight: f32) void {
|
||||||
|
if (self.rect.y < 0 or self.rect.y > screenHeight) {
|
||||||
|
self.vx *= 1;
|
||||||
|
self.vy *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.rect.x < 0 or self.rect.x > screenWidth) {
|
||||||
|
self.vx *= -1;
|
||||||
|
self.vy *= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hitPaddle(self: *ball, rect: pong.Rectangle) void {
|
||||||
|
if (collision(self.rect.*, rect)) {
|
||||||
|
self.vx *= -1;
|
||||||
|
self.vy *= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reset(self: ball, screenWidth: f32, screenHeight: f32) void {
|
||||||
|
self.rect.x = screenWidth / 2;
|
||||||
|
self.rect.y = screenHeight / 2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fn collision(r1: pong.Rectangle, r2: pong.Rectangle) bool {
|
||||||
|
if ((r1.x <= r2.x + r2.width / 2.0 and r1.x + r1.width / 2.0 >= r2.x) and (r1.y <= r2.y + r2.height and r1.y + r1.height >= r2.y)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fn drawRectangle(rect: pong.Rectangle, colour: rl.Color) void {
|
||||||
|
rl.drawRectangle(@intFromFloat(rect.x), @intFromFloat(rect.y), @intFromFloat(rect.width), @intFromFloat(rect.height), colour);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main() anyerror!void {
|
pub fn main() anyerror!void {
|
||||||
// Initialization
|
// Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
const screenWidth = 800;
|
const screenWidth = 800;
|
||||||
const screenHeight = 450;
|
const screenHeight = 450;
|
||||||
const speed = 4.0;
|
const speed = 6.0;
|
||||||
|
const pi = std.math.pi;
|
||||||
|
|
||||||
// player rect
|
// player rect
|
||||||
var rect = pong.Rectangle.init(20, screenHeight / 2 - 40, 40, 80);
|
var rect = pong.Rectangle.init(20, screenHeight / 2 - 40, 40, 80);
|
||||||
@@ -45,6 +117,10 @@ pub fn main() anyerror!void {
|
|||||||
var aiRect = pong.Rectangle.init(screenWidth - 20 * 3, screenHeight / 2 - 40, 40, 80);
|
var aiRect = pong.Rectangle.init(screenWidth - 20 * 3, screenHeight / 2 - 40, 40, 80);
|
||||||
var ai = player.init(&aiRect);
|
var ai = player.init(&aiRect);
|
||||||
|
|
||||||
|
// ball
|
||||||
|
var ballRect = pong.Rectangle.init(screenWidth / 2 - 5, screenHeight / 2 - 5, 10, 10);
|
||||||
|
var myBall = ball.init(&ballRect, speed, (pi / 4.0) * 3);
|
||||||
|
|
||||||
rl.initWindow(screenWidth, screenHeight, "PONG");
|
rl.initWindow(screenWidth, screenHeight, "PONG");
|
||||||
defer rl.closeWindow(); // Close window and OpenGL context
|
defer rl.closeWindow(); // Close window and OpenGL context
|
||||||
|
|
||||||
@@ -55,15 +131,38 @@ pub fn main() anyerror!void {
|
|||||||
while (!rl.windowShouldClose()) { // Detect window close button or ESC key
|
while (!rl.windowShouldClose()) { // Detect window close button or ESC key
|
||||||
// Update
|
// Update
|
||||||
myPlayer.update(screenHeight, speed);
|
myPlayer.update(screenHeight, speed);
|
||||||
ai.update(screenHeight, speed);
|
if (myBall.rect.x > (screenWidth * 0.6) and myBall.vx > 0) {
|
||||||
|
ai.aiUpdate(myBall);
|
||||||
|
}
|
||||||
|
|
||||||
|
myBall.update();
|
||||||
|
myBall.hitCanvas(screenWidth, screenHeight);
|
||||||
|
myBall.hitPaddle(myPlayer.rect.*);
|
||||||
|
myBall.hitPaddle(ai.rect.*);
|
||||||
|
|
||||||
|
if (myBall.rect.x < 0) {
|
||||||
|
ai.score += 1;
|
||||||
|
myBall.reset(screenWidth, screenHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myBall.rect.x > screenWidth) {
|
||||||
|
myPlayer.score += 1;
|
||||||
|
myBall.reset(screenWidth, screenHeight);
|
||||||
|
}
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
rl.beginDrawing();
|
rl.beginDrawing();
|
||||||
defer rl.endDrawing();
|
defer rl.endDrawing();
|
||||||
|
|
||||||
rl.drawRectangle(@intFromFloat(myPlayer.rect.x), @intFromFloat(myPlayer.rect.y), @intFromFloat(myPlayer.rect.width), @intFromFloat(myPlayer.rect.height), .white);
|
|
||||||
rl.drawRectangle(@intFromFloat(ai.rect.x), @intFromFloat(ai.rect.y), @intFromFloat(ai.rect.width), @intFromFloat(ai.rect.height), .white);
|
|
||||||
rl.drawText(rl.textFormat("y: %f", .{myPlayer.rect.y}), 10, 0, 20, .white);
|
rl.drawText(rl.textFormat("y: %f", .{myPlayer.rect.y}), 10, 0, 20, .white);
|
||||||
|
rl.drawText(rl.textFormat("%d", .{myPlayer.score}), screenWidth / 2 - 80, 20, 40, .white);
|
||||||
|
rl.drawText(rl.textFormat("%d", .{ai.score}), screenWidth / 2 + 65, 20, 40, .white);
|
||||||
|
|
||||||
|
rl.drawLine(screenWidth / 2, 0, screenWidth / 2, screenHeight, .white);
|
||||||
|
|
||||||
|
drawRectangle(myPlayer.rect.*, .white);
|
||||||
|
drawRectangle(ai.rect.*, .white);
|
||||||
|
drawRectangle(myBall.rect.*, .white);
|
||||||
|
|
||||||
rl.clearBackground(.black);
|
rl.clearBackground(.black);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user