// ----------------------------------------------------------------------------------------------------------------- private void Update() { // Turn right if (Input.GetKeyDown("right")) { m_direction = CTile.DIR_EX[(int)m_direction].m_next; // Turn left } else if (Input.GetKeyDown("left")) { m_direction = CTile.DIR_EX[(int)m_direction].m_prev; } // Current player position & underlying tile Vector3 cur_pos = m_player.transform.position; CTile cur_tile = m_level.GetTileByCoord(cur_pos.x, cur_pos.z); // Update compas m_compas.SetPosition(cur_pos); // Active tile is changed if (cur_tile != m_prev_frame_tile && m_prev_frame_tile != null) { // Update current and previously visited tiles m_prev_tile = m_prev_frame_tile; m_level_tags.SetTag(m_prev_tile, (int)CTile.ETag.T_VISITED); m_level_tags.SetTag(cur_tile, (int)CTile.ETag.T_CURRENT); // Update destination path m_level_tags.ClearTag((int)CTile.ETag.T_DEST_PATH); CTile t_glow = cur_tile; while (true) { t_glow = t_glow.GetNeighbor(m_direction); if (t_glow == null || !m_level_tags.SetTag(t_glow, (int)CTile.ETag.T_DEST_PATH)) { break; } } // Update trail - finalize border vertex between tiles Vector3 tile_border = m_prev_frame_tile.GetPosition() + (cur_tile.GetPosition() - m_prev_frame_tile.GetPosition()) / 2; tile_border.y += 0.5f; m_path.AddVertex(tile_border, true); // Active tile was not changed } else { // Update trail - update head vertex m_path.AddVertex(cur_pos, false); } // Destination tile is reached CTile.ERelPosition rel_pos = cur_tile.GetRelPosition(m_dest_tile, m_direction); if (rel_pos == CTile.ERelPosition.RP_CURRENT || rel_pos == CTile.ERelPosition.RP_BEHIND || rel_pos == CTile.ERelPosition.RP_NONE) { m_direction = SetPlayerDestination(cur_tile, m_direction); m_prev_frame_tile = cur_tile; } // Save tile of previous frame m_prev_frame_tile = cur_tile; // Eat apple if (m_level_tags.IsTagSet(cur_tile, (int)CTile.ETag.T_APPLE)) { m_level_tags.UnsetTag(cur_tile, (int)CTile.ETag.T_APPLE); m_tail.AddSegment(); m_config.score++; } // Create new apple if (m_level_tags.GetTagCnt((int)CTile.ETag.T_APPLE) == 0) { CTile t = CreateApple(); m_compas.SetDestination(t.GetPosition()); } // Apply level changeset Hashtable changeset = m_level_tags.GetChangeset(); if (changeset.Count > 0) { // Update all tiles in changeset foreach (DictionaryEntry entry in changeset) { CTile tile = (CTile)entry.Key; UpdateLevelMaterial(tile); UpdateLevelGameplay(tile); } // Clear changeset changeset.Clear(); } }