⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tankthread.cs

📁 基于.net FrameWork的windows游戏-坦克大战游戏.用到了多线程,绘图,碰撞处理等技术,整个游戏的框架已经搭建起来,可以做二次开发.
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;

public class TankThread
{
    Thread tankThread;
    Form tankGame2008;
    PlayerTankSprite playerTank;
    EnemyTankSprite[] enemyTank;
    ShellSprite MyShell;
    ShellSprite[] enemyShell;
    Explosion explosion;
    int explosionTimes = 0;
    int[] shellTimes = { 0, 25, 75, 100 };


    public TankThread(Form TankGame2008, PlayerTankSprite playerTank, EnemyTankSprite[] enemyTank, ShellSprite myShell, ShellSprite[] enemyShell, Explosion explosion)
    {
        this.playerTank = playerTank;
        this.enemyTank = enemyTank;
        this.tankGame2008 = TankGame2008;
        this.MyShell = myShell;
        this.enemyShell = enemyShell;
        this.explosion = explosion;
    }

    public void run()
    {
        while (tankThread != null)
        {
            tankGame2008.Invalidate();
            try
            {
                Thread.Sleep(10);
                explosionTimes++;
                for (int a = 0; a < shellTimes.Length; a++)
                {
                    shellTimes[a]++;
                }
            }
            catch
            {
            }
            #region explosion
            //处理爆炸效果
            if (explosion.getVisible() == true)
            {
                if (explosionTimes >= 8)
                {
                    explosionTimes = 0;
                    explosion.updateState();
                }
            }
            #endregion

            #region playerTank
            //处理玩家坦克
            if (playerTank.getActive() == true)
            {
                playerTank.updatePos(playerTank.getTankDirection());
                //检测玩家坦克和敌方坦克的碰撞
                for (int i = 0; i < enemyTank.Length; i++)
                {
                    if (playerTank.isCollided(enemyTank[i]) == true && playerTank.getVisible() == true && enemyTank[i].getVisible() == true)
                    {
                        explosion.setPos(playerTank.getX(), playerTank.getY());
                        playerTank.setVisible(false);
                        explosion.setVisible(true);
                    }
                }
            }
            #endregion

            #region enemyTank
            //处理敌方坦克
            for (int i = 0; i < enemyTank.Length; i++)
            {
                //更新
                if (enemyTank[i].getActive() == true && enemyTank[i].getVisible() == true)
                {
                    enemyTank[i].updatePos(enemyTank[i].getTankDirection());
                }
                //检测敌方和敌方的碰撞
                for (int a = 0; a < enemyTank.Length; a++)
                {
                    //如果不是自己和自己检测碰撞
                    if (i != a)
                    {
                        if (enemyTank[i].isCollided(enemyTank[a]) == true && enemyTank[i].getVisible() == true && enemyTank[a].getVisible() == true)
                        {
                            enemyTank[i].setTankDirection(this.reverseDirection(enemyTank[i].getTankDirection()));
                        }
                        if (enemyTank[i].isCollided(playerTank) == true && enemyTank[i].getVisible() == true && enemyTank[i].getActive() == true)
                        {
                            explosion.setPos(playerTank.getX(), playerTank.getY());
                            playerTank.setActive(false) ;
                            playerTank.setVisible(false);
                        }
                    }
                }
            }
            #endregion

            #region PlayerShell
            //处理玩家炮弹
            if (MyShell.getActive() == true)
            {
                MyShell.updatePos(MyShell.getShellDirection());
                //检测玩家炮弹和敌方坦克的碰撞
                for (int a = 0; a < enemyTank.Length; a++)
                {
                    if (MyShell.isCollided(enemyTank[a]) == true && enemyTank[a].getVisible() == true && MyShell.getVisible() == true)
                    {
                        explosion.setPos(enemyTank[a].getX(), enemyTank[a].getY());
                        enemyTank[a].setActive(false);
                        enemyTank[a].setVisible(false);

                        enemyShell[a].setActive(false);
                        enemyShell[a].setVisible(false);

                        MyShell.setVisible(false);
                        MyShell.setActive(false);

                        explosion.setVisible(true);
                        ((TankGame2008.TankGame2008)tankGame2008).destroyEnemyNumber++;
                    }
                }
            }
            #endregion

            #region enemyShell
            //处理敌方炮弹
            for (int i = 0; i < enemyShell.Length; i++)
            {
                //使坦克间隔一段时间发炮弹
                if (shellTimes[i] >= 100)
                {
                    //如果坦克visible为true,才处理它的炮弹
                    if (enemyTank[i].getVisible() == true)
                    {
                        enemyShell[i].setShellDirection(enemyTank[i].getTankDirection());
                        enemyShell[i].setVisible(true);
                        enemyShell[i].setActive(true);
                        if (enemyTank[i].getTankDirection() == 0)
                        {
                            enemyShell[i].setPos(enemyTank[i].getX(), enemyTank[i].getY() + enemyTank[i].getHeight() / 2);
                        }
                        if (enemyTank[i].getTankDirection() == 1)
                        {
                            enemyShell[i].setPos(enemyTank[i].getX() + enemyTank[i].getWidth(), enemyTank[i].getY() + enemyTank[i].getHeight() / 2);
                        }
                        if (enemyTank[i].getTankDirection() == 2)
                        {
                            enemyShell[i].setPos(enemyTank[i].getX() + enemyTank[i].getWidth() / 2, enemyTank[i].getY());
                        }
                        if (enemyTank[i].getTankDirection() == 3)
                        {
                            enemyShell[i].setPos(enemyTank[i].getX() + enemyTank[i].getWidth() / 2, enemyTank[i].getY() + enemyTank[i].getHeight());
                        }
                    }
                    shellTimes[i] = 0;
                }
                if (enemyShell[i].getActive() == true)
                {
                    enemyShell[i].updatePos(enemyShell[i].getShellDirection());
                }
                //检测敌方炮弹和玩家炮弹的碰撞
                if (enemyShell[i].isCollided(MyShell) && enemyShell[i].getVisible() == true && MyShell.getVisible() == true)
                {
                    enemyShell[i].setVisible(false);
                    enemyShell[i].setActive(false);
                    MyShell.setVisible(false);
                    MyShell.setActive(false);
                }
                //检测敌方炮弹和敌方炮弹的碰撞
                for (int a = 0; a < enemyShell.Length; a++)
                {
                    if (a != i)
                    {
                        if (enemyShell[i].isCollided(enemyShell[a]) && enemyShell[i].getVisible() == true && enemyShell[a].getVisible() == true)
                        {
                            enemyShell[i].setVisible(false);
                            enemyShell[i].setActive(false);
                            enemyShell[a].setVisible(false);
                            enemyShell[a].setActive(false);
                        }
                    }
                }
                //检测敌方炮弹和玩家坦克的碰撞
                if (enemyShell[i].isCollided(playerTank) == true && playerTank.getVisible() == true && enemyShell[i].getVisible() == true)
                {
                    explosion.setPos(playerTank.getX(), playerTank.getY());
                    explosion.setVisible(true);
                    playerTank.setVisible(false);
                    enemyShell[i].setVisible(false);
                    playerTank.setActive(false);
                    enemyShell[i].setActive(false);
                }
                for (int a = 0; a < enemyTank.Length; a++)
                {
                    if (a != i)
                    {
                        if (enemyShell[i].isCollided(enemyTank[a]) == true && enemyShell[i].getVisible() == true && enemyTank[a].getVisible() == true)
                        {
                            enemyShell[i].setVisible(false);
                            enemyShell[i].setActive(false);
                        }
                    }
                }
            }
            #endregion
        }
    }

    public void startRuning()
    {
        tankThread = new Thread(run);
        tankThread.Start();
    }

    public void stopRuning()
    {
        tankThread = null;
    }

    public int reverseDirection(int direction)
    {
        int result = 0;
        switch (direction)
        {
            case 0:
                result = 1;
                break;
            case 1:
                result = 0;
                break;
            case 2:
                result = 3;
                break;
            case 3:
                result = 2;
                break;
        }
        return result;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -