Snake/Scripts/GameManager.gd
snoweuph 8b21cdcc6a Implement Game logic
TODO: Game UI with settings and start button, Gamepad input, visuals
2023-02-15 18:11:37 +01:00

118 lines
3.1 KiB
GDScript

extends Node
@export var map_size := 15
@export var texture : Texture2D
@export var scale := 32.0
@export var gaps := 4
@export var speed := 0.25
@export var tile_color := TileColors.new()
var tiles = []
var snake_move_vector : Vector2
var last_snake_move_vector : Vector2
var snake_length : int
var rng = RandomNumberGenerator.new()
var timer := 0.0
func generate_tiles():
for x in range(map_size):
tiles.append([])
tiles[x] = []
for y in range(map_size):
var tile = Tile.new()
tile.texture = texture
tile.tile_color = tile_color
tile.scale = Vector2(scale, scale)
tile.position = Vector2(x * ( scale + gaps ) - map_size / 2 * (scale + gaps), y * (scale + gaps) - map_size / 2 * (scale + gaps))
self.add_child(tile)
tiles[x].append([])
tiles[x][y] = tile
pass
func generate_apple():
var foundViablePosition := false
var tile : Tile
while !foundViablePosition:
tile = tiles[rng.randi_range(0, map_size -1)][rng.randi_range(0, map_size -1)] as Tile
if(tile.state == Tile.States.EMPTY):
foundViablePosition = true
tile.state = Tile.States.APPLE
pass
func set_snake_to_start_position():
#No need for float protection, godot automaticly converts floats to ints in this case
var tile = (tiles[map_size / 2][map_size / 2] as Tile)
tile.state = Tile.States.SNAKE
tile.snake_pos = 1
pass
func read_input() -> Vector2:#
# cant use Input.get_vector because it normalizes the vector
return Vector2(Input.get_axis("left", "right"), Input.get_axis("up", "down"))
func process_tiles():
var new_snake_head : Tile
for x in range(map_size):
for y in range(map_size):
var tile = tiles[x][y] as Tile
if tile.state == Tile.States.SNAKE:
if tile.snake_pos == 1:
if x + snake_move_vector.x >= map_size || x + snake_move_vector.x < 0 || y + snake_move_vector.y >= map_size || y + snake_move_vector.y < 0:
game_stop()
return
new_snake_head = tiles[x + snake_move_vector.x][y + snake_move_vector.y] as Tile
tile.snake_pos += 1
if(tile.snake_pos > snake_length):
tile.snake_pos = 0
tile.state = Tile.States.EMPTY
var was_apple = new_snake_head.state == Tile.States.APPLE
new_snake_head.snake_pos = 1
new_snake_head.state = Tile.States.SNAKE
last_snake_move_vector = snake_move_vector
if was_apple:
snake_length += 1
generate_apple()
pass
func process_snake_rotation():
var input = read_input()
print(input)
# Return if no Input or Input into multiple directions
if input.length() == 0 || input.length() > 1:
return
#return if input is the inverse of the moving direction
if input * -1 == last_snake_move_vector:
return
# set move direction into inpu direction
snake_move_vector = input.normalized()
func _ready():
game_start()
pass
func game_start():
snake_move_vector = Vector2.RIGHT
last_snake_move_vector = snake_move_vector
snake_length = 3
tiles.clear()
generate_tiles()
set_snake_to_start_position()
generate_apple()
pass
func game_stop():
print("dead")
pass
func _process(delta):
process_snake_rotation()
if(timer >= speed):
timer = 0
process_tiles()
timer += delta
pass