Untitled
unknown
batchfile
a year ago
4.6 kB
9
Indexable
extends Node2D
@export var floor_scene: PackedScene = null
@export var player_scene: PackedScene = null
@export var platform_scene: PackedScene = null
@export var moving_scene: PackedScene = null
@export var teleportation_scene: PackedScene = null
@export var cactus_scene: PackedScene = null
@export var enemy_scene: PackedScene = null
@export var projectile_scene: PackedScene = null
const platform_increment = 5
const platform_y_increment = 25
const level_width = 250
const floor_space = 10
const door_space = 20
const player_death_y = 100
var floor = null
var player = null
var door = null
var platforms = []
var cacti = []
var players_in_door = []
var enemies = []
var projectiles = []
var enemy_shoot_range = 30
var enemy_shoot_interval = 5
var num_platforms = 0
func _ready():
self.create_floor()
self.create_player()
self.create_door()
self.reset_game()
func reset_game():
self.reset_player()
for platform in self.platforms:
if is_instance_valid(platform):
platform.queue_free()
self.platforms = []
for cact in self.cacti:
if is_instance_valid(cact):
cact.queue_free()
self.cacti = []
self.enemies = []
for projectile in self.projectiles:
if is_instance_valid(projectile):
projectile.queue_free()
self.projectiles = []
self.next_level()
func create_floor():
self.floor = self.floor_scene.instantiate()
self.add_child(floor)
func create_player():
self.player = self.player_scene.instantiate()
self.add_child(player)
func create_door():
self.door = get_node("Door")
func reset_player():
self.player.health = 100
self.player.position = Vector2(-self.floor_space - self.level_width / 2, -self.floor_space)
self.player.linear_velocity = Vector2(0, 0)
self.player.angular_velocity = 0
func next_level():
self.num_platforms += self.platform_increment
self.generate_platforms()
func generate_platforms():
var prev_y = 0
var prev_x = 0
var same_direction_remaining = randi_range(3,5)
var direction = 1
for i in self.num_platforms:
# Godot y axis is flipped
prev_y -= platform_y_increment
var new_platform
var new_cactus
var created=false
var generate_moving_platform = randi_range(1,3) == 3
for j in 1 if generate_moving_platform else 2:
# Choose between the three types randomly
var one_to_three = 3 if generate_moving_platform else randi_range(1,2)
# New platforms
if one_to_three == 1:
new_platform = self.platform_scene.instantiate()
var random_float = randf_range(0,10)
if random_float < 3:
created=true
new_cactus=self.cactus_scene.instantiate()
elif random_float >= 2 and random_float < 6:
created=true
new_cactus = self.enemy_scene.instantiate()
self.enemies.append(new_cactus)
elif one_to_three == 2:
new_platform = self.teleportation_scene.instantiate()
elif one_to_three == 3:
new_platform = self.moving_scene.instantiate()
prev_x += randf_range(30,80) * direction;
same_direction_remaining -= 1
if same_direction_remaining == 0:
direction = -direction
same_direction_remaining = randi_range(3,5)
new_platform.position = Vector2(prev_x, prev_y)
if created:
var offset = randf_range(-7.5,7.5)
new_cactus.position = Vector2(prev_x+offset, prev_y-7.5)
created=false
if new_platform:
self.platforms.append(new_platform)
self.add_child(new_platform)
if new_cactus:
self.cacti.append(new_cactus)
self.add_child(new_cactus)
if i == self.num_platforms - 1:
self.door.position.x = new_platform.position.x
self.door.position.y = prev_y - self.door_space
func _physics_process(delta):
if player != null and player.position.y >= player_death_y:
self.reset_player()
if players_in_door.size() >= 1:
self.reset_game()
if player.health<=0:
self.reset_player()
if player != null:
for enemy in self.enemies:
if enemy.position.distance_to(player.position) <= enemy_shoot_range:
var now = Time.get_unix_time_from_system()
if now - enemy.last_fired < enemy_shoot_interval:
continue
var projectile = self.projectile_scene.instantiate()
projectile.position = enemy.position
self.add_child(projectile)
self.projectiles.append(projectile)
enemy.last_fired = now
func _on_door_body_entered(body):
if body.is_in_group("players"):
self.players_in_door.append(body)
func _on_door_body_exited(body):
self.players_in_door.erase(body)
Editor is loading...
Leave a Comment