generate level not from code
This commit is contained in:
+18
-116
@@ -3,17 +3,17 @@ extends Node3D
|
||||
const PLAYER_SCENE := preload("res://scenes/Player.tscn")
|
||||
const ENEMY_SCENE := preload("res://scenes/Enemy.tscn")
|
||||
const ROCK_SCENE := preload("res://scenes/Rock.tscn")
|
||||
const LEVEL_SCENE := preload("res://scenes/Level.tscn")
|
||||
|
||||
const ARENA := 14.0
|
||||
const WALL_T := 1.2
|
||||
const CAM_DIST := 8.0
|
||||
const MOUSE_SENS := 0.18
|
||||
const PITCH_MIN := 5.0
|
||||
const PITCH_MAX := 70.0
|
||||
const SPAWN_TIME := 10
|
||||
|
||||
var cam_yaw: float = 0.0
|
||||
var cam_pitch: float = 28.0
|
||||
var arena_size: float = 14.0
|
||||
var cam_yaw: float = 0.0
|
||||
var cam_pitch: float = 28.0
|
||||
|
||||
@onready var spawn_timer: Timer = $SpawnTimer
|
||||
|
||||
@@ -38,8 +38,7 @@ var upgrade_panel: Panel
|
||||
var gameover_panel: Panel
|
||||
|
||||
func _ready() -> void:
|
||||
_create_environment()
|
||||
_create_arena()
|
||||
_spawn_level()
|
||||
_create_camera()
|
||||
_create_ui()
|
||||
_spawn_player()
|
||||
@@ -61,111 +60,14 @@ func _input(event: InputEvent) -> void:
|
||||
else:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
# ─── Environment ──────────────────────────────────────────────────────────────
|
||||
# ─── Level ────────────────────────────────────────────────────────────────────
|
||||
|
||||
func _create_environment() -> void:
|
||||
var env := Environment.new()
|
||||
env.background_mode = Environment.BG_COLOR
|
||||
env.background_color = Color(0.04, 0.04, 0.08)
|
||||
env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
|
||||
env.ambient_light_color = Color(0.35, 0.35, 0.5)
|
||||
env.ambient_light_energy = 0.6
|
||||
var we := WorldEnvironment.new()
|
||||
we.environment = env
|
||||
add_child(we)
|
||||
|
||||
var sun := DirectionalLight3D.new()
|
||||
sun.rotation_degrees = Vector3(-55, -25, 0)
|
||||
sun.light_energy = 1.8
|
||||
sun.shadow_enabled = true
|
||||
add_child(sun)
|
||||
|
||||
# ─── Arena ────────────────────────────────────────────────────────────────────
|
||||
|
||||
func _create_arena() -> void:
|
||||
var floor_mat := StandardMaterial3D.new()
|
||||
floor_mat.albedo_color = Color(0.12, 0.12, 0.18)
|
||||
floor_mat.roughness = 1.0
|
||||
|
||||
# Floor mesh (visual only)
|
||||
var fm := MeshInstance3D.new()
|
||||
var plane := PlaneMesh.new()
|
||||
plane.size = Vector2(ARENA * 2, ARENA * 2)
|
||||
plane.subdivide_width = 8
|
||||
plane.subdivide_depth = 8
|
||||
fm.mesh = plane
|
||||
fm.material_override = floor_mat
|
||||
add_child(fm)
|
||||
|
||||
# Floor collider
|
||||
var fb := StaticBody3D.new()
|
||||
var fc := CollisionShape3D.new()
|
||||
var fs := BoxShape3D.new()
|
||||
fs.size = Vector3(ARENA * 2, 0.2, ARENA * 2)
|
||||
fc.shape = fs
|
||||
fb.position.y = -0.1
|
||||
fb.add_child(fc)
|
||||
add_child(fb)
|
||||
|
||||
# Grid lines on floor
|
||||
_draw_grid()
|
||||
|
||||
# Four walls
|
||||
var wall_mat := StandardMaterial3D.new()
|
||||
wall_mat.albedo_color = Color(0.28, 0.28, 0.42)
|
||||
wall_mat.roughness = 0.9
|
||||
wall_mat.metallic = 0.1
|
||||
|
||||
_make_wall(Vector3(0, 0.5, -(ARENA + WALL_T * 0.5)),
|
||||
Vector3(ARENA * 2 + WALL_T * 2, 1.0, WALL_T), wall_mat)
|
||||
_make_wall(Vector3(0, 0.5, (ARENA + WALL_T * 0.5)),
|
||||
Vector3(ARENA * 2 + WALL_T * 2, 1.0, WALL_T), wall_mat)
|
||||
_make_wall(Vector3(-(ARENA + WALL_T * 0.5), 0.5, 0),
|
||||
Vector3(WALL_T, 1.0, ARENA * 2), wall_mat)
|
||||
_make_wall(Vector3( (ARENA + WALL_T * 0.5), 0.5, 0),
|
||||
Vector3(WALL_T, 1.0, ARENA * 2), wall_mat)
|
||||
|
||||
func _make_wall(pos: Vector3, size: Vector3, mat: StandardMaterial3D) -> void:
|
||||
var body := StaticBody3D.new()
|
||||
body.position = pos
|
||||
body.set_meta("is_wall", true)
|
||||
|
||||
var col := CollisionShape3D.new()
|
||||
var shape := BoxShape3D.new()
|
||||
shape.size = size
|
||||
col.shape = shape
|
||||
body.add_child(col)
|
||||
|
||||
var msh := MeshInstance3D.new()
|
||||
var box := BoxMesh.new()
|
||||
box.size = size
|
||||
msh.mesh = box
|
||||
msh.material_override = mat
|
||||
body.add_child(msh)
|
||||
|
||||
add_child(body)
|
||||
|
||||
func _draw_grid() -> void:
|
||||
# Subtle grid as thin quads
|
||||
var grid_mat := StandardMaterial3D.new()
|
||||
grid_mat.albedo_color = Color(0.2, 0.2, 0.3, 0.5)
|
||||
grid_mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
|
||||
grid_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||||
var step := 4.0
|
||||
var n := int(ARENA / step)
|
||||
for i in range(-n, n + 1):
|
||||
for axis in [0, 1]:
|
||||
var msh := MeshInstance3D.new()
|
||||
var box := BoxMesh.new()
|
||||
if axis == 0:
|
||||
box.size = Vector3(0.05, 0.01, ARENA * 2)
|
||||
msh.position = Vector3(i * step, 0.005, 0)
|
||||
else:
|
||||
box.size = Vector3(ARENA * 2, 0.01, 0.05)
|
||||
msh.position = Vector3(0, 0.005, i * step)
|
||||
msh.mesh = box
|
||||
msh.material_override = grid_mat
|
||||
add_child(msh)
|
||||
func _spawn_level() -> void:
|
||||
var level := LEVEL_SCENE.instantiate()
|
||||
add_child(level)
|
||||
var sz = level.get("arena_size")
|
||||
if sz != null:
|
||||
arena_size = float(sz)
|
||||
|
||||
# ─── Camera ───────────────────────────────────────────────────────────────────
|
||||
|
||||
@@ -196,7 +98,7 @@ func _spawn_rocks() -> void:
|
||||
var rock := ROCK_SCENE.instantiate()
|
||||
add_child(rock)
|
||||
var angle := randf() * TAU
|
||||
var dist := randf_range(3.5, ARENA - 2.0)
|
||||
var dist := randf_range(3.5, arena_size - 2.0)
|
||||
rock.position = Vector3(cos(angle) * dist, 0.0, sin(angle) * dist)
|
||||
|
||||
# ─── Player ───────────────────────────────────────────────────────────────────
|
||||
@@ -243,12 +145,12 @@ func _spawn_enemy() -> void:
|
||||
|
||||
# Spawn at random edge
|
||||
var side := randi() % 4
|
||||
var r := randf_range(-(ARENA - 1.0), ARENA - 1.0)
|
||||
var r := randf_range(-(arena_size - 1.0), arena_size - 1.0)
|
||||
match side:
|
||||
0: enemy.position = Vector3(r, 0, -(ARENA - 0.5))
|
||||
1: enemy.position = Vector3(r, 0, (ARENA - 0.5))
|
||||
2: enemy.position = Vector3(-(ARENA - 0.5), 0, r)
|
||||
3: enemy.position = Vector3( (ARENA - 0.5), 0, r)
|
||||
0: enemy.position = Vector3(r, 0, -(arena_size - 0.5))
|
||||
1: enemy.position = Vector3(r, 0, (arena_size - 0.5))
|
||||
2: enemy.position = Vector3(-(arena_size - 0.5), 0, r)
|
||||
3: enemy.position = Vector3( (arena_size - 0.5), 0, r)
|
||||
|
||||
func add_bonus_score(amount: int) -> void:
|
||||
score += amount
|
||||
|
||||
Reference in New Issue
Block a user