java声控框架,[Java教程]声控飞机游戏移植HTML5《一》winform版本介绍与代码分析_星空网...

本文主要是介绍java声控框架,[Java教程]声控飞机游戏移植HTML5《一》winform版本介绍与代码分析_星空网...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声控飞机游戏移植HTML5《一》winform版本介绍与代码分析

2011-12-30

0

游戏介绍

bc91bb04e6e9c61e24c974e4440db8f2.gif

这是一个声控飞机游戏,具体玩法模仿iphone上面的ahhhpa,飞机会自动下降,你可以声控飞机上升与发射子弹,不过这里声控自己可以设置,支持中文和英文。

详细介绍

bc91bb04e6e9c61e24c974e4440db8f2.gif

Element  游戏元素类,提供游戏元素基本操作与属性 public abstract class Element { #region 字段 /// /// 元素坐标X /// private int x; /// /// 元素坐标Y /// private int y; /// /// 是否还“活着” /// private bool alive = true; /// /// 显示用的图片 /// private Image img; /// /// 移动的速度 /// private int speed; /// /// 宽度 /// private int width; /// /// 高度 /// private int height; #endregion #region 属性 public int Width { get { return width; } set { width = value; } } public int Height { get { return height; } set { height = value; } } /// /// 显示用的图片 /// public Image Img { get { return img; } set { img = value; } } public int Speed { get { return speed; } set { speed = value; } } public bool Alive { get { return alive; } set { alive = value; } } /// /// 元素坐标X /// public int X { get { return x; } set { x = value; } } /// /// 元素坐标Y /// public int Y { get { return y; } set { y = value; } } #endregion #region 函数 /// /// 显示自己 /// /// public abstract void Show(Graphics g); /// /// 获取自己的范围 /// public Rectangle GetScope() { Rectangle rt = new Rectangle(x, y, width, height); return rt; } /// /// 构造函数 /// /// x坐标 /// y坐标 public Element(int x, int y, int speed) { this.x = x; this.y = y; this.speed = speed; this.alive = true; } /// /// 死亡 /// public void Death() { alive = false; } #endregion }

RoadBlock 游戏障碍物类 public class RoadBlock : Element { public bool IfCatch { get; set; } static Random rd = new Random(); static int XMax = FrmMain.GAMEWIDTH; static int YMax = FrmMain.GAMEHEIGHT-70; static int YMin=50; //bool first = true; public override void Show(System.Drawing.Graphics g) { Move(); g.DrawImage(Img, X, Y); } public void Move() { X -= 10; if (X < 0) { Alive = false; } } public void GetImage(int t) { Img = Image.FromFile(@"images/" + "roadblock/" + t + ".png"); Width = Img.Width; Height = Img.Height; } private RoadBlock(int x, int y, int speed) : base(x, y, speed) { IfCatch = false; GetImage(3); } public static RoadBlock CreateRoadBlock() { int x, y; x = rd.Next((int)(XMax / 2), XMax); y = rd.Next(YMin, YMax); return new RoadBlock(x, y, 10); } }

Plane  飞机类 public class Plane : Element { public BloodBox blood = new BloodBox(50, 50, 10); public PlaneDirction dir { get; set; } /// /// 血量值 /// public int bloodvalue { get; set; } /// /// 飞机的种类 /// int type; public int Type { get { return type; } set { type = value; } } public Bullet Fire() { Bullet bl = new Bullet(X+78, Y+40, 1); return bl; } public void Move(PlaneDirction pdir) { if (pdir == PlaneDirction.Up) { Y -= 40; } else { Y += 2; } //超出边界检测 if (X < 0) X = 0; if (Y < 0) Y = 0; if (X + this.Width > FrmMain.GAMEWIDTH ) X = FrmMain.GAMEWIDTH - this.Width; if (Y + this.Height > FrmMain.GAMEHEIGHT) Y = FrmMain.GAMEHEIGHT - this.Height; } public override void Show(Graphics g) { Move(PlaneDirction.Down); g.DrawImage(Img, X, Y); blood.Draw(g); } /// 角色类型 public void GetImage(int t) { type = t; Img = Image.FromFile(@"images/plane/" + t + ".png"); Width = Img.Width; Height = Img.Height; } public void Bleeding(int i) { bloodvalue -= i; if (bloodvalue == 0) { this.Alive = false; } else { blood.NowLife = bloodvalue; } } public Plane(int t, int x, int y, int speed) : base(x, y, speed) { bloodvalue = 10; GetImage(t); } }

Bullet 子弹类 public class Bullet : Element { public void Move() { X += 3; if (X > FrmMain.GAMEWIDTH) { Alive = false; } } public override void Show(Graphics g) { Move(); g.DrawImage(Img, X, Y); } public void GetImage() { Img = Image.FromFile(@"images/bullet/" + "2.png"); Width = Img.Width; Height = Img.Height; } public Bullet(int x, int y, int speed) : base(x, y, speed) { GetImage(); } }

BloodBox 血条类 public class BloodBox { int x = 0; int y = 0; //血条的单位长度 private const int WIDTH = 1; //血条的高度 private const int HEIGHT = 10; private int allLife, nowLife; public BloodBox(int x, int y, int allLife) { this.x = x; this.y = y; this.allLife = allLife; this.nowLife = allLife; } public int NowLife { set { nowLife = value; } } public void Draw(System.Drawing.Graphics g) { g.DrawString("Life:"+nowLife, new Font("Arial", 10f), new SolidBrush(Color.Red), x - 30, y - 3); g.DrawRectangle(new Pen(Color.Red), x+30, y, WIDTH * allLife, HEIGHT); g.FillRectangle(new SolidBrush(Color.Red), x+30, y, WIDTH * nowLife, HEIGHT); } } }

Controler 游戏全局控制类 public class Controler { public List rb { get; set; } public List bl { get; set; } public Plane p { get; set; } public int score { get; set; } public string Name { get; set; } public Controler(int type) { Name = "无名"; rb = new List(); bl = new List(); p = new Plane(type, 50, 50, 0); } public bool Draw(Graphics g) { if (p.Alive == false) { return false; } else { p.Show(g); } for (int i = 0; i < rb.Count; i++) { if (rb[i].Alive == false) { if (rb[i].IfCatch == true) { score++; } rb.Remove(rb[i]); } else { rb[i].Show(g); } } for (int i = 0; i < bl.Count; i++) { if (bl[i].Alive == false) { bl.Remove(bl[i]); } else { bl[i].Show(g); } } return true; } public void DoHitCheck() { if (p.Alive) { //检测飞机与障碍物是否相交 for (int i = 0; i < rb.Count; i++) { if (p.GetScope().IntersectsWith(rb[i].GetScope())) { p.Bleeding(1); rb[i].Alive = false; } } //检测障碍物与子弹是否相交 for (int i = 0; i < bl.Count; i++) { for (int j = 0; j < rb.Count; j++) { if (bl[i].GetScope().IntersectsWith(rb[j].GetScope())) { rb[j].IfCatch = true; rb[j].Alive = false; bl[i].Alive = false; } } } } } }

语音控制核心方法 #region Speech Recognition private void InitializeSpeechRecognitionEngine(string up,string shoot) { recognizer.SetInputToDefaultAudioDevice(); Grammar customGrammar = CreateCustomGrammar(up,shoot); recognizer.UnloadAllGrammars(); recognizer.LoadGrammar(customGrammar); recognizer.SpeechRecognized += new EventHandler(recognizer_SpeechRecognized);//其次触发的事件 recognizer.SpeechHypothesized += new EventHandler(recognizer_SpeechHypothesized);//首先触发的事件 } private Grammar CreateCustomGrammar(string up,string shoot) { GrammarBuilder grammarBuilder = new GrammarBuilder(); grammarBuilder.Append(new Choices(up,shoot)); return new Grammar(grammarBuilder); } private void TurnSpeechRecognitionOn() { recognizer.RecognizeAsync(RecognizeMode.Multiple); } private void TurnSpeechRecognitionOff() { if (recognizer != null) { recognizer.RecognizeAsyncStop(); } } private void recognizer_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)//先执行 { // GuessText(e.Result.Text); string text = e.Result.Text; SpeechToAction(text); } private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)//后执行 { } private void SpeechToAction(string text) { if (text == up) { ct.p.Move(PlaneDirction.Up); } if (text == shoot) { ct.bl.Add(ct.p.Fire()); } } #endregion排行榜相关操作 public class Top { public string Name { get; set; } public int Score { get; set; } } public class Collection { public List toplist; public Collection() { toplist = new List(); } } public class TopCollection : Collection { public void Add(Top value) { base.toplist.Add(value); } public Top this[int idx] { get { return (Top)base.toplist[idx]; } set { base.toplist[idx] = value; } } }

游戏的结构还是很简单,主要复杂的地方有 语音控制、游戏相关的操作如碰撞等。

以前一直在做C#方面的学习,最近开始接触HTML5游戏,所以想把自己以前的这个游戏拿出来改成HTML5版本和大家分享。这里是第一篇,后面会逐渐把游戏改成HTML5。

HTML5也是刚刚入门,希望这个系列能是我们大家一起学习的机会,希望大家多多提意见。:)

游戏代码下载地址    点此下载

0

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

这篇关于java声控框架,[Java教程]声控飞机游戏移植HTML5《一》winform版本介绍与代码分析_星空网...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430227

相关文章

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker