C#游戏编程:《控制台小游戏系列》之《五、游戏框架完善》

用C#制作RPG游戏 用c#制作RPG游戏 阅读详情

一、游戏框架完善

    前几章中,游戏框架并没有渲染游戏的能力,只是进行一些逻辑输入的运算,并没有把画面反馈到控制台界面。这一章中,我们将要扩展框架的功能,使它能够对游戏画面进行持续渲染。扩展的功能有:游戏的渲染和控制台的重绘,后者的意思是局部更新,则只更新指定的区域部分,其余区域画面保持不变,减小画面因绘制导致的闪烁。下面是游戏框架类的扩展后的实现:
  ///CGame类实现
[csharp]  view plain copy print ?
  1. using System;  
  2. using System.Threading;  
  3. using System.Runtime.InteropServices;  
  4. using CGraphics;  
  5.   
  6. namespace CEngine  
  7. {  
  8.     /// <summary>  
  9.     /// 通用游戏类  
  10.     /// </summary>  
  11.     public abstract class CGame : ICGame  
  12.     {  
  13.         #region Api函数  
  14.         [DllImport("User32.dll")]  
  15.         private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);  
  16.  
  17.         #endregion  
  18.  
  19.         #region 字段  
  20.   
  21.         //略...  
  22.   
  23.         /// <summary>  
  24.         /// 绘图  
  25.         /// </summary>  
  26.         private CDraw m_draw;  
  27.   
  28.         /// <summary>  
  29.         /// 重绘事件委托  
  30.         /// </summary>  
  31.         /// <typeparam name="TEventArgs"></typeparam>  
  32.         /// <param name="e"></param>  
  33.         public delegate void PaintEventHandler<TEventArgs>(TEventArgs e);  
  34.         /// <summary>  
  35.         /// 重绘事件  
  36.         /// </summary>  
  37.         private event PaintEventHandler<CPaintEventArgs> m_paint;  
  38.  
  39.         #endregion  
  40.  
  41.         #region 构造函数  
  42.   
  43.         /// <summary>  
  44.         /// 构造函数  
  45.         /// </summary>  
  46.         public CGame()  
  47.         {  
  48.             //略...  
  49.             m_draw = new CDraw();  
  50.             //略...  
  51.   
  52.             //添加游戏重绘事件  
  53.             m_paint += new PaintEventHandler<CPaintEventArgs>(onRedraw);  
  54.         }  
  55.  
  56.         #endregion  
  57.  
  58.         #region 游戏运行函数  
  59.   
  60.         /// <summary>  
  61.         /// 游戏初始化  
  62.         /// </summary>  
  63.         protected abstract void gameInit();  
  64.         /// <summary>  
  65.         /// 游戏输入  
  66.         /// </summary>  
  67.         private void gameInput()  
  68.         {  
  69.             //处理鼠标事件  
  70.             this.getMouseDevice().mouseEventsHandler();  
  71.             //处理键盘事件  
  72.             this.getKeyboardDevice().keyboardEventsHandler();  
  73.         }  
  74.         /// <summary>  
  75.         /// 游戏重绘,只在显式更新时才发生  
  76.         /// </summary>  
  77.         /// <param name="e"></param>  
  78.         protected virtual void onRedraw(CPaintEventArgs e)  
  79.         {  
  80.             //缺省是用背景颜色擦除指定区域  
  81.             m_draw.setDrawSymbol(CSymbol.DEFAULT);  
  82.             m_draw.fillRect(e.getClientRect(), Console.BackgroundColor);  
  83.         }  
  84.         /// <summary>  
  85.         /// 游戏渲染  
  86.         /// </summary>  
  87.         /// <param name="draw"></param>  
  88.         protected abstract void gameDraw(CDraw draw);  
  89.         /// <summary>  
  90.         /// 游戏逻辑  
  91.         /// </summary>  
  92.         protected abstract void gameLoop();  
  93.         /// <summary>  
  94.         /// 游戏结束  
  95.         /// </summary>  
  96.         protected abstract void gameExit();  
  97.  
  98.         #endregion  
  99.   
  100.         //略...  
  101.   
  102.         /// <summary>  
  103.         /// 获取控制台区域  
  104.         /// </summary>  
  105.         /// <returns></returns>  
  106.         protected CRect getClientRect()  
  107.         {  
  108.             return new CRect(Console.WindowLeft, Console.WindowTop, (Console.WindowWidth >>1) - 1, Console.WindowHeight);  
  109.         }  
  110.   
  111.         /// <summary>  
  112.         /// 获取绘图对象  
  113.         /// </summary>  
  114.         /// <returns></returns>  
  115.         protected CDraw getDraw()  
  116.         {  
  117.             return this.m_draw;  
  118.         }  
  119.   
  120.         /// <summary>  
  121.         /// 响应重绘事件  
  122.         /// </summary>  
  123.         /// <param name="e"></param>  
  124.         private void onPaint(CPaintEventArgs e)  
  125.         {  
  126.             PaintEventHandler<CPaintEventArgs> temp = m_paint;  
  127.   
  128.             if (temp != null)  
  129.             {  
  130.                 temp(e);  
  131.             }  
  132.         }  
  133.   
  134.         /// <summary>  
  135.         /// 更新操作导致重绘整个工作区  
  136.         /// </summary>  
  137.         protected void update()  
  138.         {  
  139.             CPaintEventArgs e = new CPaintEventArgs(getClientRect(), getDraw());  
  140.             this.onPaint(e);  
  141.         }  
  142.   
  143.         /// <summary>  
  144.         /// 更新操作导致重绘指定区域  
  145.         /// </summary>  
  146.         protected void update(CRect rect)  
  147.         {  
  148.             CPaintEventArgs e = new CPaintEventArgs(rect, getDraw());  
  149.             this.onPaint(e);  
  150.         }  
  151.   
  152.         //略...  
  153.  
  154.         #region 游戏启动接口  
  155.   
  156.         /// <summary>  
  157.         /// 游戏运行  
  158.         /// </summary>  
  159.         public void run()  
  160.         {  
  161.             //游戏初始化  
  162.             this.gameInit();  
  163.   
  164.             Int32 startTime = 0;  
  165.             while (!this.isGameOver())  
  166.             {  
  167.                 //启动计时  
  168.                 startTime = Environment.TickCount;  
  169.                 //计算fps  
  170.                 this.setFPS();  
  171.                 //游戏输入  
  172.                 this.gameInput();  
  173.                 //游戏逻辑  
  174.                 this.gameLoop();  
  175.                 //游戏渲染  
  176.                 this.gameDraw(m_draw);  
  177.   
  178.                 //保持一定的FPS  
  179.                 while (Environment.TickCount - startTime < this.m_updateRate)  
  180.                 {  
  181.                     this.delay();  
  182.                 }  
  183.             }  
  184.   
  185.             //游戏退出  
  186.             this.gameExit();  
  187.             //释放游戏资源  
  188.             this.close();  
  189.         }  
  190.  
  191.         #endregion  
  192.          
  193.         //略...  
  194.     }  
  195. }  

  重绘事件参数类实现为:

  ///CPaintEventArgs类实现

[csharp]  view plain copy print ?
  1. using System;  
  2. using CGraphics;  
  3.   
  4. namespace CEngine  
  5. {  
  6.     /// <summary>  
  7.     /// 重绘事件参数  
  8.     /// </summary>  
  9.     public sealed class CPaintEventArgs : EventArgs  
  10.     {  
  11.         private CRect m_rect;  
  12.         private CDraw m_draw;  
  13.   
  14.         public CPaintEventArgs(CRect rect, CDraw draw)  
  15.         {  
  16.             this.m_rect = rect;  
  17.             this.m_draw = draw;  
  18.         }  
  19.   
  20.         public CRect getClientRect()  
  21.         {  
  22.             return this.m_rect;  
  23.         }  
  24.   
  25.         public void setClientRect(CRect rect)  
  26.         {  
  27.             this.m_rect = rect;  
  28.         }  
  29.   
  30.         public CDraw getDraw()  
  31.         {  
  32.             return this.m_draw;  
  33.         }  
  34.   
  35.         public void setDraw(CDraw draw)  
  36.         {  
  37.             this.m_draw = draw;  
  38.         }  
  39.     }  
  40. }  

  至此,游戏框架类已基本完成,至于声音模块目前就不实现。接下来的几章我们将会使用这个框架实现几个小游戏,以熟悉这个框架的使用方法,并在必要的情况下进行优化,从而更符合使用需求。


二、结语

   这几章下来,一个微型游戏框架逐渐“堆砌”起来了,可以看出,目前框架还非常简陋,从设计、编码、效率来看都非常一般,各方面还需要大家的意见和指点。尽管如此,我们这个框架也不是一无是处,它还是能糊几个小游戏出来的,究竟能做什么小游戏,请看下回分解。
C#游戏编程:《控制台小游戏系列》之《推箱子》 《控制台小游戏系列》今天又添加一个新成员了,那就是经典的《推箱子》小游戏。游戏画面如下: 阅读详情

相关推荐

C#实现一个控制台飞行棋小游戏(附源码)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace 飞行棋小游戏 { class Program { ...

ITwangmenghan的博客 1944

C#做界面遇到的问题----以及自己的解决方法总结

项目名称是 网络路由辅助规划软件 主要用到的技术是用SNMP和ICMP协议来探测目标网络的路由拓扑以及端口的速率等信息。然后根据探测到的信息画出拓扑图,包括各个路由的接口之间的连接。这个连接就是划线,线的颜色和宽度不同代表着不同的带宽。 刚刚接触的时候, 首先我遇到的第一个问题时:觉得无从下手,后来首先了解C#界面的框架结构,代码构成。窗口的组成。后来知道窗口主要是由构件组成的,最主要的是...

weixin_30443747的博客 220

C#实现五子棋小游戏:简单、有趣的编程项目

通过代码示例、图表、解说等方式详细讲解每个步骤的实现过程,引导读者了解C#编程实践中的关键知识点和技巧,同时帮助他们完成一个简单而有趣的五子棋小游戏项目。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 5777

C#小游戏——贪吃蛇~详细过程+全部代码

文章目录一、介绍1)背景2)环境3)演示游戏过程文件格式4)基本逻辑概述i 游戏主体ii 刷新iii 控制蛇的移动iiii 保存最高记录iiiii 吃食物iiiiii 记录用户的输入(很重要)二、步骤1)ControlFrm窗体2)GameFrm窗体:游戏窗体i 变量ii 窗体加载事件iii 玩家敲击键盘的事件iiii timer1 tick事件:iiiii 相关方法蛇移动的方法擦除蛇身生成食物判断是否吃到食物从磁盘文件中获取历史最高分播放音乐死之前判断是否打破了记录iiii

weixin_44996090的博客 2万+

C#控制台版2048游戏编程教程

2048游戏是一款在2014年由Gabriele Cirulli开发的数字拼接游戏,迅速在全世界流行起来。它的魅力在于其简单的规则与富有挑战性的目标,玩家通过上下左右滑动屏幕或键盘,合并相同数字的方块,目标是达到2048这个数字。游戏的目标是在4x4的网格上,通过滑动使得相同数字的方块合并,每次操作后,会在随机空位上生成一个新的数字方块。数字通常是2或4,达到2048后,玩家可以继续游戏,以争取更高分数。封装不仅要求我们隐藏对象的状态细节,还要求我们通过属性和方法来提供对这些状态的访问。

weixin_36235398的博客 760

c#小游戏 适合c#初学者

推箱子小游戏 c#初学者所写,代码简单,结构清晰,但也能体会学习c#的乐趣

C#之控制台版本得贪吃蛇

2.生成墙壁,小蛇碰撞到墙壁或者咬到自己的尾巴,游戏结束。定义一个小蛇类,该类包含吃东西,移动,检测碰撞等方法。4.吃掉食物,增加自身的体长,并生成新的食物。1.给游戏制造一个有限得空间。3.生成随机的食物。

csdn2990的博客 908

C#实现小游戏编程游戏

贪吃蛇;俄罗斯方块;华容道;拼图;扑克;五子棋;源码包集合;游戏编程练习极品项目

c#在开发游戏方面的应用

c#在游戏开发方面的一些小应用

1830

使用electron静默打印

使用electron静默打印 1.使用electron打印的理由 很多情况下程序中使用的打印都是用户无感知的。并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大。 electron提供的打印api可以非常灵活的控制打印设置的显示,并且可以通过html来书写打印内容。 2.api ele...

w1366352655的博客 945

CISP-PTE考前实操练习题

CISP-PTE考前学习练习题目,渗透测试功工程师

2301_79546223的博客 2000

C#游戏编程:《控制台小游戏系列》之《一、黎明前的黑暗》

本系列文章转载至hwenycocodq520 一、前言         码夫掐指一算,博客搁置已半载有余。这半年多来,油价涨的涨,食物毒的毒,小日本越发嚣张……惟独码夫心如止水,不,是技如止水,技术还停留在“社会主义初级阶段”,丝毫没有进步的痕迹。惟叹息:天纵然生我,何还为吾配愚脑……     回到现实,即使码夫天生愚笨,但生活还是要过,技术也要沾沾,不枉老

fa6507的专栏 3111

Python爬虫实战:抓取天气数据并生成可视化图表(完整可复制代码)

工具/库核心作用选型理由requests发送HTTP请求,获取天气网页内容语法简单,上手快,支持Headers配置(反爬)解析HTML页面,提取目标天气数据无需懂复杂XPath,API直观,快速定位标签pandas数据清洗、整理(如日期/温度格式化)一键处理数据格式,与matplotlib无缝适配matplotlib生成可视化图表(折线图/饼图/柱状图)Python主流可视化库,定制性强,支持保存高清图生成随机User-Agent,应对反爬自动更新UA池,避免手动维护。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 909

c#用控制台实现贪吃蛇小游戏

写在前面: 有一天突发奇想,如果我只用算法实现基本逻辑,让控制台输出图像,不用任何组件,只用一门编程语言,能否实现一个可以人机交互的小游戏,抱着试一试的想法,博主用c#控制台程序复原了贪吃蛇玩法的小游戏。 目录 一、可视化界面 二、贪吃蛇基本逻辑 1.游戏玩法 一、可视化界面 众所周知,控制台程序通常没有可视化的界面,只是通过字符串来显示或者监控程序,在使用控制台写程序时,我们只关心数据,不在乎界面。但是,如果我们偏偏反其道而行之,用控制台可视化形式将游戏界面...

sinsted的博客 1万+

告别手动烧录!给STM32H750外挂Flash制作Keil专用下载算法(保姆级避坑指南)

本文详细介绍了为STM32H750外挂Flash开发Keil专用下载算法的全过程,从原理到实战操作,特别针对QSPI Flash的配置和优化提供了保姆级避坑指南。通过定制下载算法,开发者可以告别手动烧录,实现一键下载到外部Flash,大幅提升开发效率。

weixin_42567497的博客 251

服务器基础知识介绍

服务器,不仅仅是一台高性能计算机,更是网络的核心节点,承担着网络服务的责任。然而,相较于普通计算机,服务器对于稳定性、安全性和性能等方面提出了更高的要求,这使得它们在数字化浪潮中傲然独立。在硬件成本结构中,CPU和芯片组占据约50%的成本,内存占15%,外部存储占10%,其余硬件约占25%。服务器的逻辑结构与普通计算机相似,但由于其需要提供高性能计算,对稳定性、可靠性、安全性、可扩展性和可管理性的要求更高。服务器的分类多种多样,根据产品形式可分为塔式服务器、机架服务器、刀片服务器和机柜服务器。

m0_73576645的博客 1882

C#游戏编程:《控制台小游戏系列》之《六、贪吃蛇实例》

一、游戏分析   1976年,Gremlin平台推出一款经典街机游戏Blockade,则为贪吃蛇的原型,这款简单的小游戏很受欢迎,给80后这代人带来不可磨灭的记忆。作为未来程序员的我们,玩自己设计出的贪吃蛇比玩现有的更加有趣,我们可以添加我们所想到的各种特征,即使游戏多么另类都不觉得奇怪,我的游戏我做主!   贪吃蛇的设计并不复杂,是很多游戏编程爱好者入门的首选项目之一,老衲也一样。整观这

fa6507的专栏 1万+

基于LendingClub数据的信贷分析和建模报告

一:课题分析 二:数据获取 三:数据探索 3.1主要特征含义理解 3.2特征分布 3.2.1目标特征分布 3.2.2分类变量的分布 3.2.3连续数值特征分布 3.2.4时序特征分布 3.2.5文字特征分布 3.2.6两两特征的协方差 四:数据预处理 4.1数据集划分 4.2特征缺失值识别与处理 4.2.1严重缺失值的处理 4.2.2缺失值填充 4.3同值性特...

棒子皮蹦蹦床 2万+

C#游戏编程:《控制台小游戏系列》之《二、游戏框架设计》

一、游戏框架结构      游戏的运作流程和拍电影差不多,拍电影前演员事先准备好各种服装和化妆等等准备工作(游戏初始化),导演喊Action开始录制电影(游戏主循环开始),录制的过程中导演会不时地指导着演员(游戏输入),而演员根据台词脚本(游戏逻辑)进行表演,表现出各种不同的画面(游戏渲染),直到导演喊收工(游戏结束),拍戏进入了尾声,这时,送盒饭的应该也到了…… 游

fa6507的专栏 2548

多智能体记忆架构设计:从分层模型到一致性实践

多智能体记忆架构本质上是一个有状态、分布式、支持遗忘的知识系统。从分层模型入手,结合RBAC隔离、版本向量一致性以及混合存储,可以构建出既灵活又健壮的生产级方案。可微分记忆:让记忆的读写操作嵌入端到端训练。基于大模型的记忆压缩:用LLM自动生成情景摘要,取代规则式遗忘。联邦记忆:不同组织之间的多智能体系统在不共享原始数据的情况下协同记忆。希望本文能为你的多智能体项目提供一块坚实的基石。欢迎在评论区分享你在实践中遇到的记忆架构难题。

Ven%的博客 171

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1150

C#游戏编程:《控制台小游戏系列》之《八、爆破七色砖实例》

一、游戏分析   相信各位读者都曾玩过一款叫做《打砖块》的小游戏,和贪吃蛇一样,也是一款80后皆知的经典小游戏。游戏虽然简单但极富挑战性,这章的内容就是制作一款类打砖块的小游戏,继续说明和熟悉游戏框架的使用。和前几个小游戏不同,本章的小游戏有了一些进步,最明显的是有了关卡的概念,游戏不再是单调的一关,你可以自己设计自己所想要的关卡,这一定程度上提高了游戏的可玩性。但是这个游戏和前面的一样,也

fa6507的专栏 2133

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C#控制台相关并在控制台运行小游戏移动逻辑

本文介绍了C#控制台的基本操作方法,包括输入输出、控制台设置和颜色控制等内容。重点讲解了如何利用这些方法实现一个简单的控制台游戏:通过WASD键控制黄色方块的移动。文章提供了完整的代码示例,实现了方块移动、边界检测和退出功能,同时说明了控制台窗口大小、光标位置和颜色设置等关键技术点。这个示例展示了如何将基础控制台操作组合成一个简单的交互式应用。

a704981991的博客 1008

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python控制台小游戏_学习编程的好方法——控制台游戏

本文难度:★☆☆☆☆题图:控制台RPG游戏——诛仙剑 by 呆呆的码农一、前言在我大知乎,有以下基本日常问题:如何学习C语言?如何学习C++?如何学习Python?如何学习XXXX语言?用一句话形容这类问题——高默新泪。高手因为不想反复回答这类问题而沉默……新手因为苦苦找不到入门的路而流泪。本文想要给苦恼的新手们指明一个前进的方向。二、控制台游戏简介所谓控制台,在Windows下就是开始——运行—...

weixin_39830225的博客 1010

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【全栈计划 —— 编程语言之C#】 C# 实现双人飞行棋小游戏

小demo巩固if 、 while 、 for的使用

weixin_52621323的博客 3829
上一篇: C#游戏编程:《控制台小游戏系列》之《四、游戏渲染模块》
下一篇: C#游戏编程:《控制台小游戏系列》之《六、贪吃蛇实例》
fa6507
博客等级 码龄16年 84粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值