// ----------------------------------------------------------------------------------------------------------------- public CTile.EDirection SetPlayerDestination(CTile cur_tile, CTile.EDirection dir) { CTile.EDirection dir_next = CTile.DIR_EX[(int)dir].m_next; CTile.EDirection dir_next_next = CTile.DIR_EX[(int)dir_next].m_next; CTile.EDirection dir_prev = CTile.DIR_EX[(int)dir].m_prev; CTile.EDirection dir_prev_prev = CTile.DIR_EX[(int)dir_prev].m_prev; CTile.EDirection dir_back = CTile.DIR_EX[(int)dir].m_opposite; CTile.EDirection[] dir_selection_order = { dir, dir_next, dir_prev, dir_next_next, dir_prev_prev, dir_back }; CTile.EDirection final_dir = dir; foreach (CTile.EDirection d in dir_selection_order) { m_dest_tile = cur_tile.GetNeighbor(d); if (m_dest_tile != null && !m_level_tags.IsTagSet(m_dest_tile, (int)CTile.ETag.T_BORDER)) { final_dir = d; break; } } utils.Assert(m_dest_tile != null, "Destination tile is null"); m_direction = dir; m_player.SetDestination(m_dest_tile.GetPosition()); // utils.Log("Set player destination :: cur={0}:{1} dest={2}:{3} dir={4}", // cur_tile.m_x, cur_tile.m_z, m_dest_tile.m_x, m_dest_tile.m_z, dir); return(final_dir); }
// ----------------------------------------------------------------------------------------------------------------- public void SetPlayerPosition(int tile_x, int tile_z, CTile.EDirection dir) { // Current tile CTile t = m_level.GetTileByPosXZ(tile_x, tile_z); utils.Assert(t != null, "No source tile :: pos={0}:{1}", tile_x, tile_z); // Initial position and rotation Vector3 pos = t.GetPosition(); m_player.transform.position = new Vector3(pos.x, pos.y + 0.5f, pos.z); m_player.transform.eulerAngles = new Vector3(0.0f, CTile.DIR_EX[(int)m_direction].m_angle, 0.0f); // Destination SetPlayerDestination(t, dir); // Player trail m_path.Reset(); }
// ----------------------------------------------------------------------------------------------------------------- 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(); } }