async def fly_garbage(canvas, column, garbage_frame, speed=0.5): """Animate garbage, flying from top to bottom. Сolumn position will stay same, as specified on start.""" global obstacles global obstacles_in_last_collision global coroutines rows_number, columns_number = canvas.getmaxyx() column = max(column, 0) column = min(column, columns_number - 1) row = 0 row_size, column_size = get_frame_size(garbage_frame) obstacle = Obstacle(row, column, row_size, column_size) obstacles.append(obstacle) while row < rows_number: if obstacle in obstacles_in_last_collision: coroutines.append( explode(canvas, row + row_size // 2, column + column_size // 2)) obstacles_in_last_collision.remove(obstacle) break draw_frame(canvas, row, column, garbage_frame) obstacle.row = row obstacle.column = column await asyncio.sleep(0) draw_frame(canvas, row, column, garbage_frame, negative=True) row += speed obstacles.remove(obstacle)
async def draw_rocket( state, canvas, start_row, start_column, border, negative=True, speed_boost=1, ): row, column = (start_row, start_column) row_speed = column_speed = 0 frames = get_rocket_frames_iter() rows, columns = get_frame_size(next(frames)) rocket = Obstacle(row, column, rows, columns) for frame in frames: rocket.row = row rocket.column = column for obstacle in state["obstacles"]: if rocket.has_collision( obstacle.row, obstacle.column, obstacle.rows_size, obstacle.columns_size, ): state["routines"].append(explode(canvas, row, column)) state["routines"].append(end(canvas)) return draw_frame(canvas, row, column, frame) await sleep() draw_frame(canvas, row, column, frame, negative=True) row_delta, column_delta, space = read_controls(canvas) if space and state["year"] >= 2020: state["routines"].append(fire(state, canvas, row, column + 2)) frame_rows, frame_columns = get_frame_size(frame) row_speed, column_speed = update_speed( row_speed, column_speed, row_delta, column_delta, ) if row_delta == -1: row = max(border["top"], row + row_speed) elif row_delta == 1: row = min(border["bottom"] - frame_rows, row + row_speed) elif row_delta == 0: row = min(border["bottom"] - frame_rows, row + row_speed) row = max(border["top"], row) if column_delta == 1: column = min( border["right"] - frame_columns, column + column_speed, ) elif column_delta == -1: column = max(border["left"], column + column_speed) elif column_delta == 0: column = max(border["left"], column + column_speed) column = min( border["right"] - frame_columns, column, )