龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

Silverlight游戏编程:使用Silverlight 3.0实现贪吃蛇游戏(c#)(2)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
/// 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;
            }
        }

精彩图集

赞助商链接