zoukankan      html  css  js  c++  java
  • C#游戏——极品蜜蜂V1.0

    闲着无聊,开发第二个游戏,怀恋小时候在游戏机上玩的那种什么飞机。

    游戏界面:



    本来是想做成飞机的,无奈没有找到飞机图片,于是用一只蜜蜂代替。

    本游戏属于碰撞类游戏,主要用到了aabb类。游戏中的物体都是该类派生的子类。

    aabb类描述如下:

           

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;

    namespace SuperPlane
    {   
    /*
         * 本类可以实例化为场景中的任何物体,如某个障碍物、飞机的机身、飞机的机翼等
         
    */
        
    class aabb
        {
            
    public Point location;     //对象坐标
            public Size size;          //对象大小
            public int speed;             //移动速度
            public Color myColor;    //对象的颜色
            public objTypes objType;//形状类型,有三种:“圆”,“矩形”,“椭圆”
            public float centerX, centerY;//对象中心坐标
            public float extentX, extentY;//对象xy半径
           
            
    public enum objTypes
            {
                Circle 
    = 1,
                Rectangle 
    = 2,
                ellipse
    =3
            };  
    //形状之种类
            public aabb(Point xy, Size wh, objTypes oType, int Speed,Color mcolor)
            {
                location 
    = xy;
                size 
    = wh;
                centerX 
    = xy.X+wh.Width/2;
                centerY 
    = xy.Y+wh.Height/2;
                extentX 
    = wh.Width/2;
                extentY 
    = wh.Height/2;
                objType 
    = oType;
                speed 
    = Speed;
                myColor 
    = mcolor;
            }
            
    /*与参数提供的对象进行碰撞检测,碰撞则返回true,否则flase*/
            
    public virtual bool hit(aabb BB)
            {
                
    /*其实本应用中除了矩形碰撞,其他的形状都没有出现,椭圆的碰撞比较复杂暂时没有做*/
                
    if (this.objType == objTypes.Rectangle && BB.objType == objTypes.Rectangle)
                    
    return RectangleAndRectangle(BB);  
                
    else if (this.objType == objTypes.Circle && BB.objType == objTypes.Circle)
                    
    return CircleAndCircle(BB);
                
    else if (this.objType == objTypes.Circle && BB.objType == objTypes.Rectangle)
                    
    return CircleAndRectangle(BB);
                
    else if (this.objType == objTypes.Rectangle && BB.objType == objTypes.Circle)
                    
    return RectangleAndCircle(BB);
                
    else
                    
    return RectangleAndRectangle(BB);  //默认当成矩形来处理
            }

            
    /*圆与圆的碰撞检测*/
            
    public bool CircleAndCircle(aabb BB)
            {
                
    float sx = Math.Abs(this.centerX - BB.centerX);//两中心之间的横向距离
                float sy = Math.Abs(this.centerY - BB.centerY);
                
    if ((this.extentX + BB.extentX) < sx || (this.extentY + BB.extentY) < sy)
                    
    return false;  //肯定不能碰撞
                else
                    
    return Math.Sqrt(this.extentX + BB.extentX) > Math.Sqrt(sx) + Math.Sqrt(sy);
            }

            
    /*圆与矩形*/
            
    public bool CircleAndRectangle(aabb BB)
            {
                
    float sx = Math.Abs(this.centerX - BB.centerX);//两中心之间的横向距离
                float sy = Math.Abs(this.centerY - BB.centerY);

                
    if ((this.extentX + BB.extentX) < sx || (this.extentY + BB.extentY) < sy)
                    
    return false;  //肯定不能碰撞
                else
                {
                    
    float dx = Math.Abs(Math.Abs(this.centerX - BB.centerX) - BB.extentX);//圆之中心与矩形最近一角的距离
                    float dy = Math.Abs(Math.Abs(this.centerY - BB.centerY) - BB.extentY);
                    
    if (this.extentX > (dx + dy))
                        
    return true;
                    
    else
                        
    return Math.Sqrt(this.extentX) > (Math.Sqrt(dx) + Math.Sqrt(dy));
                }
            }

            
    /*矩形与圆*/
            
    public bool RectangleAndCircle(aabb BB)
            {
                
    float sx = Math.Abs(this.centerX - BB.centerX);//两中心之间的横向距离
                float sy = Math.Abs(this.centerY - BB.centerY);

                
    if ((this.extentX + BB.extentX) < sx || (this.extentY + BB.extentY) < sy)
                    
    return false;  //肯定不能碰撞
                else
                {
                    
    float dx = Math.Abs(Math.Abs(this.centerX - BB.centerX) - this.extentX);//圆之中心与矩形最近一角的距离
                    float dy = Math.Abs(Math.Abs(this.centerY - BB.centerY) - this.extentY);
                    
    if (BB.extentX > (dx + dy))
                        
    return true;
                    
    else
                        
    return Math.Sqrt(BB.extentX) > (Math.Sqrt(dx) + Math.Sqrt(dy));
                }
            }

            
    /*矩形与矩形*/
            
    public bool RectangleAndRectangle(aabb BB)
            {
                
    float sx = Math.Abs(this.centerX - BB.centerX);//两中心之间的横向距离
                float sy = Math.Abs(this.centerY - BB.centerY);
                
    if ((this.extentX + BB.extentX) < sx || (this.extentY + BB.extentY) < sy)
                    
    return false;  //肯定不能碰撞
                else
                    
    return true;
            }
            
    /*其实本应用中除了矩形碰撞,其他的形状都没有出现*/

            
    /*移动*/
            
    public void up()
            {
                Erase(GameField.winHandle);
                
    this.location.Y -= speed;
                
    this.centerY -= speed;
                Draw(GameField.winHandle);
            }
            
    public void down()
            {
                Erase(GameField.winHandle);
                
    this.location.Y += speed;
                
    this.centerY += speed;
                Draw(GameField.winHandle);
            }
            
    public void down(int newSpeed) //重载down方法
            {
                Erase(GameField.winHandle);
                
    this.location.Y += newSpeed;
                
    this.centerY += newSpeed;
                Draw(GameField.winHandle);
            }
            
    public void left()
            {
                Erase(GameField.winHandle);
                
    this.location.X -= speed;
                
    this.centerX -= speed;
                Draw(GameField.winHandle);
            }
            
    public void right()
            {
                Erase(GameField.winHandle);
                
    this.location.X += speed;
                
    this.centerX += speed;
                Draw(GameField.winHandle);
            }
            
    /*画对象*/
            
    public virtual void Draw(System.IntPtr winHandle)
            {
                Graphics g 
    = Graphics.FromHwnd(winHandle);
                
    //根据需要 画出不同的图形
                Rectangle r = new Rectangle(location, size);
                
    if (this.objType == objTypes.Rectangle)
                    g.FillRectangle(
    new SolidBrush(this.myColor), r);
                
    else  
                    g.FillEllipse(
    new SolidBrush(this.myColor), r);
            }
            
    /*擦除对象*/
            
    public virtual void Erase(System.IntPtr winHandle)
            {
                Graphics g 
    = Graphics.FromHwnd(winHandle);
                Rectangle r
    =new Rectangle(location, size);
                
    if (this.objType == objTypes.Rectangle)
                    g.FillRectangle(
    new SolidBrush(GameField.BackColor), r);
                
    else
                    g.FillEllipse(
    new SolidBrush(GameField.BackColor), r);
            }
        }
    }


    由于键盘操作实在没有小型游戏机快,于是没有进一步做更复杂的功能。
    不过本游戏中亦有第一个游戏所没做到的功能。
    如捕获方向键,项目资源的使用方法等。读者慢慢体会吧~~

    源码下载:CODE        演示版:DEMO
  • 相关阅读:
    计算中文混合字符串长度(一)
    PHP截取含中文的混合字符串长度的函数
    获取星座的JS函数
    获取生日对应星座的PHP函数
    简单的 jQuery 浮动层随窗口滚动滑动插件实例
    MD5算法实现
    70. Climbing Stairs QuestionEditorial Solution
    167. Two Sum II
    167. Two Sum II
    303. Range Sum Query
  • 原文地址:https://www.cnblogs.com/tuyile006/p/767303.html
Copyright © 2011-2022 走看看