首页 > 其他分享 >基于MonoGame重制《俄罗斯方块》游戏

基于MonoGame重制《俄罗斯方块》游戏

时间:2024-08-15 20:54:13浏览次数:17  
标签:游戏 MonoGame 点击 重制 版本 按键 方块

两年前,我使用C#基于MonoGame编写了一款《俄罗斯方块》游戏,相关介绍可以参考【这篇文章】。最近,使用业余时间将之前的基于MonoGame的游戏开发框架重构了一下,于是,也就趁此机会将之前的《俄罗斯方块》游戏也重制一次,加入了许多我一直打算加入的功能,甚至包括提供跨平台的版本。

先说说这个游戏开发框架,我给它取名为Mfx(MonoGame Fx,Fx是Framework的缩写,但又不想跟MonoGame Framework重名),仓储地址是:https://github.com/daxnet/mfx。这个重构过的框架在整体结构设计上比其前任版本Ovow(https://github.com/daxnet/ovow)更为合理,去掉了一些不必要的功能,也加入了一些新的功能。业余时间有限,所以也没打算将它真正开发成一个完整的游戏引擎,就是能够支持我自己写的一些小游戏就可以了,所以,也不打算对它做过多介绍。

回到重制版《俄罗斯方块》游戏,先开源:【https://github.com/daxnet/tetris-sharp-revised】,在这个页面的Releases列表里,可以直接点击最新的发布版本,然后选择对应的操作系统的ZIP包进行下载把玩,目前该游戏编译输出Windows、Linux和MacOS三个版本(Linux我在Ubuntu 24.04 LTS Desktop下测试可用,MacOS没有试过)。当然,如果不想玩游戏,可以直接看视频:

<iframe allowfullscreen="allowfullscreen" frameborder="no" scrolling="no" src="//player.bilibili.com/player.html?isOutside=true&aid=112965793613729&bvid=BV1wuebeFE5d&cid=500001650505428&p=1"></iframe>

与旧版本相比,新版文件尺寸更小,打包后尺寸为62MB,相比之前的107MB,减小了45MB,其实新版本自带的背景音乐更加丰富,资源大小也变得更大,但总尺寸是下降了,也是因为.NET从6升级到8后,本身也做了不少的优化。对于这样一个简单的游戏为何会有这么大尺寸?主要有两个方面的原因:各种资源需要占用一部分空间,另外就是在打包编译后的程序时使用了--self-contained开关,也就意味着将整个.NET 8都打包在了一起,玩家不需要安装任何.NET相关的运行库。那反过来想想,如果使用相同的这套技术开发了一个大型游戏,虽然资源会占更多的空间,但是即便是几百MB甚至上GB,或许你也不会在意它的尺寸了。

下载并解压之后,双击TetrisSharp.exe(Linux下先chmod +x ./TetrisSharp,然后直接运行)即可开始游戏,点击【NEW GAME】菜单就能进入主界面开始游戏,【CONTINUE】菜单目前是不可用的,在游戏过程中,按下键盘上的ESC键,即可返回标题界面,此时CONTINUE菜单才可用,点击即可继续游戏。【LOAD】菜单也是不可用的,但在游戏的过程中任意时刻退出游戏,游戏状态会被保存下来,下一次重新运行游戏时,LOAD菜单就会变成可用状态,点击即可载入上次保存的游戏状态。点击【INPUT SETTINGS】菜单可以进入按键设置界面:

红色字体提示当前正在设置的按键,此时只需要在键盘或者游戏手柄上按下对应的键,红色选中项就会跳到下一个项目。如果中途有任何按键设置错误,可以点击【RESET】按钮,从头开始重新设置按键。设置完毕后,点击【SAVE】按钮保存,或者点击【CANCEL】按钮取消设置。对于游戏手柄,目前好像并不是所有手柄都支持(我自己使用的是8BitDo M30),建议可以连上试试,切换一下手柄的模式(估计需要XBOX模式),如果不行,还是先用键盘体验吧。

如上图所示,第一次运行游戏,默认使用键盘作为输入,按键定义如下:

  • 方块下移:S
  • 方块左移:A
  • 方块右移:D
  • 方块旋转:J
  • 方块下落到底:K
  • 暂停游戏:空格键
  • (隐藏:回到开始界面:ESC)

跟老版本相比,新版本在界面上进行了优化(如下上图为老版本,下图为新版本):

主要改进地方有:

  1. 棋盘变得更大:由原来的12x24改为了15x28
  2. 方块材质进行了调整
  3. 方块下落时会在棋盘上留下投影,方便定位
  4. 为方块快速下落新增独立按键,按下后直接将方块下落到最底端
  5. 界面配色和字体做了调整
  6. 显示已经使用过的方块数量
  7. 统计最高分,当分数突破最高分后会更新最高分

此外,在游戏操控方面也做了一些优化,按键控制更加灵活。由于修正了旧版本中的背景音乐加载问题,新版内存占用率大幅下降,为原来的50%左右,从400多MB降为了200多MB。总而言之,新版本更接近一个完整的游戏。

与老版本相同,新版也提供了自定义方块的功能,只不过新版使用了更为简洁的文本文件,而非之前的XML文件。在游戏目录下,找到blocks.txt文件,双击打开即可编辑。文件格式如下:

  • #开头行为注释行
  • 每个方块的定义都是以block "<名称>"指令开头,end block指令结束,中间包含1到多行方块变体(也就是旋转形态Rotation)的定义
  • 每个方块变体占用一行,比如L形方块,它有四个旋转形态:

    标签:游戏,MonoGame,点击,重制,版本,按键,方块
    From: https://www.cnblogs.com/daxnet/p/18359876

相关文章

  • 结构开发笔记(四):solidworks软件(三):绘制36x36方块摄像头示意体
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141187797长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…硬件相关开发......
  • c语言实现俄罗斯方块
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#include<conio.h>#defineSPACE32#defineLEFT 75#defineRIGHT77#defineDOWN80#defineESC27#defineWall2#defineBox1#defineKong0#define......
  • 遇到《生化危机2重制版》 amd_ags_x64.dll 错误?别急!简单几步恢复游戏运行
    《生化危机2重制版》(ResidentEvil2Remake)是一款备受玩家喜爱的游戏,但有些玩家在尝试启动游戏时可能会遇到“缺少amd_ags_x64.dll”这样的错误提示。这通常意味着您的计算机上缺少某个必要的动态链接库文件(DLL),或者该文件已损坏。本文将解释这一问题的原因,并提供几种可能的解......
  • 699. 掉落的方块 Hard
    在二维平面上的x轴上,放置着一些方块。给你一个二维整数数组 positions ,其中 positions[i]=[lefti,sideLengthi] 表示:第 i 个方块边长为 sideLengthi ,其左侧边与x轴上坐标点 lefti 对齐。每个方块都从一个比目前所有的落地方块更高的高度掉落而下。方块沿y......
  • 【教学类-70-02】20240724立体拼图(9方块6图)-N套测试(蝴蝶)
       背景需求前期做了一个蝴蝶的六面图【教学类-70-01】20240724立体拼图(9方块6图)-1套测试(蝴蝶)-CSDN博客文章浏览阅读279次,点赞11次,收藏2次。【教学类-70-01】20240724立体拼图(9方块6图)-1套测试(蝴蝶)https://blog.csdn.net/reasonsummer/article/details/140669551这次......
  • 如何在 MacOS 上生成跟随鼠标的绿色方块?
    我正在尝试编写一个python应用程序,它生成一个没有填充的绿色方块,跟随我的光标。我希望这个正方形始终可见,所以用CSS术语来说,我希望它的z-index最大。我想实现这一点的方法是:首先实现一个不断检索我的光标位置的重复方法。在它旁边生成一个绿色方块。......
  • 俄罗斯方块游戏的算法实现
    已经实现的功能有:地图功能方块向左向右向下移动方块旋转90、180、270、360向下移动到底了未实现的:向下移动到底,判断是否消除行随机添加新的方块游戏结束 functionBinaryBlockGame(width=10,height=10){this.role=nullthis.roleMap=nullthis.data=ne......
  • Unity 脚本修改方块透明度使其有一个渐变效果
    usingUnityEngine;usingSystem.Collections;publicclassTestClass:MonoBehaviour{privatefloatAlphaValue=1.0f;privatefloattime=0.0f;privateboolstate=false;Materialmaterial;privatevoidStart(){mater......
  • 俄罗斯方块小游戏(附源码)
    游戏展示一.导包importturtleimportrandom二.定义一个Block类定义一个Block类,用于表示游戏中的方块,包含颜色和形状。classBlock:def__init__(self,color,tiles):self.color=colorself.tiles=tiles三.定义了7个不同的Block对象定......
  • Python俄罗斯方块可操纵卷积分类 | 稀疏辨识算法 | 微分方程神经求解器
    ......