none
"TankBattle.P1Tank"类型初始值设定项引发异常 RRS feed

  • 问题

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Threading;  //可以进行多线程编程的类和接口

    namespace TankBattle
    {
        class Singleton  //定义单态.........
        {

            private P1Tank p1Tank;  //定义坦克字段

            public P1Tank P1Tank
            {
                get { return p1Tank; }
                set { p1Tank = value; }
            }

            private List<Enemy> enemy = new List<Enemy>();//用List存放坦克的类型
            private List<Walls> wall = new List<Walls>();
            private List<Water> water = new List<Water>();
            private List<Steels> steel = new List<Steels>();
            private List<Grass> grass = new List<Grass>();
            private List<MyMissile> myMissile = new List<MyMissile>();           //实例化出我的子弹的对象
            private List<EnemyMissile> enemyMissile = new List<EnemyMissile>();  //实例化敌人的子弹的对象
            private List<Blast> blast = new List<Blast>();                       //实例化爆炸对象
            private List<Born> born = new List<Born>();                          //实例化出生时的对象
            private List<Symbol> symbol = new List<Symbol>();


            public Singleton()
            { 

            }

            public void CreateThread()  //创建一个方法,使用多线程
            {
                Thread hitThread = new Thread(new ThreadStart(HitCheck));
                hitThread.Start();
            }

            private static Singleton instance;

            public static Singleton Instance
            {
                get 
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                    return instance;
                }
            }

            //构造添加元素的方法
            public void AddElement(Element e)
            {
                if (e is P1Tank)            //如果加载的是自己的坦克
                {
                    p1Tank = e as P1Tank;
                    return;
                }

                if (e is Enemy)             //如果加载的是敌人的坦克
                {
                    enemy.Add(e as Enemy);
                    return;
                }

                if (e is Walls)
                {
                    wall.Add(e as Walls);
                    return;
                }

                if (e is Water)
                {
                    water.Add(e as Water);
                    return;
                }

                if (e is Grass)
                {
                    grass.Add(e as Grass);
                    return;
                }

                if (e is Steels)
                {
                    steel.Add(e as Steels);
                    return;
                }

                if (e is MyMissile)
                {
                    myMissile.Add(e as MyMissile);
                    return;
                }

                if (e is EnemyMissile)
                {
                    enemyMissile.Add(e as EnemyMissile);
                    return;
                }

                if (e is Blast)
                {
                    blast.Add(e as Blast);
                    return;
                }

                if (e is Born)
                {
                    born.Add(e as Born);
                    return;
                }

                if (e is Symbol)
                {
                    symbol.Add(e as Symbol);
                    return;
                }
            }


            //*************构造销毁图片的方法
            public void RemoveElement(Element e)
            {
                if (e is Blast)
                {
                    blast.Remove(e as Blast);
                    return;
                }

                if (e is Enemy)
                {
                    enemy.Remove(e as Enemy);
                    return;
                }

                if (e is Walls)
                {
                    wall.Remove(e as Walls);
                    return;
                }

                if (e is MyMissile)
                {
                    myMissile.Remove(e as MyMissile);
                    return;
                }

                if (e is EnemyMissile)
                {
                    enemyMissile.Remove(e as EnemyMissile);
                    return;
                }
            }



            //绘制图片的方法
            public void Draw(Graphics g)  
            {
                p1Tank.Draw(g);                    //将自己的坦克画出来

                for(int i=0;i<enemy.Count;i++)     //将敌人的坦克画出来
                {
                    enemy[i].Draw(g);
                }

                for (int i = 0; i < myMissile.Count; i++)
                {
                    myMissile[i].Draw(g);
                }

                for (int i = 0; i < enemyMissile.Count; i++)    //画出敌人的子弹
                {
                    enemyMissile[i].Draw(g);
                }

                for (int i = 0; i < born.Count; i++)          //画出出生时的效果
                {
                    born[i].Draw(g);
                }

                for (int i = 0; i < blast.Count; i++)          //画出爆炸效果
                {
                    blast[i].Draw(g);
                }

                for (int i = 0; i < wall.Count; i++)
                {
                    wall[i].Draw(g);
                }

                for (int i = 0; i < water.Count; i++)
                {
                    water[i].Draw(g);
                }

                for (int i = 0; i < grass.Count; i++)
                {
                    grass[i].Draw(g);
                }

                for (int i = 0; i < steel.Count; i++)
                {
                    steel[i].Draw(g);
                }

                for (int i = 0; i < symbol.Count; i++)
                {
                    symbol[i].Draw(g);
                }
            }

        //判断子弹是否击打到对方的方法
            public void HitCheck()
            {
                #region 判断敌人的子弹是否击打到我的坦克
                for (int i = 0; i < enemyMissile.Count; i++)  
                {
                    try
                    {
                        if (p1Tank.GetRectangle().IntersectsWith(enemyMissile[i].GetRectangle()))
                        {
                            p1Tank.Life -= enemyMissile[i].power;       //如果相交,坦克的生命就减去子弹的威力...
                            enemyMissile.Remove(enemyMissile[i]);       //移除子弹
                            p1Tank.IsDead();                            //调用死亡的方法
                        }
                    }
                    catch
                    { 

                    }
                }
                #endregion

                #region 判断敌人坦克是否与土墙相撞
                for (int i = 0; i < wall.Count; i++)
                {
                    for (int j = 0; j < enemy.Count; j++)
                    {
                        if (enemy[j].GetRectangle().IntersectsWith(wall[i].GetRectangle()))
                        {
                            switch (enemy[j].dir)
                            { 
                                case directions.U:
                                    enemy[j].Y = wall[i].Y + wall[i].Height+40;
                                    break;
                                case directions.D:
                                    enemy[j].Y = wall[i].Y - enemy[j].Height;
                                    break;
                                case directions.L:
                                    enemy[j].X = wall[i].X + wall[i].Width+40;
                                    break;
                                case directions.R:
                                    enemy[j].X = wall[i].X - enemy[j].Width;
                                    break;
                            }
                        }
                    }        

                }
                #endregion

                #region 判断敌人坦克是否与钢板相撞
                for (int i = 0; i < steel.Count; i++)
                {
                    for (int j = 0; j < enemy.Count; j++)
                    {
                        if (enemy[j].GetRectangle().IntersectsWith(steel[i].GetRectangle()))
                        {
                            switch (enemy[j].dir)
                            {
                                case directions.U:
                                    enemy[j].Y = steel[i].Y + steel[i].Height;
                                    break;
                                case directions.D:
                                    enemy[j].Y = steel[i].Y - enemy[j].Height;
                                    break;
                                case directions.L:
                                    enemy[j].X = steel[i].X + steel[i].Width;
                                    break;
                                case directions.R:
                                    enemy[j].X = steel[i].X - enemy[j].Width;
                                    break;
                            }
                        }
                    }

                }
                #endregion

                #region 判断敌人坦克是否与水相撞
                for (int i = 0; i < water.Count; i++)
                {
                    for (int j = 0; j < enemy.Count; j++)
                    {
                        if (enemy[j].GetRectangle().IntersectsWith(water[i].GetRectangle()))
                        {
                            switch (enemy[j].dir)
                            {
                                case directions.U:
                                    enemy[j].Y = water[i].Y + water[i].Height;
                                    break;
                                case directions.D:
                                    enemy[j].Y = water[i].Y - enemy[j].Height;
                                    break;
                                case directions.L:
                                    enemy[j].X = water[i].X + water[i].Width;
                                    break;
                                case directions.R:
                                    enemy[j].X = water[i].X - enemy[j].Width;
                                    break;
                            }
                        }
                    }

                }
                #endregion

                #region 判断敌人子弹是否与钢板相撞
                for (int i = 0; i < enemyMissile.Count; i++)
                {
                    for (int j = 0; j < steel.Count; j++)
                    {
                        try
                        {
                            if (enemyMissile[i].GetRectangle().IntersectsWith(steel[j].GetRectangle()))
                            {

                                switch (enemyMissile[i].dir)
                                {
                                    case directions.U:
                                        enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                    case directions.D:
                                        enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                    case directions.L:
                                        enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                    case directions.R:
                                        enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                }
                              //  enemyMissile.Remove(enemyMissile[i]);
                            }
                        }
                        catch
                        {

                        }
                    }
                }
                #endregion

                #region 判断敌人子弹是否与土墙相撞
                for (int i = 0; i < enemyMissile.Count; i++)
                {
                    for (int j = 0; j < wall.Count; j++)
                    {
                        try
                        {
                            if (enemyMissile[i].GetRectangle().IntersectsWith(wall[j].GetRectangle()))
                            {
                                switch (enemyMissile[i].dir)
                                {
                                    case directions.U:
                                          wall.Remove(wall[j]);
                                          enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                    case directions.D:
                                           wall.Remove(wall[j]);
                                          enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                    case directions.L:
                                          wall.Remove(wall[j]);
                                          enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                    case directions.R:
                                          wall.Remove(wall[j]);
                                          enemyMissile.Remove(enemyMissile[i]);
                                        break;
                                }
                          //      wall.Remove(wall[j]);
                         //       enemyMissile.Remove(enemyMissile[i]);
                            }
                        }
                        catch
                        {

                        }
                    }
                }
                #endregion



                #region 判断我的子弹击打到敌人的坦克
                for (int i = 0; i < myMissile.Count; i++)
                {
                    for (int j = 0; j < enemy.Count; j++)
                    {
                        try
                        {
                            if (myMissile[i].GetRectangle().IntersectsWith(enemy[j].GetRectangle()))
                            {
                                enemy[j].Life -= myMissile[i].power;
                                enemy[j].IsDead();
                                myMissile.Remove(myMissile[i]);
                            }
                        }
                        catch
                        {

                        }
                    }
                }
                #endregion

                #region 判断我的坦克是否与土墙相撞
                  for (int i= 0; i < wall.Count; i++)
                  {
                      if (p1Tank.GetRectangle().IntersectsWith(wall[i].GetRectangle()))
                      {
                          switch (p1Tank.dir)
                          {
                              case directions.U:
                                  p1Tank.Y = wall[i].Y + wall[i].Height+40;
                                  break;
                              case directions.D:
                                  p1Tank.Y = wall[i].Y - p1Tank.Height;
                                  break;
                              case directions.L:
                                  p1Tank.X = wall[i].X + wall[i].Width+40;
                                  break;
                              case directions.R:
                                  p1Tank.X = wall[i].X - p1Tank.Width;
                                  break;
                          }
                      }

                }
                #endregion

                #region 判断我的坦克是否与钢板相撞
                  for (int i = 0; i < steel.Count; i++)
                  {
                      if (p1Tank.GetRectangle().IntersectsWith(steel[i].GetRectangle()))
                      {
                          switch (p1Tank.dir)
                          {
                              case directions.U:
                                  p1Tank.Y = steel[i].Y + steel[i].Height;
                                  break;
                              case directions.D:
                                  p1Tank.Y = steel[i].Y - p1Tank.Height;
                                  break;
                              case directions.L:
                                  p1Tank.X = steel[i].X + steel[i].Width;
                                  break;
                              case directions.R:
                                  p1Tank.X = steel[i].X - p1Tank.Width;
                                  break;
                          }
                      }

                  }
                  #endregion

                #region 判断我的坦克是否与水相撞
                  for (int i = 0; i < water.Count; i++)
                  {
                      if (p1Tank.GetRectangle().IntersectsWith(water[i].GetRectangle()))
                      {
                          switch (p1Tank.dir)
                          {
                              case directions.U:
                                  p1Tank.Y = water[i].Y + water[i].Height;
                                  break;
                              case directions.D:
                                  p1Tank.Y = water[i].Y - p1Tank.Height;
                                  break;
                              case directions.L:
                                  p1Tank.X = water[i].X + water[i].Width;
                                  break;
                              case directions.R:
                                  p1Tank.X = water[i].X - p1Tank.Width;
                                  break;
                          }
                      }

                  }
                  #endregion

                #region 判断我的子弹是否与钢板相撞
                  for (int i = 0; i < myMissile.Count; i++)
                  {
                      for (int j = 0; j < steel.Count; j++)
                      {
                          try
                          {
                              if (myMissile[i].GetRectangle().IntersectsWith(steel[j].GetRectangle()))
                              {

                                  switch (myMissile[i].dir)
                                  {
                                      case directions.U:
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                      case directions.D:
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                      case directions.L:
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                      case directions.R:
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                  }
                                  //  enemyMissile.Remove(enemyMissile[i]);
                              }
                          }
                          catch
                          {

                          }
                      }
                  }
                  #endregion

                #region 判断我的子弹是否与土墙相撞
                  for (int i = 0; i < myMissile.Count; i++)
                  {
                      for (int j = 0; j < wall.Count; j++)
                      {
                          try
                          {
                              if (myMissile[i].GetRectangle().IntersectsWith(wall[j].GetRectangle()))
                              {
                                  switch (myMissile[i].dir)
                                  {
                                      case directions.U:
                                          wall.Remove(wall[j]);
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                      case directions.D:
                                          wall.Remove(wall[j]);
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                      case directions.L:
                                          wall.Remove(wall[j]);
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                      case directions.R:
                                          wall.Remove(wall[j]);
                                          myMissile.Remove(myMissile[i]);
                                          break;
                                  }
                                  //      wall.Remove(wall[j]);
                                  //       enemyMissile.Remove(enemyMissile[i]);
                              }
                          }
                          catch
                          {

                          }
                      }
                  }
                  #endregion

                #region 判断敌人子弹是否与钢板相撞
                  for (int i = 0; i < enemyMissile.Count; i++)
                  {
                      for (int j = 0; j < myMissile.Count; j++)
                      {
                          try
                          {
                              if (enemyMissile[i].GetRectangle().IntersectsWith(myMissile[j].GetRectangle()))
                              {
                                   myMissile.Remove(myMissile[j]);
                                  enemyMissile.Remove(enemyMissile[i]);
                              }

                          }
                          catch
                          {

                          }
                      }
                  }
                  #endregion
            }


            //
        }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Windows.Forms;
    using TankBattle.Properties;

    namespace TankBattle
    {
        //玩家1的类
        class P1Tank : Player
        {
            //添加资源图片
            private static Image[] imgTank1 = new Image[]
            {
                //Resources.p1tankU,
                //Resources.p1tankD,
                //Resources.p1tankL,
                //Resources.p1tankR

            Image.FromFile(@"Resources/p1tankU.gif"),
            Image.FromFile(@"Resources/p1tankD.gif"),
            Image.FromFile(@"Resources/p1tankL.gif"),
            Image.FromFile(@"Resources/p1tankR.gif")
            };

            //初始化地图时的构造方法



            //构造函数
            public P1Tank(int x, int y, int life, int speed, directions dir)
                : base(x, y, life, speed, dir, imgTank1)
            {

            }

            //键按下的方法
            public void KeyDown(KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.W:
                        dirU = true;
                        break;
                    case Keys.S:
                        dirD = true;
                        break;
                    case Keys.A:
                        dirL = true;
                        break;
                    case Keys.D:
                        dirR = true;
                        break;
                    default:
                        break;
                }
                //如果按下的是W.A.S.D方向键,才开始移动
                if (e.KeyCode == Keys.W || e.KeyCode == Keys.S || e.KeyCode == Keys.A || e.KeyCode == Keys.D)
                {
                    isMove = true;
                }


                //按下键后再调用判断的方法
                Adjustdirection();
            }

            //键弹起的方法
            public void KeyUp(KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.W:
                        dirU = false;
                        break;
                    case Keys.S:
                        dirD = false;
                        break;
                    case Keys.A:
                        dirL = false;
                        break;
                    case Keys.D:
                        dirR = false;
                        break;
                    case Keys.J:  //如果按下去,并未弹起的是J.K键,就发子弹
                        Fire();
                        break;
                    default:
                        break;
                }
                isMove = false;
                Adjustdirection();
            }

            //重写出生的方法
            public override void Beborn()
            {
                this.X = 240;
                this.Y = 720;
                Singleton.Instance.AddElement(new Born(this.X, this.Y));
            }
        }
    }

    以上是两个类,有点长,不过为了尽快能够找出问题所在,我就全部取出来了,当我调用

    Singleton.Instance.AddElement(new P1Tank(240, 720, 5, 10, directions.U));

    的时候就发生了"TankBattle.P1Tank"类型初始值设定项引发异常,不知道是哪里问题,这个问题纠结好久了,哪位大侠能够帮帮忙哈,不胜感激。

                                                   
    2012年7月3日 22:10

答案

  • 既然是初始化时错误,那么你的P1Tank构造函数呢?我看到你的P1Tank继承自Player,那么Player的构造函数呢?

    另外,你是多线程要创建单例模式,建议这样使用:

    class Singleton  //定义单态.........
         {
           private static object flag = new object();
     
           //省略上面代码……,此处改成private,防止外部调用
            private Singleton()
             { 
     
            }
     
            public void CreateThread()  //创建一个方法,使用多线程
             {
                 Thread hitThread = new Thread(new ThreadStart(HitCheck));
                 hitThread.Start();
             }
     
            private static Singleton instance;
     
            public static Singleton Instance
             {
                 get 
                 {
     
                      if (instance == null)
                      {
                        lock(obj)
                         {
                            if(instance==null)
                            {
                             instance = new Singleton();
                            }
                         }
                     }
                     return instance;
                 }
             }
     

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月4日 2:16
    版主

全部回复