/** Rebuild this trail from the set of points */ public void Rebuild(nGLine[] points) { if (_sprites != null) { var count = _sprites.Length < points.Length ? _sprites.Length : points.Length; if (count > 0) { for (var i = 0; i < count; ++i) { var offset1 = 1.0f - ((float)i) / points.Length; var offset2 = 1.0f - ((float)(i + 1)) / points.Length; RebuildSegment(_sprites[i], points[i], offset1, offset2); } } for (var i = count; i < _sprites.Length; ++i) { _sprites [i].Color [3] = 0f; } } }
/** Reset the ball position and start again */ public void NewGame() { PlayerPaddle = new Paddle(this); AiPaddle = new Paddle(this); Ball = new Ball(this); Field = new Field(this, Camera()); Sparkle = new Sparkle(this); RainbowTrail = new RainbowTrail(this); Flare = new Ps.Model.Object.Flare(this); Collectables = new Collectables(this); /* actions */ SetupActions(); _input = new GameInput(this); Game.SoundReset(); // reload /* Set initial paddle positions */ PlayerPaddle.Position[0] = 0f; PlayerPaddle.Position[1] = Field.Bounds[1] + nLayout.DistanceInWorld(14f, nAxis.Y, _camera);; AiPaddle.Position[0] = 0f; AiPaddle.Position[1] = Field.Bounds[3] - AiPaddle.Size[1] - nLayout.DistanceInWorld(7f, nAxis.Y, _camera); var direction = new nGLine() { P1 = new float[2] { 0, 0 }, P2 = new float[2] { nRand.Float(0f, 1f), nRand.Float(1f, 0.3f) } }; var unit = direction.Unit; Ball.Position[0] = 0; Ball.Position[1] = 0; Ball.Velocity[0] = unit[0] * 35f; Ball.Velocity[1] = unit[1] * 35f; /* reset paddles */ AiPaddle.Ai = new EasyAiProfile(); AiPaddle.Speed = AiPaddle.Ai.Speed; PlayerPaddle.Speed = Config.PlayerSpeed; AiPaddle.Position[0] = 0; PlayerPaddle.Position[0] = 0; /* ai */ Activated = false; Camera().Pipe.Drawables.Clear(); Camera().Pipe.Render(); }
/** Return a set of line segments that describe this line. */ public nGLine[] Points() { var size = _lastSeg ? _segments.Count : _segments.Count + 1; var rtn = new nGLine[size]; var offset = 0; foreach (var s in _segments) { rtn [offset] = s; ++offset; } /* Extra segment for the last point? */ if (!_lastSeg) { rtn[offset] = new nGLine() { P1 = new float[2] { _plast[0], _plast[1] }, P2 = new float[2] { _last[0], _last[1] } }; } return rtn; }
/** Check if the new point on the current line segment */ /*private bool Inline(float x, float y) { if ((_start == null) || (_start.Next == null)) return false; float ux, uy = 0f; Unit(_start.Next.X, _start.Next.Y, _start.X, _start.Y, out ux, out uy); var k1 = x / ux; var k2 = y / uy; var tolerance = 0.001f; if ((k1 >= (k2 - tolerance)) && (k1 <= k2 + tolerance)) return true; return false; }*/ /** Add some new segments */ private void AddNewSegments(int count, float x, float y) { //nLog.Debug("Request to add {0} new segments", count); float ux, uy; Unit(_plast[0], _plast [1], x, y, out ux, out uy); var prev = new float[2] { _plast[0], _plast[1] }; for (var i = 0; i < count; ++i) { var segment = new nGLine() { P1 = new float[2] { prev[0], prev[1], }, P2 = new float[2] { _plast[0] + (i + 1) * ux * SegmentSize, _plast[1] + (i + 1) * uy * SegmentSize } }; _segments.Enqueue(segment); prev[0] = segment.P2[0]; prev[1] = segment.P2[1]; /* Save a marker for next time */ if (i == (count - 1)) { _plast[0] = segment.P2[0]; _plast[1] = segment.P2[1]; //nLog.Debug("The new plast is updated to {0},{1}", _plast[0], _plast[1]); if ((segment.P2[0] == x) && (segment.P2[1] == y)) { _lastSeg = true; } } } //nLog.Debug("Added segment, new count is " + _segments.Count); }
/** Create a line segment */ private void RebuildSegment(nSprite s, nGLine l, float offset1, float offset2) { var w1 = MinWidth + (MaxWidth - MinWidth) * offset1; var w2 = MinWidth + (MaxWidth - MinWidth) * offset2; var pnts = l.SPoints(w1, w2); s.Points.Set(pnts); s.Color[3] = (1.0f - offset1) * 0.2f; }