Cube / app.py
ChBysk's picture
Create app.py
e5ddb64 verified
import pygame
import json
import time
import math
# --- Configuration ---
WIDTH, HEIGHT = 800, 600
FPS = 60
WHITE = (255, 255, 255)
CYAN = (0, 255, 204)
PINK = (255, 0, 85)
GOLD = (255, 215, 0)
BLACK = (5, 5, 5)
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
font = pygame.font.SysFont("Courier New", 18, bold=True)
# --- Game State ---
class GameState:
def __init__(self):
self.current_level = 0
self.jumps = 0
self.pb = self.load_pb()
self.editing = False
self.loading = False
self.levels = self.load_levels()
self.reset_player()
def reset_player(self):
self.px, self.py = 50, 500
self.vx, self.vy = 0, 0
self.grounded = False
def load_pb(self):
try:
with open("pb.txt", "r") as f: return int(f.read())
except: return float('inf')
def save_pb(self):
if self.jumps < self.pb:
with open("pb.txt", "w") as f: f.write(str(self.jumps))
self.pb = self.jumps
def load_levels(self):
try:
with open("levels.json", "r") as f: return json.load(f)
except:
# Default Level 1
return [[{"rect": [0, 550, 200, 20], "type": "normal"},
{"rect": [720, 100, 50, 50], "type": "goal"}]]
def save_levels(self):
with open("levels.json", "w") as f: json.dump(self.levels, f)
state = GameState()
# --- 4D Tesseract Loading Screen ---
def draw_tesseract_loader():
start_time = time.time()
angle = 0
while time.time() - start_time < 3:
screen.fill(BLACK)
angle += 0.05
center = (WIDTH // 2, HEIGHT // 2)
# Draw projection
s1 = 40 + math.sin(angle) * 10
s2 = 80
for s in [s1, s2]:
pts = [
(center[0]-s, center[1]-s), (center[0]+s, center[1]-s),
(center[0]+s, center[1]+s), (center[0]-s, center[1]+s)
]
pygame.draw.lines(screen, CYAN, True, pts, 2)
# Connecting lines
for i in [-1, 1]:
for j in [-1, 1]:
pygame.draw.line(screen, CYAN, (center[0]+i*s1, center[1]+j*s1), (center[0]+i*s2, center[1]+j*s2), 1)
txt = font.render("STABILIZING DIMENSIONS...", True, CYAN)
screen.blit(txt, (WIDTH//2 - 120, HEIGHT//2 + 120))
pygame.display.flip()
clock.tick(FPS)
# --- Main Loop ---
running = True
new_plat_start = None
current_type = "normal"
while running:
screen.fill(BLACK)
dt = clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Editor Controls
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: state.editing = not state.editing
if event.key == pygame.K_s and state.editing: state.save_levels()
if event.key == pygame.K_n and state.editing: # New Level
state.levels.append([{"rect": [0, 550, 200, 20], "type": "normal"}])
state.current_level = len(state.levels) - 1
if state.editing:
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: new_plat_start = event.pos
if event.button == 3: # Right click cycle type
types = ["normal", "bouncy", "goal"]
current_type = types[(types.index(current_type) + 1) % 3]
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
end_x, end_y = event.pos
x, y = min(new_plat_start[0], end_x), min(new_plat_start[1], end_y)
w, h = abs(new_plat_start[0] - end_x), abs(new_plat_start[1] - end_y)
state.levels[state.current_level].append({"rect": [x, y, w, h], "type": current_type})
new_plat_start = None
if not state.editing:
# Physics
keys = pygame.key.get_pressed()
if keys[pygame.K_a] or keys[pygame.K_LEFT]: state.vx -= 0.8
if keys[pygame.K_d] or keys[pygame.K_RIGHT]: state.vx += 0.8
if (keys[pygame.K_SPACE] or keys[pygame.K_UP] or keys[pygame.K_w]) and state.grounded:
state.vy = -11
state.jumps += 1
state.grounded = False
state.vy += 0.5 # Gravity
state.vx *= 0.85 # Friction
state.px += state.vx
state.py += state.vy
# Screen Wrap
if state.px < 0: state.px = WIDTH
if state.px > WIDTH: state.px = 0
if state.py > HEIGHT: state.reset_player()
# Collisions
state.grounded = False
for p in state.levels[state.current_level]:
r = pygame.Rect(p["rect"])
player_rect = pygame.Rect(state.px - 10, state.py - 10, 20, 20)
if player_rect.colliderect(r):
if p["type"] == "goal":
state.save_pb()
if state.current_level < len(state.levels) - 1:
state.current_level += 1
draw_tesseract_loader()
state.reset_player()
else:
print("All Levels Clear!")
running = False
elif state.vy > 0 and state.py < r.top + 10:
state.py = r.top - 10
state.vy *= -1.4 if p["type"] == "bouncy" else -0.5
if abs(state.vy) < 1:
state.vy = 0
state.grounded = True
# --- Drawing ---
# Draw Platforms
for p in state.levels[state.current_level]:
color = CYAN if p["type"] == "normal" else (PINK if p["type"] == "bouncy" else GOLD)
pygame.draw.rect(screen, color, p["rect"])
# Draw Player
pygame.draw.circle(screen, WHITE, (int(state.px), int(state.py)), 10)
# UI
mode_txt = "EDITOR MODE (S: Save, R-Click: Change Type)" if state.editing else f"LEVEL: {state.current_level+1} | JUMPS: {state.jumps}"
pb_txt = f"PB: {state.pb if state.pb != float('inf') else '--'}"
screen.blit(font.render(mode_txt, True, WHITE), (10, 10))
screen.blit(font.render(pb_txt, True, WHITE), (10, 35))
if state.editing:
screen.blit(font.render(f"TYPE: {current_type.upper()}", True, GOLD), (10, 60))
pygame.display.flip()
pygame.quit()