From 8de3ee2c9a720bdc9b8f2c8eec88901dbed9db24 Mon Sep 17 00:00:00 2001 From: Martin Opat Date: Fri, 2 Jan 2026 22:03:29 +0100 Subject: [PATCH] Prey is now reflected to be smooth across periodic boundary too --- evolve-die-repeat/game_manager.gd | 4 + .../molecular/molecular_player.gd | 2 +- .../molecular/nucleotide_prey.gd | 109 +++++++++++++++++- evolve-die-repeat/molecular/preyManager.gd | 1 + 4 files changed, 113 insertions(+), 3 deletions(-) diff --git a/evolve-die-repeat/game_manager.gd b/evolve-die-repeat/game_manager.gd index f55f894..2366d1f 100644 --- a/evolve-die-repeat/game_manager.gd +++ b/evolve-die-repeat/game_manager.gd @@ -1,6 +1,10 @@ extends Node var screen_size = Vector2(1920.0, 1080.0) # Default screen size (this is a float for some reason) +var viewport_size + +func _ready() -> void: + viewport_size = get_viewport().get_visible_rect().size # TODO: This needs to be called from a script inheriting a CharacterBody2D (e.g. the player) # Alternative would be to pass the player reference to this script (which might be better?) diff --git a/evolve-die-repeat/molecular/molecular_player.gd b/evolve-die-repeat/molecular/molecular_player.gd index ec6b3bb..8bb7b2d 100644 --- a/evolve-die-repeat/molecular/molecular_player.gd +++ b/evolve-die-repeat/molecular/molecular_player.gd @@ -3,7 +3,7 @@ extends CharacterBody2D @export var speed = 200 var damage = 1 -func _ready(): +func _ready() -> void: var screen_size = get_viewport_rect().size GameManager.init_screen_size(screen_size.x, screen_size.y) diff --git a/evolve-die-repeat/molecular/nucleotide_prey.gd b/evolve-die-repeat/molecular/nucleotide_prey.gd index 489d0b4..723004a 100644 --- a/evolve-die-repeat/molecular/nucleotide_prey.gd +++ b/evolve-die-repeat/molecular/nucleotide_prey.gd @@ -2,16 +2,30 @@ extends AbstractPrey2D @onready var sprite = get_node("AnimatedSprite2D") +# Mirroed sprites for periodic boundary +var mirrorSprite1: Node2D +var mirrorSprite2: Node2D +var mirrorSprite3: Node2D + + # Called when the node enters the scene tree for the first time. func _ready() -> void: $AnimatedSprite2D.animation = "Healthy" $AnimatedSprite2D.play() - pass # Replace with function body. + + mirrorSprite1 = sprite.duplicate() + mirrorSprite2 = sprite.duplicate() + mirrorSprite3 = sprite.duplicate() + + add_child(mirrorSprite1) + add_child(mirrorSprite2) + add_child(mirrorSprite3) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - return + # Boundary mirroring + _handle_wrapping() func _physics_process(delta: float) -> void: self.move(Vector3(randfn(0, 1), randfn(0, 1), 0)) @@ -42,3 +56,94 @@ func handle_collision_player(player): self.die() else: sprite.play("Injured") + +# FIXME: Doesn't work with injured sprite +# Mirroring table: +# |---|---|---|---| +# | 4 | 3 | 4 | 3 | +# |---|===|===|---| +# | 1 ǁ 2 | 1 ǁ 2 | +# |---ǁ---|---ǁ---| +# | 4 ǁ 3 | 4 ǁ 3 | +# |---|===|===|---| +# | 1 | 2 | 1 | 2 | +# |---|---|---|---| +# If less than viewport size away from an edge, mirror over that edge (for seamless boundary) +# NOTE: For this to look correctly the camera size should be smaller than half the screen port (in +# any one dimension. Ideally, the difference between camera size and half the screen port is +# at least the size of the prey sprite) +func _handle_wrapping(): + mirrorSprite1.visible = false + mirrorSprite2.visible = false + mirrorSprite3.visible = false + + # TODO: Assume viewport size << screen size and only draw according to GameManager.viewport_size + # Find corresponding section of the screen + if position.x < GameManager.screen_size.x/2 and position.y < GameManager.screen_size.y/2: + # 2 + mirrorSprite1.visible = true + mirrorSprite2.visible = true + mirrorSprite3.visible = true + + # Right + #mirrorSprite1.position = Vector2(sprite.position.x + GameManager.screen_size.x, sprite.position.y) + mirrorSprite1.position = Vector2(GameManager.screen_size.x, 0) + # Diag + #mirrorSprite2.position = Vector2(sprite.position.x + GameManager.screen_size.x, sprite.position.y + GameManager.screen_size.y) + mirrorSprite3.position = Vector2(GameManager.screen_size.x, GameManager.screen_size.y) + # Bottom + #mirrorSprite3.position = Vector2(sprite.position.x, sprite.position.y + GameManager.screen_size.y) + mirrorSprite2.position = Vector2(0, GameManager.screen_size.y) + + + elif position.x < GameManager.screen_size.x/2: + # 3 + mirrorSprite1.visible = true + mirrorSprite2.visible = true + mirrorSprite3.visible = true + + # Top + #mirrorSprite1.position = Vector2(sprite.position.x, sprite.position.y - GameManager.screen_size.y) + mirrorSprite1.position = Vector2(0, - GameManager.screen_size.y) + # Diag + #mirrorSprite2.position = Vector2(sprite.position.x + GameManager.screen_size.x, sprite.position.y - GameManager.screen_size.y) + mirrorSprite2.position = Vector2(GameManager.screen_size.x, - GameManager.screen_size.y) + # Right + #mirrorSprite3.position = Vector2(sprite.position.x + GameManager.screen_size.x, sprite.position.y) + mirrorSprite3.position = Vector2(GameManager.screen_size.x, 0) + + + elif position.y < GameManager.screen_size.y/2: + # 1 + mirrorSprite1.visible = true + mirrorSprite2.visible = true + mirrorSprite3.visible = true + + # Left + #mirrorSprite1.position = Vector2(sprite.position.x - GameManager.screen_size.x, sprite.position.y) + mirrorSprite1.position = Vector2(- GameManager.screen_size.x, 0) + # Bottom + #mirrorSprite2.position = Vector2(sprite.position.x, sprite.position.y + GameManager.screen_size.y) + mirrorSprite2.position = Vector2(0, GameManager.screen_size.y) + # Diag + #mirrorSprite3.position = Vector2(sprite.position.x - GameManager.screen_size.x, sprite.position.y + GameManager.screen_size.y) + mirrorSprite3.position = Vector2(- GameManager.screen_size.x, GameManager.screen_size.y) + + + else: + # 4 + mirrorSprite1.visible = true + mirrorSprite2.visible = true + mirrorSprite3.visible = true + + # Left + #mirrorSprite1.position = Vector2(sprite.position.x - GameManager.screen_size.x, sprite.position.y) + mirrorSprite1.position = Vector2(- GameManager.screen_size.x, 0) + # Diag + #mirrorSprite2.position = Vector2(sprite.position.x - GameManager.screen_size.x, sprite.position.y - GameManager.screen_size.y) + mirrorSprite2.position = Vector2(- GameManager.screen_size.x, - GameManager.screen_size.y) + # Top + #mirrorSprite3.position = Vector2(sprite.position.x, sprite.position.y - GameManager.screen_size.y) + mirrorSprite3.position = Vector2(0, - GameManager.screen_size.y) + + diff --git a/evolve-die-repeat/molecular/preyManager.gd b/evolve-die-repeat/molecular/preyManager.gd index f170db1..4bea20d 100644 --- a/evolve-die-repeat/molecular/preyManager.gd +++ b/evolve-die-repeat/molecular/preyManager.gd @@ -25,3 +25,4 @@ func spawn_creature(scene, position: Vector2) -> void: var instance = scene.instantiate() instance.position = position add_child(instance) +