from ursina import * from ursina.prefabs.first_person_controller import FirstPersonController import random
app = Ursina()
game_over = False player = FirstPersonController() player.gravity = 0.5 player.cursor.visible = True player.speed = 5 player.position = (0, 2, 0) player.health = 100 player.sprint_speed = 10 # Sprint speed multiplier player.dash_distance = 5 # Dash distance player.dash_cooldown = 0 # Dash cooldown timer
shoot_sound = Audio('shoot.wav', autoplay=False) reload_sound = Audio('reload.wav', autoplay=False) pickup_sound = Audio('pickup.wav', autoplay=False) hit_sound = Audio('hit.wav', autoplay=False) sprint_sound = Audio('sprint.wav', autoplay=False) dash_sound = Audio('dash.wav', autoplay=False) grenade_sound = Audio('grenade.wav', autoplay=False)
ground = Entity(model='plane', texture='grass', scale=(200, 1, 200), collider='box') sky = Entity(model='sphere', texture='sky_sphere', scale=500, color=color.white, shader=lit_with_shadows_shader)
houses = [] for _ in range(150): position = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) house = Entity(model='cube', color=color.brown, scale=(random.randint(5, 15), 10, random.randint(5, 15)), position=position, collider='box') houses.append(house)
trees = [] for _ in range(100): position = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) tree = Entity(model='sphere', color=color.green, scale=1, position=position, collider='box') trees.append(tree)
road_material = Material(color=color.gray) roads = [] for _ in range(5): start_pos = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) road = Entity(model='cube', color=color.gray, scale=(random.randint(30, 100), 0.1, random.randint(3, 5)), position=start_pos, collider='box') roads.append(road)
loot_drops = [] loot_weapons = ['smg', 'rifle', 'sniper', 'shotgun'] weapon_stats = { 'smg': {'damage': 1, 'ammo': 30, 'reload': 1.5}, 'rifle': {'damage': 2, 'ammo': 25, 'reload': 2}, 'sniper': {'damage': 3, 'ammo': 10, 'reload': 3}, 'shotgun': {'damage': 5, 'ammo': 8, 'reload': 2.5} }
class LootDrop(Entity): def init(self, position): weapon = random.choice(loot_weapons) super().init(model='cube', color=color.orange, scale=2, position=position, collider='box') self.weapon = weapon self.material = Material(color=color.yellow) self.weapon_text = Text(text=weapon, parent=self, position=(0, 0.5), color=color.white)
def pickup(self):
pickup_sound.play()
player.weapon = self.weapon
destroy(self)
def spawn_loot_drop(): position = Vec3(random.randint(-100, 100), 1, random.randint(-100, 100)) loot = LootDrop(position) loot_drops.append(loot) invoke(spawn_loot_drop, delay=30)
class Enemy(Entity): def init(self, position, strength=1): super().init(model='cube', color=color.red, position=position, scale=(2,2,2), collider='box') self.health = 3 * strength self.speed = 1 + 0.5 * strength self.damage = 1 * strength self.attack_cooldown = 0 self.strength = strength self.health_bar = Entity(parent=self, model='cube', color=color.green, scale=(1, 0.1, 0.1), position=(0, 1.5, 0))
def update(self):
if distance(self, player) < 20:
self.look_at(player)
if distance(self, player) > 2:
self.position += self.forward * time.dt * self.speed
else:
self.attack()
def attack(self):
if self.attack_cooldown <= 0:
damage_player(self.damage)
self.attack_cooldown = 1
else:
self.attack_cooldown -= time.dt
def take_damage(self, amount):
self.health -= amount
hit_sound.play()
self.health_bar.scale_x = self.health / (3 * self.strength)
if self.health <= 0:
self.die()
def die(self):
explosion(self.position)
destroy(self)
if self in enemies:
enemies.remove(self)
def spawn_enemy(): strength = random.randint(1, 5) position = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) enemy = Enemy(position, strength) enemies.append(enemy) invoke(spawn_enemy, delay=random.randint(5, 10)) # Spawn new enemy every 5-10 seconds
def damage_player(amount): if game_over: return player.health -= amount if player.health <= 0: end_game()
def end_game(): global game_over game_over = True Text(text="Game Over", origin=(0, 0), scale=5, color=color.red) application.pause()
def input(key): if key == 'left mouse down': shoot() if key == 'r': reload_weapon() if key == 'shift': # Sprint start_sprint() if key == 'space': # Dash dash()
def shoot(): if hasattr(player, 'weapon'): shoot_sound.play() print(f"Shooting with {player.weapon}")
def reload_weapon(): reload_sound.play() print(f"Reloading {player.weapon}")
def start_sprint(): sprint_sound.play() player.speed = player.sprint_speed invoke(stop_sprint, delay=5) # Sprint lasts for 5 seconds
def stop_sprint(): player.speed = 5
def dash(): if player.dash_cooldown <= 0: dash_sound.play() player.position += player.forward * player.dash_distance player.dash_cooldown = 3 else: player.dash_cooldown -= time.dt
ammo_text = Text(text='', position=(-0.85, 0.45), origin=(0, 0), scale=2) weapon_text = Text(text="Weapon: None", position=(-0.85, 0.4), origin=(0, 0), scale=2) health_bar_bg = Entity(parent=camera.ui, model='quad', color=color.black, scale=(0.5, 0.03), position=(-0.6, 0.4)) health_bar = Entity(parent=health_bar_bg, model='quad', color=color.green, scale=(1, 1), position=(-0.25, 0))
You can use networking libraries like socket for full multiplayer support, but Ursina doesn't have built-in multiplayer
def update(): if game_over: return
ammo_text.text = f'Ammo: {weapon_stats.get(player.weapon, {}).get("ammo", 0)}' if hasattr(player, 'weapon') else "Ammo: 0"
health_bar.scale_x = max(player.health / 100, 0)
# Update loot drops
for loot in loot_drops[:]:
if player.intersects(loot).hit:
loot.pickup()
loot_drops.remove(loot)
# Update enemies
for enemy in enemies[:]:
enemy.update()
# Cooldowns
if player.dash_cooldown > 0:
player.dash_cooldown -= time.dt
invoke(spawn_loot_drop, delay=30) invoke(spawn_enemy, delay=5)
enemies = [] app.run()from ursina import * from ursina.prefabs.first_person_controller import FirstPersonController import random
app = Ursina()
game_over = False player = FirstPersonController() player.gravity = 0.5 player.cursor.visible = True player.speed = 5 player.position = (0, 2, 0) player.health = 100 player.sprint_speed = 10 # Sprint speed multiplier player.dash_distance = 5 # Dash distance player.dash_cooldown = 0 # Dash cooldown timer
shoot_sound = Audio('shoot.wav', autoplay=False) reload_sound = Audio('reload.wav', autoplay=False) pickup_sound = Audio('pickup.wav', autoplay=False) hit_sound = Audio('hit.wav', autoplay=False) sprint_sound = Audio('sprint.wav', autoplay=False) dash_sound = Audio('dash.wav', autoplay=False) grenade_sound = Audio('grenade.wav', autoplay=False)
ground = Entity(model='plane', texture='grass', scale=(200, 1, 200), collider='box') sky = Entity(model='sphere', texture='sky_sphere', scale=500, color=color.white, shader=lit_with_shadows_shader)
houses = [] for _ in range(150): position = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) house = Entity(model='cube', color=color.brown, scale=(random.randint(5, 15), 10, random.randint(5, 15)), position=position, collider='box') houses.append(house)
trees = [] for _ in range(100): position = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) tree = Entity(model='sphere', color=color.green, scale=1, position=position, collider='box') trees.append(tree)
road_material = Material(color=color.gray) roads = [] for _ in range(5): start_pos = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) road = Entity(model='cube', color=color.gray, scale=(random.randint(30, 100), 0.1, random.randint(3, 5)), position=start_pos, collider='box') roads.append(road)
loot_drops = [] loot_weapons = ['smg', 'rifle', 'sniper', 'shotgun'] weapon_stats = { 'smg': {'damage': 1, 'ammo': 30, 'reload': 1.5}, 'rifle': {'damage': 2, 'ammo': 25, 'reload': 2}, 'sniper': {'damage': 3, 'ammo': 10, 'reload': 3}, 'shotgun': {'damage': 5, 'ammo': 8, 'reload': 2.5} }
class LootDrop(Entity): def init(self, position): weapon = random.choice(loot_weapons) super().init(model='cube', color=color.orange, scale=2, position=position, collider='box') self.weapon = weapon self.material = Material(color=color.yellow) self.weapon_text = Text(text=weapon, parent=self, position=(0, 0.5), color=color.white)
def pickup(self):
pickup_sound.play()
player.weapon = self.weapon
destroy(self)
def spawn_loot_drop(): position = Vec3(random.randint(-100, 100), 1, random.randint(-100, 100)) loot = LootDrop(position) loot_drops.append(loot) invoke(spawn_loot_drop, delay=30)
class Enemy(Entity): def init(self, position, strength=1): super().init(model='cube', color=color.red, position=position, scale=(2,2,2), collider='box') self.health = 3 * strength self.speed = 1 + 0.5 * strength self.damage = 1 * strength self.attack_cooldown = 0 self.strength = strength self.health_bar = Entity(parent=self, model='cube', color=color.green, scale=(1, 0.1, 0.1), position=(0, 1.5, 0))
def update(self):
if distance(self, player) < 20:
self.look_at(player)
if distance(self, player) > 2:
self.position += self.forward * time.dt * self.speed
else:
self.attack()
def attack(self):
if self.attack_cooldown <= 0:
damage_player(self.damage)
self.attack_cooldown = 1
else:
self.attack_cooldown -= time.dt
def take_damage(self, amount):
self.health -= amount
hit_sound.play()
self.health_bar.scale_x = self.health / (3 * self.strength)
if self.health <= 0:
self.die()
def die(self):
explosion(self.position)
destroy(self)
if self in enemies:
enemies.remove(self)
def spawn_enemy(): strength = random.randint(1, 5) position = Vec3(random.randint(-100, 100), 0, random.randint(-100, 100)) enemy = Enemy(position, strength) enemies.append(enemy) invoke(spawn_enemy, delay=random.randint(5, 10)) # Spawn new enemy every 5-10 seconds
def damage_player(amount): if game_over: return player.health -= amount if player.health <= 0: end_game()
def end_game(): global game_over game_over = True Text(text="Game Over", origin=(0, 0), scale=5, color=color.red) application.pause()
def input(key): if key == 'left mouse down': shoot() if key == 'r': reload_weapon() if key == 'shift': # Sprint start_sprint() if key == 'space': # Dash dash()
def shoot(): if hasattr(player, 'weapon'): shoot_sound.play() print(f"Shooting with {player.weapon}")
def reload_weapon(): reload_sound.play() print(f"Reloading {player.weapon}")
def start_sprint(): sprint_sound.play() player.speed = player.sprint_speed invoke(stop_sprint, delay=5) # Sprint lasts for 5 seconds
def stop_sprint(): player.speed = 5
def dash(): if player.dash_cooldown <= 0: dash_sound.play() player.position += player.forward * player.dash_distance player.dash_cooldown = 3 else: player.dash_cooldown -= time.dt
ammo_text = Text(text='', position=(-0.85, 0.45), origin=(0, 0), scale=2) weapon_text = Text(text="Weapon: None", position=(-0.85, 0.4), origin=(0, 0), scale=2) health_bar_bg = Entity(parent=camera.ui, model='quad', color=color.black, scale=(0.5, 0.03), position=(-0.6, 0.4)) health_bar = Entity(parent=health_bar_bg, model='quad', color=color.green, scale=(1, 1), position=(-0.25, 0))
You can use networking libraries like socket for full multiplayer support, but Ursina doesn't have built-in multiplayer
def update(): if game_over: return
ammo_text.text = f'Ammo: {weapon_stats.get(player.weapon, {}).get("ammo", 0)}' if hasattr(player, 'weapon') else "Ammo: 0"
health_bar.scale_x = max(player.health / 100, 0)
# Update loot drops
for loot in loot_drops[:]:
if player.intersects(loot).hit:
loot.pickup()
loot_drops.remove(loot)
# Update enemies
for enemy in enemies[:]:
enemy.update()
# Cooldowns
if player.dash_cooldown > 0:
player.dash_cooldown -= time.dt
invoke(spawn_loot_drop, delay=30) invoke(spawn_enemy, delay=5)
enemies = [] app.run()