Silverlight游戏编程:使用Silverlight 3.0实现贪吃蛇游戏(c#)(2)
/// summary /// 增加一个尾巴 /// /summary private void AddTail() { varprevBody = _bodies.Last().Key; varprevBodyPoint = _bodies.Last().Value; Bodytail = new Body(BodyType.Tail); tail.MoveDirecti
/// <summary>
/// 增加一个尾巴
/// </summary>
private void AddTail()
{
var prevBody = _bodies.Last().Key;
var prevBodyPoint = _bodies.Last().Value;
Body tail = new Body(BodyType.Tail);
tail.MoveDirection = prevBody.MoveDirection;
CellPoint tailPoint = new CellPoint(prevBodyPoint.X, prevBodyPoint.Y);
switch (prevBody.MoveDirection)
{
case Direction.Up:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty));
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty) + App.CellSize);
tailPoint.Y++;
break;
case Direction.Down:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty));
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty) - App.CellSize);
tailPoint.Y--;
break;
case Direction.Left:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty) + App.CellSize);
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty));
tailPoint.X++;
break;
case Direction.Right:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty) - App.CellSize);
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty));
tailPoint.X--;
break;
}
tailPoint = CorrectCellPoint(tailPoint);
_bodies.Add(tail, tailPoint);
canvasSnake.Children.Add(tail);
}
/// <summary>
/// 增加一个豆
/// </summary>
private void AddBean()
{
if (_needBeansCount < _beansCount)
_needBeansCount++;
}
private DateTime _prevAddBeanDateTime = DateTime.Now;
/// <summary>
/// 生成豆
/// </summary>
void UpdateBean()
{
if (_needBeansCount > 0 && (DateTime.Now - _prevAddBeanDateTime).TotalSeconds > 3)
{
List<CellPoint> emptyCells = GetEmptyCells();
if (emptyCells.Count == 0)
{
GameOver(this, EventArgs.Empty);
return;
}
CellPoint point = emptyCells[_random.Next(0, emptyCells.Count)];
Bean bean = new Bean();
bean.SetValue(Canvas.LeftProperty, point.X * App.CellSize);
bean.SetValue(Canvas.TopProperty, point.Y * App.CellSize);
_beans.Add(bean, point);
canvasBean.Children.Add(bean);
bean.ani.Completed += delegate
{
ripple.ShowRipple(new Point(point.X * App.CellSize + App.CellSize / 2, point.Y * App.CellSize + App.CellSize / 2));
player.PlayDrop();
};
_needBeansCount--;
_prevAddBeanDateTime = DateTime.Now;
}
}
private DateTime _prevDateTime = DateTime.Now;
private double _leftoverLength = 0d;
void CompositionTarget_Rendering(object sender, EventArgs e)
{
double length = (DateTime.Now - _prevDateTime).TotalSeconds + _leftoverLength;
while (length > _dt)
{
Update();
length -= _dt;
}
_leftoverLength = length;
_prevDateTime = DateTime.Now;
}
/// <summary>
/// 即时计算
/// </summary>
private void Update()
{
if (!_enabled)
return;
double offset = Math.Round(_speed * _dt, _decimals);
// 蛇头所处位置进入了网格点区域内
if (Math.Abs(Math.Round((double)_bodies.First().Key.GetValue(Canvas.TopProperty) % App.CellSize, _decimals)) < offset && Math.Abs(Math.Round((double)_bodies.First().Key.GetValue(Canvas.LeftProperty) % App.CellSize, _decimals)) < offset)
{
UpdateDirection();
CorrectPosition();
UpdateBodyCell();
CheckEat();
CheckSkin();
CheckCollision();
UpdateBean();
if (_needRaiseAteEvent)
{
Ate(this.Ate, EventArgs.Empty);
_needRaiseAteEvent = false;
}
}
UpdatePosition();
}
/// <summary>
/// 蜕皮
/// </summary>
private void CheckSkin()
{
if (_bodies.Count >= _ateCapacity + _selfLength)
AddSkin(_ateCapacity);
}
/// <summary>
/// 碰撞检测
/// </summary>
private void CheckCollision()
{
if (_skins.Any(p => p.Value == _bodies.First().Value) || _bodies.Where(p => p.Key.BodyType == BodyType.Tail).Any(p => p.Value == _bodies.First().Value))
{
_enabled = false;
player.PlayOver();
GameOver(this, EventArgs.Empty);
}
}
/// <summary>
/// 吃豆
/// </summary>
private void CheckEat()
{
// 是否有被吃的豆
var bean = _beans.FirstOrDefault(p => p.Value == _bodies.First().Value).Key;
if (bean != null)
{
_beans.Remove(bean);
canvasBean.Children.Remove(bean);
player.PlayEat();
AddTail();
AddBean();
_needRaiseAteEvent = true;
}
}
精彩图集
精彩文章