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
posted @ 2007-06-01 09:41  小y  阅读(4448)  评论(4编辑  收藏  举报