|
@@ -1,82 +1,76 @@
|
|
|
|
|
|
-
|
|
|
extends Control
|
|
|
|
|
|
# Simple Tetris-like demo, (c) 2012 Juan Linietsky
|
|
|
# Implemented by using a regular Control and drawing on it during the _draw() callback.
|
|
|
# The drawing surface is updated only when changes happen (by calling update())
|
|
|
|
|
|
-
|
|
|
+# Member variables
|
|
|
var score = 0
|
|
|
-var score_label=null
|
|
|
+var score_label = null
|
|
|
|
|
|
const MAX_SHAPES = 7
|
|
|
|
|
|
var block = preload("block.png")
|
|
|
|
|
|
-var block_colors=[
|
|
|
- Color(1,0.5,0.5),
|
|
|
- Color(0.5,1,0.5),
|
|
|
- Color(0.5,0.5,1),
|
|
|
- Color(0.8,0.4,0.8),
|
|
|
- Color(0.8,0.8,0.4),
|
|
|
- Color(0.4,0.8,0.8),
|
|
|
- Color(0.7,0.7,0.7)]
|
|
|
-
|
|
|
-var block_shapes=[
|
|
|
- [ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I
|
|
|
- [ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O
|
|
|
- [ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S
|
|
|
- [ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z
|
|
|
- [ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L
|
|
|
- [ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J
|
|
|
- [ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T
|
|
|
-
|
|
|
+var block_colors = [
|
|
|
+ Color(1, 0.5, 0.5),
|
|
|
+ Color(0.5, 1, 0.5),
|
|
|
+ Color(0.5, 0.5, 1),
|
|
|
+ Color(0.8, 0.4, 0.8),
|
|
|
+ Color(0.8, 0.8, 0.4),
|
|
|
+ Color(0.4, 0.8, 0.8),
|
|
|
+ Color(0.7, 0.7, 0.7)]
|
|
|
|
|
|
-var block_rotations=[
|
|
|
- Matrix32( Vector2(1,0),Vector2(0,1), Vector2() ),
|
|
|
- Matrix32( Vector2(0,1),Vector2(-1,0), Vector2() ),
|
|
|
- Matrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ),
|
|
|
- Matrix32( Vector2(0,-1),Vector2(1,0), Vector2() )
|
|
|
-]
|
|
|
-
|
|
|
+var block_shapes = [
|
|
|
+ [ Vector2(0, -1), Vector2(0, 0), Vector2(0, 1), Vector2(0, 2) ], # I
|
|
|
+ [ Vector2(0, 0), Vector2(1, 0), Vector2(1, 1), Vector2(0, 1) ], # O
|
|
|
+ [ Vector2(-1, 1), Vector2(0, 1), Vector2(0, 0), Vector2(1, 0) ], # S
|
|
|
+ [ Vector2(1, 1), Vector2(0, 1), Vector2(0, 0), Vector2(-1, 0) ], # Z
|
|
|
+ [ Vector2(-1, 1), Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0) ], # L
|
|
|
+ [ Vector2(1, 1), Vector2(1, 0), Vector2(0, 0), Vector2(-1, 0) ], # J
|
|
|
+ [ Vector2(0, 1), Vector2(1, 0), Vector2(0, 0), Vector2(-1, 0) ]] # T
|
|
|
|
|
|
-var width=0
|
|
|
-var height=0
|
|
|
+var block_rotations = [
|
|
|
+ Matrix32(Vector2(1, 0), Vector2(0, 1), Vector2()),
|
|
|
+ Matrix32(Vector2(0, 1), Vector2(-1, 0), Vector2()),
|
|
|
+ Matrix32(Vector2(-1, 0), Vector2(0, -1), Vector2()),
|
|
|
+ Matrix32(Vector2(0, -1), Vector2(1, 0), Vector2())]
|
|
|
|
|
|
-var cells={}
|
|
|
+var width = 0
|
|
|
+var height = 0
|
|
|
|
|
|
-var piece_active=false
|
|
|
-var piece_shape=0
|
|
|
-var piece_pos=Vector2()
|
|
|
-var piece_rot=0
|
|
|
+var cells = {}
|
|
|
|
|
|
+var piece_active = false
|
|
|
+var piece_shape = 0
|
|
|
+var piece_pos = Vector2()
|
|
|
+var piece_rot = 0
|
|
|
|
|
|
-func piece_cell_xform(p,er=0):
|
|
|
- var r = (4+er+piece_rot)%4
|
|
|
- return piece_pos+block_rotations[r].xform(p)
|
|
|
|
|
|
-func _draw():
|
|
|
+func piece_cell_xform(p, er = 0):
|
|
|
+ var r = (4 + er + piece_rot) % 4
|
|
|
+ return piece_pos + block_rotations[r].xform(p)
|
|
|
+
|
|
|
|
|
|
- var sb = get_stylebox("bg","Tree") # use line edit bg
|
|
|
- draw_style_box(sb,Rect2(Vector2(),get_size()).grow(3))
|
|
|
+func _draw():
|
|
|
+ var sb = get_stylebox("bg", "Tree") # Use line edit bg
|
|
|
+ draw_style_box(sb, Rect2(Vector2(), get_size()).grow(3))
|
|
|
|
|
|
var bs = block.get_size()
|
|
|
for y in range(height):
|
|
|
for x in range(width):
|
|
|
- if (Vector2(x,y) in cells):
|
|
|
- draw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]])
|
|
|
-
|
|
|
+ if (Vector2(x, y) in cells):
|
|
|
+ draw_texture_rect(block, Rect2(Vector2(x, y)*bs, bs), false, block_colors[cells[Vector2(x, y)]])
|
|
|
+
|
|
|
if (piece_active):
|
|
|
-
|
|
|
for c in block_shapes[piece_shape]:
|
|
|
- draw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape])
|
|
|
-
|
|
|
+ draw_texture_rect(block, Rect2(piece_cell_xform(c)*bs, bs), false, block_colors[piece_shape])
|
|
|
|
|
|
-func piece_check_fit(ofs,er=0):
|
|
|
|
|
|
+func piece_check_fit(ofs, er = 0):
|
|
|
for c in block_shapes[piece_shape]:
|
|
|
- var pos = piece_cell_xform(c,er)+ofs
|
|
|
+ var pos = piece_cell_xform(c, er) + ofs
|
|
|
if (pos.x < 0):
|
|
|
return false
|
|
|
if (pos.y < 0):
|
|
@@ -88,130 +82,114 @@ func piece_check_fit(ofs,er=0):
|
|
|
if (pos in cells):
|
|
|
return false
|
|
|
|
|
|
- return true
|
|
|
+ return true
|
|
|
|
|
|
-func new_piece():
|
|
|
|
|
|
- piece_shape = randi() % MAX_SHAPES
|
|
|
- piece_pos = Vector2(width/2,0)
|
|
|
- piece_active=true
|
|
|
- piece_rot=0
|
|
|
- if (piece_shape==0):
|
|
|
- piece_pos.y+=1
|
|
|
-
|
|
|
+func new_piece():
|
|
|
+ piece_shape = randi() % MAX_SHAPES
|
|
|
+ piece_pos = Vector2(width/2, 0)
|
|
|
+ piece_active = true
|
|
|
+ piece_rot = 0
|
|
|
+ if (piece_shape == 0):
|
|
|
+ piece_pos.y += 1
|
|
|
+
|
|
|
if (not piece_check_fit(Vector2())):
|
|
|
- #game over
|
|
|
- #print("GAME OVER!")
|
|
|
+ # Game over
|
|
|
game_over()
|
|
|
-
|
|
|
- update()
|
|
|
-
|
|
|
|
|
|
+ update()
|
|
|
+
|
|
|
+
|
|
|
func test_collapse_rows():
|
|
|
- var accum_down=0
|
|
|
+ var accum_down = 0
|
|
|
for i in range(height):
|
|
|
var y = height - i - 1
|
|
|
var collapse = true
|
|
|
for x in range(width):
|
|
|
- if (Vector2(x,y) in cells):
|
|
|
+ if (Vector2(x, y) in cells):
|
|
|
if (accum_down):
|
|
|
- cells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)]
|
|
|
+ cells[Vector2(x, y + accum_down)] = cells[Vector2(x, y)]
|
|
|
else:
|
|
|
- collapse=false
|
|
|
+ collapse = false
|
|
|
if (accum_down):
|
|
|
- cells.erase( Vector2(x,y+accum_down) )
|
|
|
-
|
|
|
- if (collapse):
|
|
|
- accum_down+=1
|
|
|
+ cells.erase(Vector2(x, y + accum_down))
|
|
|
|
|
|
-
|
|
|
- score+=accum_down*100
|
|
|
+ if (collapse):
|
|
|
+ accum_down += 1
|
|
|
+
|
|
|
+ score += accum_down*100
|
|
|
score_label.set_text(str(score))
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
func game_over():
|
|
|
+ piece_active = false
|
|
|
+ get_node("gameover").set_text("Game over!")
|
|
|
+ update()
|
|
|
+
|
|
|
|
|
|
- piece_active=false
|
|
|
- get_node("gameover").set_text("Game Over")
|
|
|
- update()
|
|
|
-
|
|
|
-
|
|
|
func restart_pressed():
|
|
|
+ score = 0
|
|
|
+ score_label.set_text("0")
|
|
|
+ cells.clear()
|
|
|
+ get_node("gameover").set_text("")
|
|
|
+ piece_active = true
|
|
|
+ get_node("../restart").release_focus()
|
|
|
+ update()
|
|
|
|
|
|
- score=0
|
|
|
- score_label.set_text("0")
|
|
|
- cells.clear()
|
|
|
- get_node("gameover").set_text("")
|
|
|
- piece_active=true
|
|
|
- get_node("../restart").release_focus()
|
|
|
- update()
|
|
|
-
|
|
|
-
|
|
|
|
|
|
func piece_move_down():
|
|
|
-
|
|
|
if (!piece_active):
|
|
|
return
|
|
|
- if (piece_check_fit(Vector2(0,1))):
|
|
|
- piece_pos.y+=1
|
|
|
- update()
|
|
|
+ if (piece_check_fit(Vector2(0, 1))):
|
|
|
+ piece_pos.y += 1
|
|
|
+ update()
|
|
|
else:
|
|
|
-
|
|
|
for c in block_shapes[piece_shape]:
|
|
|
var pos = piece_cell_xform(c)
|
|
|
- cells[pos]=piece_shape
|
|
|
+ cells[pos] = piece_shape
|
|
|
test_collapse_rows()
|
|
|
new_piece()
|
|
|
-
|
|
|
|
|
|
-func piece_rotate():
|
|
|
|
|
|
+func piece_rotate():
|
|
|
var adv = 1
|
|
|
- if (not piece_check_fit(Vector2(),1)):
|
|
|
+ if (not piece_check_fit(Vector2(), 1)):
|
|
|
return
|
|
|
piece_rot = (piece_rot + adv) % 4
|
|
|
update()
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-func _input(ie):
|
|
|
|
|
|
|
|
|
+func _input(ie):
|
|
|
if (not piece_active):
|
|
|
return
|
|
|
if (!ie.is_pressed()):
|
|
|
return
|
|
|
|
|
|
if (ie.is_action("move_left")):
|
|
|
- if (piece_check_fit(Vector2(-1,0))):
|
|
|
- piece_pos.x-=1
|
|
|
+ if (piece_check_fit(Vector2(-1, 0))):
|
|
|
+ piece_pos.x -= 1
|
|
|
update()
|
|
|
elif (ie.is_action("move_right")):
|
|
|
- if (piece_check_fit(Vector2(1,0))):
|
|
|
- piece_pos.x+=1
|
|
|
+ if (piece_check_fit(Vector2(1, 0))):
|
|
|
+ piece_pos.x += 1
|
|
|
update()
|
|
|
elif (ie.is_action("move_down")):
|
|
|
piece_move_down()
|
|
|
elif (ie.is_action("rotate")):
|
|
|
piece_rotate()
|
|
|
-
|
|
|
-
|
|
|
-func setup(w,h):
|
|
|
- width=w
|
|
|
- height=h
|
|
|
- set_size( Vector2(w,h)*block.get_size() )
|
|
|
+
|
|
|
+
|
|
|
+func setup(w, h):
|
|
|
+ width = w
|
|
|
+ height = h
|
|
|
+ set_size(Vector2(w, h)*block.get_size())
|
|
|
new_piece()
|
|
|
get_node("timer").start()
|
|
|
-
|
|
|
+
|
|
|
|
|
|
func _ready():
|
|
|
# Initalization here
|
|
|
-
|
|
|
- setup(10,20)
|
|
|
+ setup(10, 20)
|
|
|
score_label = get_node("../score")
|
|
|
-
|
|
|
+
|
|
|
set_process_input(true)
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|