67 lines
1.6 KiB
GDScript
67 lines
1.6 KiB
GDScript
extends Control
|
|
|
|
const CELL_SIZE = 12
|
|
const COLOR_EMPTY = Color(0.0, 0.0, 0.0, 0.0)
|
|
const COLOR_APPLE = Color8(255, 112, 133)
|
|
const COLOR_SNAKE = preload("./snake_gradient.tres")
|
|
|
|
@export var tex_rect:TextureRect
|
|
|
|
const KEY_SCHEME = {
|
|
KEY_UP: Vector2.UP,
|
|
KEY_DOWN: Vector2.DOWN,
|
|
KEY_LEFT: Vector2.LEFT,
|
|
KEY_RIGHT: Vector2.RIGHT,
|
|
}
|
|
|
|
var snake_game := preload("./snake.gd").new()
|
|
var cached_input := Vector2.RIGHT
|
|
var delay := 0.5
|
|
var img_buffer:Image
|
|
|
|
func _ready():
|
|
img_buffer = Image.create(
|
|
CELL_SIZE * snake_game.MAP_SIZE,
|
|
CELL_SIZE * snake_game.MAP_SIZE,
|
|
false, Image.FORMAT_RGBA8)
|
|
draw()
|
|
|
|
func draw():
|
|
# draw background
|
|
img_buffer.fill(COLOR_EMPTY)
|
|
|
|
# draw snake
|
|
var gradient = GradientTexture1D.new()
|
|
for i in range(snake_game.snake_arr.size()):
|
|
var s = snake_game.snake_arr[i]
|
|
img_buffer.fill_rect(
|
|
Rect2i(s * CELL_SIZE, Vector2.ONE * CELL_SIZE),
|
|
COLOR_SNAKE.sample(1.0 * i / snake_game.snake_arr.size())
|
|
)
|
|
|
|
# draw apple
|
|
img_buffer.fill_rect(
|
|
Rect2i(snake_game.apple * CELL_SIZE, Vector2.ONE * CELL_SIZE),
|
|
COLOR_APPLE
|
|
)
|
|
|
|
# update texture
|
|
tex_rect.texture = ImageTexture.create_from_image(img_buffer)
|
|
|
|
func _input(event:InputEvent):
|
|
if event is InputEventKey:
|
|
var key_event = event as InputEventKey
|
|
if key_event.pressed:
|
|
if KEY_SCHEME.has(key_event.keycode):
|
|
cached_input = KEY_SCHEME[key_event.keycode]
|
|
# if key is pressed, update immediately
|
|
delay = 0.0
|
|
|
|
func _physics_process(delta):
|
|
delay -= delta
|
|
if delay <= 0.0:
|
|
snake_game.tick(cached_input)
|
|
draw()
|
|
# speed up as snake grows
|
|
delay = 2.0 / min(20, snake_game.get_snake_length() / 3.0 + 3)
|