在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → winform打飞机小游戏

winform打飞机小游戏

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.56M
  • 下载次数:101
  • 浏览次数:2186
  • 发布时间:2018-05-08
  • 实例类别:C#语言基础
  • 发 布 人:cheng231
  • 文件格式:.zip
  • 所需积分:5
 相关标签: 游戏 winform 飞机 ORM 小游戏

实例介绍

【实例简介】

【实例截图】

from clipboard


from clipboard


【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace DragonQuest
{
    public partial class FrmMain : Form
    {
        public const int GAMEWIDTH = 600;//游戏窗口的宽度
        public const int GAMEHEIGHT = 700;//游戏窗口的高度
        private bool isFailed = false;
        private bool isWon = false;

        public static Bitmap backgroundImg = new Bitmap(Application.StartupPath   "\\images\\background.png");

        //游戏是否开始
        private bool isStart = false;
        private EnemyBoss eBoss = new EnemyBoss(-90, 200, 6, 6, 200, false, true, true);

        //背景滚动的参数
        private int roll = 0;

        //双缓冲用到的变量
        private Bitmap bufferImg = null;
        private Graphics gImg = null;

        Thread pt = null;

        public static Random enemyRandom = new Random();

        int pkBoss = 0;


        public FrmMain()
        {
            InitializeComponent();
            LauchForm();
        }

        /// <summary>
        ///  当运行窗体的时候要用的代码
        /// </summary>
        private void LauchForm()
        {
            this.Width = GAMEWIDTH;//设置窗口的宽度
            this.Height = GAMEHEIGHT;//设置窗口的高度

            //设置显示图元控件的几个属性: 必须要设置,否则画面会闪烁
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);

            //创建一张位图,以后就在位图上作画,然后贴到窗口上,达到双缓冲
            bufferImg = new Bitmap(GAMEWIDTH, GAMEHEIGHT);
            //指定的 Image 返回一个新的 Graphics。
            gImg = Graphics.FromImage(bufferImg);

            isStart = true;
        }

        private void PaintThread()
        {
            //当游戏开始的时候,就开始刷新屏幕
            while (isStart)
            {
                //画背景图片
                DrawBackground(gImg);

                GetEnemys();

                HitCheck.GetInstance().DoHitCheck();
                if ((isFailed==false)&&(HitCheck.GetInstance().MyHero.blb.NowLife <= 0))
                {

                    MessageBox.Show("很遗憾,你输了!");
                    isFailed = true;
                    
                }
                if ((isWon == false) && (eBoss.blb.NowLife <= 0))
                {
                    MessageBox.Show("恭喜你,你赢了!");
                    isWon = true;
                }

                HitCheck.GetInstance().Draw(gImg);

                this.Invalidate();

                Thread.Sleep(50);
            }
        }

        private void GetEnemys()
        {
            if (pkBoss == -1)
            {
                return;
            }

            if (pkBoss < 10)
            {
                if (enemyRandom.Next(0, 200) < 5)
                {
                    HitCheck.GetInstance().AddElement(new EnemyOne(enemyRandom.Next(-90, 500), -50, 10, 10, 10, false, enemyRandom.Next(0, 2) == 0 ? true : false));
                    pkBoss  ;
                }

                if (enemyRandom.Next(0, 200) < 5)
                {
                    HitCheck.GetInstance().AddElement(new EnemyTwo(-50, enemyRandom.Next(100, 450), 5, 5, 10, false, enemyRandom.Next(0, 2) == 0 ? true : false));
                    pkBoss  ;
                }

                if (enemyRandom.Next(0, 200) < 2)
                {
                    HitCheck.GetInstance().AddElement(new EnemyThree(enemyRandom.Next(10, 540), 800, 5, 5, 10, false));
                    pkBoss  ;
                }
            }
            else
            {
                
                HitCheck.GetInstance().AddElement(eBoss);
                pkBoss = -1;
            }
        }

        /// <summary>
        /// 画游戏背景
        /// </summary>
        /// <param name="g"></param>
        private void DrawBackground(Graphics g)
        {
            g.DrawImage(backgroundImg, 0, roll - GAMEHEIGHT, 600, 700);
            g.DrawImage(backgroundImg, 0, roll, 600, 700);

            roll  = 3;
            if (roll >= 700) roll = 0;
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            Console.WriteLine("Hello!");
            Console.Read();
            HitCheck.GetInstance().AddElement(new Hero(300, 500, 10, 10, 100, true));

            //窗体加载后,启动线程,刷新界面
            pt = new Thread(new ThreadStart(PaintThread));
            pt.Start();
        }

        private void FrmMain_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bufferImg, 0, 0);//把画布贴到画面上
        }

        /// <summary>
        /// 清理资源
        /// </summary>
        private void DisResource()
        {
            isStart = false;
            //等待线程结束
            pt.Join();

            bufferImg.Dispose();
            gImg.Dispose();
            backgroundImg.Dispose();
        }

        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("真的要退出游戏吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                e.Cancel = true;
            }
            else
            {
                DisResource();
            }
        }

        private void FrmMain_KeyDown(object sender, KeyEventArgs e)
        {
            HitCheck.GetInstance().MyHero.KeyDown(e);
        }

        private void FrmMain_KeyUp(object sender, KeyEventArgs e)
        {
            HitCheck.GetInstance().MyHero.KeyUp(e);
        }
    }
}


网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警