protected override void OnMouseDown(MouseButtonArgs e) { if (CurrentMouseWorldPositionIsValid) { var translatedPos = (new Vector4(CurrentMouseWorldPosition, 1) * BoardTranslationMatrix).Xyz; Console.WriteLine(translatedPos); var pos = translatedPos.Round().Xy.ToVector2i(); if (!Board.PositionInMap(pos)) { return; } //ScaleAnim.Start(); var selector = BoardActor.GetComponent <SceneComponent>("MarbleSelector"); if (MoveTween.Enabled || RemoveTween.Enabled || CreateTween.Enabled) { return; } if (Board[pos]?.Color == MarbleColor.BombJoker) { return; } var marble = Board[pos]; Log.Verbose("Clicked: {position}. Marble: {marble}", pos, marble); if (marble != null) { SelectedMarble = marble; selector.RelativeTranslation = new Vector3(pos.X, pos.Y, selector.RelativeTranslation.Z); selector.Visible = true; AudioManager.Default.PlayAsync("Sounds/marble-select.wav"); } else { if (SelectedMarble != null) { var path = Board.FindPath(SelectedMarble, pos); if (path != null && path.Count > 0) { CurrentPath = path; var moveStepDuration = TimeSpan.FromSeconds(0.1); //var moveStepDuration = TimeSpan.FromSeconds(2); MoveTween.Duration = moveStepDuration.Multiply(path.Count); MoveTween.Start(); AudioManager.Default.PlayAsync("Sounds/marble-moving.wav"); selector.Visible = false; } } } } }
public MarbleBoard() { Width = 9; Height = 9; MarbleArray = new Marble[Width, Height]; PathFinding = new PathFinder { Map = new WayPointMap(this), }; }
private Material GetMaterial(Marble marble) { var material = new Material() { Color = GetMaterialColorShader(marble.Color1), Ambient = 0.5f, Shininess = 32.0f, SpecularStrength = 0.5f, CastShadow = true, }; material.SetDefine("OVERRIDE_GET_MATERIAL_DIFFUSE_FILE", "marble.material.glsl"); material.SetDefine("FRAG_HEADER_FILE", "marble.params.glsl"); return(material); }
private Vector3 GetMarblePos(Marble marble) { if (marble.OnBoard || Board.PreviewMode == MarblePreview.Board) { return(GetMarblePos(marble.OnBoard ? marble.Position : marble.Position)); } if (Board.PreviewMode == MarblePreview.Side) { var idx = Board.NextMarbles.IndexOf(marble); return(new Vector3(0, idx, MarbleZ)); } else { return(Vector3.Zero); } }
private (Vector3 Position, Quaternion Rotate) GetPathPosition(Marble marble) { var steps = CurrentPath.Count - 1; var scaledPos = MoveTween.ScaledPosition * steps; var step = (int)MathF.Floor(scaledPos); // Prevent rare exception step = Math.Min(step, CurrentPath.Count - 2); float subPos = scaledPos - step; var fromPos = CurrentPath[step]; var toPos = CurrentPath[step + 1]; var direction = toPos - fromPos; var subDirection = new Vector3(direction.X, direction.Y, 0.0f) * subPos; var resultPos = GetMarblePos(fromPos) + subDirection; var resultRotate = new Vector3(direction.Y, direction.X, 0) * (subPos * 0.5f); return(resultPos, resultRotate.ToQuaternion()); }