1: private void MoveSprites()
2: {
3: for (int i = 0; i < _sprites.Count; i++)
4: {
5: Boolean remove = false;
6:
7: SpriteBase sprite = _sprites[i];
8: double newX = sprite.X;
9:
10: //check the direction of the sprite and modify accordingly
11: if (sprite.RightToLeft)
12: {
13: newX -= sprite.XSpeed;
14: remove = (newX + sprite.ActualWidth < 0);
15: }
16: else
17: {
18: newX += sprite.XSpeed;
19: remove = (newX > this.Width);
20: }
21:
22: //when items go off the screen we replace them with a new random sprite
23: if (remove == true)
24: {
25: LayoutRoot.Children.Remove(sprite);
26: SpriteBase replacement;
27:
28: if (sprite.GetType() == typeof(Vehicle))
29: replacement = new Vehicle((VehicleType)_randomizer.Next(0, 5), sprite.RightToLeft);
30: else if (sprite.GetType() == typeof(Log))
31: replacement = new Log((LogSize)_randomizer.Next(0, 3), sprite.RightToLeft);
32: else
33: replacement = new Turtle((TurtleType)_randomizer.Next(0, 3), sprite.RightToLeft);
34:
35: //find the min or max X position of the sprite in the same lane
36: var query = from x in _sprites
37: where
38: x.Lane == sprite.Lane
39: orderby
40: x.X ascending
41: select
42: x;
43:
44: SpriteBase lastSprite;
45: //right to left means you want the max because when the item wraps around the screen
46: //it will appear in the higher range of X values
47: if (sprite.RightToLeft)
48: {
49: lastSprite = query.Last();
50: if ((lastSprite.X + lastSprite.ActualWidth) >= this.Width)
51: newX = (lastSprite.X + lastSprite.ActualWidth) + _randomizer.Next(50, 150);
52: else
53: newX = this.Width;
54: }
55: else
56: {
57: lastSprite = query.First();
58: if (lastSprite.X <= 0)
59: newX = (lastSprite.X) - _randomizer.Next(50, 150) - replacement.ActualWidth;
60: else
61: newX = 0 - replacement.ActualWidth;
62: }
63: replacement.XSpeed = sprite.XSpeed;
64: replacement.Lane = sprite.Lane;
65: replacement.Y = GetNewYLocation(replacement, sprite.Lane);
66:
67: _sprites[i] = replacement;
68: sprite = replacement;
69:
70: LayoutRoot.Children.Add(replacement);
71: }
72:
73: //when items start to move off the screen we clip part of the object so we do
74: //not see it hanging off the screen
75: if ((newX + sprite.ActualWidth) >= this.Width)
76: {
77: if (sprite.X < this.Width)
78: {
79: RectangleGeometry rg = new RectangleGeometry();
80: rg.Rect = new Rect(0, 0, this.Width - sprite.X, sprite.ActualHeight);
81: sprite.Clip = rg;
82: sprite.Visibility = Visibility.Visible; //forces a repaint
83: }
84: }
85:
86: //if the frog is on a object in the river then move it at the same rate
87: if (_frog.WaterObject == sprite)
88: {
89: double frogX = _frog.X - (sprite.X - newX);
90: Point p = new Point(frogX, _frog.Y);
91: MoveFrog(p);
92: }
93:
94: sprite.X = newX;
95: }
96: }