kartrace 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kartrace-0.1.0/PKG-INFO +12 -0
- kartrace-0.1.0/kart_race.py +94 -0
- kartrace-0.1.0/kartrace.egg-info/PKG-INFO +12 -0
- kartrace-0.1.0/kartrace.egg-info/SOURCES.txt +7 -0
- kartrace-0.1.0/kartrace.egg-info/dependency_links.txt +1 -0
- kartrace-0.1.0/kartrace.egg-info/requires.txt +2 -0
- kartrace-0.1.0/kartrace.egg-info/top_level.txt +1 -0
- kartrace-0.1.0/setup.cfg +4 -0
- kartrace-0.1.0/setup.py +16 -0
kartrace-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kartrace
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A fast-paced kart racing game built with rayforge_burgerguy and pygame
|
|
5
|
+
Author: burgerguy
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Requires-Dist: rayforge_burgerguy
|
|
8
|
+
Requires-Dist: pygame
|
|
9
|
+
Dynamic: author
|
|
10
|
+
Dynamic: requires-dist
|
|
11
|
+
Dynamic: requires-python
|
|
12
|
+
Dynamic: summary
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""Kart racer built entirely from rayforge parts. python kart_race.py (add --demo to watch the AI drive you)
|
|
2
|
+
W/S throttle/brake, A/D steer, SHIFT/SPACE drift (hold in a corner, release for a mini-turbo), R restart, ESC quit."""
|
|
3
|
+
import math, random
|
|
4
|
+
import rayforge as rf
|
|
5
|
+
from rayforge import hud
|
|
6
|
+
|
|
7
|
+
COLORS = [(220, 40, 40), (40, 120, 230), (240, 200, 40), (60, 190, 80), (200, 80, 220), (240, 130, 30)]
|
|
8
|
+
SOUNDS = {"boost": "boost", "drift_boost": "drift_boost", "bump": "bump", "spin": "spin"}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class KartRace(rf.App):
|
|
12
|
+
title, width, height, scale = "Kart Race", 400, 250, 3
|
|
13
|
+
input_factory = staticmethod(lambda: rf.Input.racing())
|
|
14
|
+
|
|
15
|
+
def setup(self):
|
|
16
|
+
a, rng = self.args, random.Random(self.args.seed)
|
|
17
|
+
self.track = tr = rf.Track.preset("twisty", boost_at=[0.28, 0.62])
|
|
18
|
+
self.view = rf.Mode7Renderer(self.width, self.height, tr.image, scale=tr.scale,
|
|
19
|
+
sky_texture=rf.textures.sky_clouds(), fog=0.014)
|
|
20
|
+
self.snd = rf.SoundBank(enabled=not a.mute)
|
|
21
|
+
self.race = rf.Race(tr, laps=3, countdown=3.5)
|
|
22
|
+
self.tex = [rf.textures.kart(color=c) for c in COLORS]
|
|
23
|
+
self.racers = []
|
|
24
|
+
for i, pos in enumerate(tr.grid_positions(6)):
|
|
25
|
+
v = rf.Vehicle(*pos)
|
|
26
|
+
bot = i != 4 or a.demo
|
|
27
|
+
drv = rf.AIDriver(v, tr, skill=0.9 + 0.015 * i, lane=(-1) ** i * 0.4, seed=i) if bot else None
|
|
28
|
+
self.racers.append(self.race.add(rf.Racer(v, "YOU" if i == 4 else f"CPU{i}", drv, i == 4)))
|
|
29
|
+
self.me = self.racers[4]
|
|
30
|
+
self.cam = rf.ChaseCam(distance=5.0, height=2.1)
|
|
31
|
+
self.fx = rf.ParticleSystem(a.seed)
|
|
32
|
+
self.scenery, tree = [], rf.textures.tree()
|
|
33
|
+
for i in range(0, tr.n, 5):
|
|
34
|
+
h = tr.headings[i]; side = rng.choice((-1, 1)); off = tr.width / 2 + 3.5 + rng.random() * 6
|
|
35
|
+
x = tr.waypoints[i][0] - math.sin(h) * side * off; y = tr.waypoints[i][1] + math.cos(h) * side * off
|
|
36
|
+
if tr.surface_at(x, y) == rf.GRASS:
|
|
37
|
+
self.scenery.append(rf.M7Sprite(x, y, tree, size=3.2 + rng.random() * 1.5))
|
|
38
|
+
self.last_count = None
|
|
39
|
+
|
|
40
|
+
def update(self, dt):
|
|
41
|
+
inp, race = self.input, self.race
|
|
42
|
+
race.update(dt)
|
|
43
|
+
txt = race.countdown_text()
|
|
44
|
+
if txt != self.last_count and txt:
|
|
45
|
+
self.snd.play("go" if txt == "GO!" else "countdown")
|
|
46
|
+
self.last_count = txt
|
|
47
|
+
for r in self.racers:
|
|
48
|
+
v = r.vehicle
|
|
49
|
+
if not race.started:
|
|
50
|
+
continue
|
|
51
|
+
if r.driver is None and not r.finished:
|
|
52
|
+
th = inp.axis("brake", "accelerate")
|
|
53
|
+
ctrl = (th, inp.axis("left", "right"), False, inp.down("drift"))
|
|
54
|
+
else:
|
|
55
|
+
ctrl = r.driver.drive(dt) if r.driver else rf.AIDriver(v, self.track).drive()
|
|
56
|
+
v.update(dt, *ctrl, surface=self.track.surface_at(v.x, v.y))
|
|
57
|
+
if v.drifting and self.frame_no % 2 == 0:
|
|
58
|
+
bx, by = v.x - math.cos(v.heading) * 0.9, v.y - math.sin(v.heading) * 0.9
|
|
59
|
+
self.fx.emit(bx, by, 0.2, -v.vx * .1, -v.vy * .1, 1.5, 0.35, (255, 190, 60) if v.drift_time < 1.9 else (90, 190, 255), 0.18, 6)
|
|
60
|
+
for i, a in enumerate(self.racers):
|
|
61
|
+
for b in self.racers[i + 1:]:
|
|
62
|
+
a.vehicle.collide(b.vehicle)
|
|
63
|
+
race.rubber_band()
|
|
64
|
+
self.fx.update(dt)
|
|
65
|
+
self.snd.play_events(self.me.vehicle.pop_events(), SOUNDS)
|
|
66
|
+
for r in self.racers[:]:
|
|
67
|
+
if r is not self.me: r.vehicle.pop_events()
|
|
68
|
+
for ev, r in race.pop_events():
|
|
69
|
+
if r is self.me: self.snd.play("lap" if ev == "lap" else "win")
|
|
70
|
+
self.snd.engine(self.me.vehicle.speed_fraction * 0.9)
|
|
71
|
+
v = self.me.vehicle
|
|
72
|
+
self.cam.update(dt, v.x, v.y, v.heading)
|
|
73
|
+
if inp.pressed("restart"): self.setup()
|
|
74
|
+
|
|
75
|
+
def draw(self, screen):
|
|
76
|
+
sprites = self.scenery + [rf.M7Sprite(r.vehicle.x, r.vehicle.y, self.tex[i], size=1.9, heading=r.vehicle.heading)
|
|
77
|
+
for i, r in enumerate(self.racers)] + self.fx.mode7_sprites()
|
|
78
|
+
hud.blit_frame(screen, self.view.render(self.cam.cam, sprites))
|
|
79
|
+
W, H = screen.get_size(); race, me = self.race, self.me
|
|
80
|
+
hud.text(screen, f"LAP {race.current_lap(me)}/{race.laps}", (20, 14), 44)
|
|
81
|
+
hud.text(screen, f"{race.place(me)}/{len(self.racers)}", (W - 20, 14), 64, (255, 220, 80), anchor="topright")
|
|
82
|
+
hud.text(screen, f"{int(abs(me.vehicle.speed) * 9)} km/h", (W - 20, H - 20), 40, anchor="bottomright")
|
|
83
|
+
if me.best_lap: hud.text(screen, f"best {me.best_lap:.1f}s", (20, 60), 30)
|
|
84
|
+
c = race.countdown_text()
|
|
85
|
+
if c: hud.text(screen, c, (W // 2, H // 3), 160, (255, 230, 90), anchor="center")
|
|
86
|
+
hud.track_minimap(screen, self.track, [(r.vehicle.x, r.vehicle.y, COLORS[k]) for k, r in enumerate(self.racers)], (20, H - 190))
|
|
87
|
+
if me.finished:
|
|
88
|
+
hud.text(screen, "FINISH!", (W // 2, H // 3), 120, (255, 230, 90), anchor="center")
|
|
89
|
+
for i, r in enumerate(race.standings()):
|
|
90
|
+
hud.text(screen, f"{i + 1}. {r.name}", (W // 2, H // 2 + i * 34), 36, anchor="center")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if __name__ == "__main__":
|
|
94
|
+
KartRace().run()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kartrace
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A fast-paced kart racing game built with rayforge_burgerguy and pygame
|
|
5
|
+
Author: burgerguy
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Requires-Dist: rayforge_burgerguy
|
|
8
|
+
Requires-Dist: pygame
|
|
9
|
+
Dynamic: author
|
|
10
|
+
Dynamic: requires-dist
|
|
11
|
+
Dynamic: requires-python
|
|
12
|
+
Dynamic: summary
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
kart_race
|
kartrace-0.1.0/setup.cfg
ADDED
kartrace-0.1.0/setup.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from setuptools import setup
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name="kartrace",
|
|
5
|
+
version="0.1.0",
|
|
6
|
+
author="burgerguy",
|
|
7
|
+
description="A fast-paced kart racing game built with rayforge_burgerguy and pygame",
|
|
8
|
+
py_modules=["kart_race"],
|
|
9
|
+
python_requires=">=3.8",
|
|
10
|
+
install_requires=[
|
|
11
|
+
"rayforge_burgerguy",
|
|
12
|
+
"pygame"
|
|
13
|
+
],
|
|
14
|
+
# This treats the file as a direct executable script instead of looking for a function
|
|
15
|
+
scripts=["kart_race.py"],
|
|
16
|
+
)
|