Skip to content

Instantly share code, notes, and snippets.

@horstjens
Created December 16, 2023 10:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save horstjens/710b4f3030639a860a16f7be97ea7105 to your computer and use it in GitHub Desktop.
Save horstjens/710b4f3030639a860a16f7be97ea7105 to your computer and use it in GitHub Desktop.
spacebattle2
import vpython as vp
import random
class Game:
beams = []
scene=vp.canvas(title="Space fight")
# xyz
#vp.arrow(axis=vp.vector(1,0,0), color=vp.color.red)
vp.text(pos=vp.vector(1.5,0,0), text="x",
color=vp.color.red, height=0.1)
#vp.arrow(axis=vp.vector(0,1,0), color=vp.color.green)
vp.text(pos=vp.vector(0,1.5,0), text="y",
color=vp.color.green, height=0.1)
#vp.arrow(axis=vp.vector(0,0,1), color=vp.color.blue)
vp.text(pos=vp.vector(0,0,1.5), text="z",
color=vp.color.blue, height=0.1)
# create 100 balls
for _ in range(100):
p = vp.vector(random.uniform(-50,50),
random.uniform(-50,50),
random.uniform(-50,50))
if vp.mag(p) < 5:
continue
c = random.uniform(0.3, 0.9)
vp.sphere(pos=p,
color=vp.vector(c,c,c),
radius=random.uniform(0.5, 1.5))
ground = vp.box(pos=vp.vector(0,0,0),
size=vp.vector(100,0.01,100),
color=vp.color.cyan,
opacity=0.25,
)
dussel20 = vp.cone(color=vp.color.blue,
radius=0.2,
pos=vp.vector(1,1,1))
#body = vp.cylinder(color=vp.color.red,
# radius=0.1,
# axis=vp.vector(0.5,0,0),
# pos=vp.vector(0,0,0))
body2 = vp.cone(color=vp.color.red,
radius=0.1,
axis=vp.vector(1,0,0),
pos=vp.vector(0,0,0))
wing1 = vp.box(color=vp.vector(0.7,0.7,0.7),
pos=vp.vector(0.25,0,0),
axis=vp.vector(0,0,1),
size=vp.vector(1.5,0.01,0.25))
#vp.arrow(color=vp.color.yellow, axis=wing1.up)
wing1.up=vp.vector(0,1,0.1)
wing2 = vp.box(color=vp.vector(0.7,0.7,0.7),
pos=vp.vector(0.25,0,0),
axis=vp.vector(0,0,1),
size=vp.vector(1.5,0.01,0.25))
wing2.up=vp.vector(0,1,-0.1)
engine1 = vp.cylinder(color=vp.color.white,
pos=vp.vector(0,0.05,0.15),
axis=vp.vector(0.5,0,0),
radius=0.04)
engine2 = vp.cylinder(color=vp.color.white,
pos=vp.vector(0,0.05,-0.15),
axis=vp.vector(0.5,0,0),
radius=0.04)
engine3 = vp.cylinder(color=vp.color.white,
pos=vp.vector(0,-0.05,0.15),
axis=vp.vector(0.5,0,0),
radius=0.04)
engine4 = vp.cylinder(color=vp.color.white,
pos=vp.vector(0,-0.05,-0.15),
axis=vp.vector(0.5,0,0),
radius=0.04)
player=vp.compound([body2, wing1, wing2, engine1, engine2,
engine3, engine4])
#player.pos = vp.vector(-60,10,-60)
player.axis = vp.vector(0,0,1)
class Laser(vp.cylinder):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.pos = vp.vector(player.pos.x, player.pos.y, player.pos.z)
self.axis = vp.vector(player.axis.x, player.axis.y, player.axis.z)
self.color = vp.color.green
self.radius = 0.01
self.speed = 20.3
self.age = 0
self.max_age = 2.0
self.emissive = True
Game.beams.append(self)
#def camerapos():
# return player.pos + vp.norm(player.axis) * -3.0 + vp.norm(player.up) * 0.5
#Game.scene.camera.follow(player)
#Game.scene.camera.follow(camerapos)
Game.scene.autoscale = False
player.speed = 0
while True:
vp.rate(60)
# update camera
Game.scene.camera.pos = player.pos + vp.norm(player.axis) * -0.2 + vp.norm(player.up) * 0.05
Game.scene.center = player.pos
keys=vp.keysdown()
print(keys)
#if "1" in keys:
# player.speed = 0
#if "2" in keys:
# player.speed = 10
if "shift" in keys:
if player.speed < 10:
player.speed += 0.01
else:
if player.speed > 0:
player.speed -= 0.01
else:
player.speed = 0
player.pos += vp.norm(player.axis) * player.speed * 1/60
if ("q" in keys) or ("Q" in keys):
player.rotate(angle=-0.1,
axis=player.axis)
if ("e" in keys) or ("E" in keys):
player.rotate(angle=0.1,
axis=player.axis)
if ("w" in keys) or ("W" in keys):
player.rotate(angle=0.1,
axis=vp.cross(player.up,
player.axis))
if ("s" in keys) or ("S" in keys):
player.rotate(angle=-0.1,
axis=vp.cross(player.up,
player.axis))
if ("a" in keys) or ("A" in keys):
player.rotate(angle=0.1,
axis=player.up)
if ("d" in keys) or ("D" in keys):
player.rotate(angle=-0.1,
axis=player.up)
if ("x" in keys) or ("X" in keys):
Laser()
# if "shift" in keys:
# print(keys)
for beam in Game.beams:
beam.pos += vp.norm(beam.axis) * beam.speed * 1/60
beam.age += 1/60
if beam.age > beam.max_age:
beam.visible = False
Game.beams = [beam for beam in Game.beams if
beam.age <= beam.max_age]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment