Guest User

Untitled

a guest
Dec 24th, 2025
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.38 KB | Gaming | 0 0
  1. import pyray as pr
  2. import numpy as np
  3. import argparse
  4. import createtrack
  5. import math
  6. import random
  7.  
  8. GRID = 8
  9. TRACK_QUADS = 4
  10. TRACK_WIDTH = GRID * TRACK_QUADS
  11. INNER_WIDTH = TRACK_WIDTH - GRID
  12.  
  13. def ammorbidisci_pista(punti, precisione=25):
  14.     out = []
  15.     n = len(punti)
  16.     for i in range(n):
  17.         p0, p1, p2, p3 = punti[(i-1)%n], punti[i], punti[(i+1)%n], punti[(i+2)%n]
  18.         for ti in range(precisione):
  19.             t = ti / precisione
  20.             x = 0.5*((2*p1.x)+(-p0.x+p2.x)*t+(2*p0.x-5*p1.x+4*p2.x-p3.x)*t*t+(-p0.x+3*p1.x-3*p2.x+p3.x)*t*t*t)
  21.             y = 0.5*((2*p1.y)+(-p0.y+p2.y)*t+(2*p0.y-5*p1.y+4*p2.y-p3.y)*t*t+(-p0.y+3*p1.y-3*p2.y+p3.y)*t*t*t)
  22.             out.append(pr.Vector2(x, y))
  23.     return out
  24.  
  25. def genera_pista(seed):
  26.     np.random.seed(seed)
  27.     tg = createtrack.CreateTrack(
  28.         num_points=18,
  29.         x_bounds=[20, 180],
  30.         y_bounds=[20, 180],
  31.         corner_cells=2,
  32.         seed=seed
  33.     )
  34.     raw = tg.create_racetrack(False)
  35.     pts = [pr.Vector2(float(p[0]), float(p[1])) for p in raw]
  36.     return ammorbidisci_pista(pts, precisione=6)
  37.  
  38. def disegna_sfondo(cam, sx, sy):
  39.     step = GRID
  40.     bold = 5
  41.     x0 = int((cam.target.x - sx/cam.zoom)//step)*step
  42.     x1 = int((cam.target.x + sx/cam.zoom)//step)*step
  43.     y0 = int((cam.target.y - sy/cam.zoom)//step)*step
  44.     y1 = int((cam.target.y + sy/cam.zoom)//step)*step
  45.     for x in range(x0, x1, step):
  46.         pr.draw_line(x, y0, x, y1, pr.LIGHTGRAY if (x//step)%bold else pr.GRAY)
  47.     for y in range(y0, y1, step):
  48.         pr.draw_line(x0, y, x1, y, pr.LIGHTGRAY if (y//step)%bold else pr.GRAY)
  49.  
  50. def disegna_tubo(punti, raggio, colore):
  51.     for p in punti:
  52.         pr.draw_circle_v(p, raggio, colore)
  53.  
  54. def disegna_pista(punti):
  55.     disegna_tubo(punti, TRACK_WIDTH//2, pr.GRAY)
  56.     disegna_tubo(punti, INNER_WIDTH//2, pr.RAYWHITE)
  57.     disegna_tubo(punti, TRACK_WIDTH//2 + 1, pr.BLACK)
  58.  
  59. def disegna_partenza(punti, idx):
  60.     p1 = punti[idx]
  61.     p2 = punti[(idx+1)%len(punti)]
  62.     dx, dy = p2.x-p1.x, p2.y-p1.y
  63.     d = math.hypot(dx, dy)
  64.     if d < 0.01: return
  65.     nx, ny = -dy/d, dx/d
  66.     h = TRACK_WIDTH//2 + GRID
  67.     a = pr.Vector2(p1.x+nx*h, p1.y+ny*h)
  68.     b = pr.Vector2(p1.x-nx*h, p1.y-ny*h)
  69.     pr.draw_line_ex(a, b, 3, pr.RED)
  70.  
  71. if __name__ == "__main__":
  72.     parser = argparse.ArgumentParser()
  73.     parser.add_argument('--screen_x', type=int, default=1200)
  74.     parser.add_argument('--screen_y', type=int, default=750)
  75.     args = parser.parse_args()
  76.  
  77.     seed = np.random.randint(0, 2**31-1)
  78.     punti = genera_pista(seed)
  79.     start_idx = random.randint(0, len(punti)-1)
  80.  
  81.     pr.init_window(args.screen_x, args.screen_y, "Notebook Track – ORGANIC TUBE")
  82.     pr.set_target_fps(60)
  83.  
  84.     cam = pr.Camera2D(
  85.         pr.Vector2(args.screen_x/2, args.screen_y/2),
  86.         pr.Vector2(100, 100),
  87.         0.0,
  88.         3.0
  89.     )
  90.  
  91.     while not pr.window_should_close():
  92.         if pr.is_key_pressed(pr.KEY_SPACE):
  93.             seed = np.random.randint(0, 2**31-1)
  94.             punti = genera_pista(seed)
  95.             start_idx = random.randint(0, len(punti)-1)
  96.  
  97.         pr.begin_drawing()
  98.         pr.clear_background(pr.RAYWHITE)
  99.         pr.begin_mode_2d(cam)
  100.  
  101.         disegna_sfondo(cam, args.screen_x, args.screen_y)
  102.         disegna_pista(punti)
  103.         disegna_partenza(punti, start_idx)
  104.  
  105.         pr.end_mode_2d()
  106.         pr.end_drawing()
  107.  
  108.     pr.close_window()
  109.  
Advertisement
Add Comment
Please, Sign In to add comment