diff options
Diffstat (limited to 'demos/2d/tetris/grid.gd')
-rw-r--r-- | demos/2d/tetris/grid.gd | 218 |
1 files changed, 98 insertions, 120 deletions
diff --git a/demos/2d/tetris/grid.gd b/demos/2d/tetris/grid.gd index 8708d168e4..73607d7cf6 100644 --- a/demos/2d/tetris/grid.gd +++ b/demos/2d/tetris/grid.gd @@ -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) - - - - |