闲着无聊,开发第二个游戏,怀恋小时候在游戏机上玩的那种什么飞机。游戏界面:本来是想做成飞机的,无奈没有找到飞机图片,于是用一只蜜蜂代替。本游戏属于碰撞类游戏,主要用到了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转载于:https://www.cnblogs.com/tuyile006/archive/2007/06/01/767303.html
