斜45度游戏开发(一)

斜45度地图简介、坐标系转换以及数据碰撞       手机平台上开发斜45度地图系统的游戏,相信做惯了正面俯视的开发者刚接触总很不习惯。所谓斜45度游戏,也就是常说的2.5D游戏,用斜方向俯视的角度来增强立体感的一种技术。这种技术在PC平台上早就流行了,手机平台由于屏幕表现力的限制,大部分使用正面视角。但随着手机屏幕分辨率不断增大,斜45度视角的游戏出现得越来越多。       斜45度地图系统分Staggered、Slide、Diam... 阅读详情
                                                           斜45度游戏开发(一)
作者:Flysky 2005

 

注:写的十分粗糙,如果看不懂请对照KgameV1.0源代码浏览。

  最好的游戏末过于RPG游戏了,但如果赢得大众的好评,那么必须要采用(甚至说现在是一种标准)斜45度地图、人物游戏引擎,下面我们分别展开分析。

一.地图数据结构

Soft的《圣剑英雄传二》定义的就不错,可以参考它的。
定义地图结构以前,我们要先定义Tile结构,分两种情况。

(1).物品、景物等按NPC处理(不规则处理,如“魔力宝贝”):
typedef struct{
    bool IsGround;//是否显示地表
    short GroundPicNum; //地表图片页面编号(0~59),,,(0-55)页为静态,(56~59)页为动态
    short GroundPicX;   //地表材料在地表图片上的横坐标(以格子为坐标)
    short GroundPicY;   //地表材料在地表图片上的纵坐标(以格子为坐标)
    short Block;         //阻碍标志(ID_BLOCK_T,ID_BLOCK_F)
    short Hook;     //陷阱标志(ID_HOOK_F,ID_HOOK_T …………)
    char HookScriptName[28];
    char Reserve;        //保留位,(我估计我们肯定还有想不到的一些信息,以后可以在这里添加,以免地图编辑完成之后,再修改cell结构时可避免重新编辑地图文件)
}stCell;

具体我也不说什么了,注释都很清楚!

(2).物品、景物也按Tile处理但NPC按不规则处理(如:“仙剑奇侠转”,强烈不推荐!)
typedef struct{
    bool IsGround;//是否显示地表
    short GroundPicNum; //地表图片页面编号(0~59),,,(0-55)页为静态,(56~59)页为动态
    short GroundPicX;   //地表材料在地表图片上的横坐标(以格子为坐标)
    short GroundPicY;   //地表材料在地表图片上的纵坐标(以格子为坐标)
    bool IsObject1;//是否显示物品1
    short Object1PicNum;     //地表图片页面编号(0~59),,,(0-55)页为静态,(56~59)页为动态
    short Object1PicX;  //物体材料1在物体图片上的横坐标(以格子为坐标)
    short Object1PicY;  //物体材料1在物体图片上的纵坐标(以格子为坐标)
    bool IsObject2; //是否显示物品2
    short Object2PicNum;     //地表图片页面编号(0~59),,,(0-55)页为静态,(56~59)页为动态
    short Object2PicX;  //物体材料2在物体图片上的横坐标(以格子为坐标)
    short Object2PicY;  //物体材料2在物体图片上的纵坐标(以格子为坐标)
    short Block;         //阻碍标志(ID_BLOCK_T,ID_BLOCK_F)
    short Hook;     //陷阱标志(ID_HOOK_F,ID_HOOK_T …………)
    char HookScriptName[28];
    char Reserve;        //保留位,(我估计我们肯定还有想不到的一些信息,以后可以在这里添加,以免地图编辑完成之后,再修改cell结构时可避免重新编辑地图文件)
}stCell;

太清楚了,我也不解释了!

下一步就是地图了,地图的处理不管是什么方法大同小异.
    int ID;  //地图编号
char Name[32];        //地图名称(地图文件名)
    int Width;    //宽度(以格子为坐标) 斜
    int Height;   //高度(以格子为坐标) 斜
    int MapStartX,MapStartY; //左上角坐标
    stCell **Cell; //动态格子
    char FileName[32];    //当前地图文件名
    char ScrFName[32];    //地图初始化脚本文件名
    char Reserve[4];        //保留位,(我估计我们肯定还有想不到的一些信息,以后可以在这里添加,以免地图编辑完成之后,再修改Map_struct格式,破坏原先编好的地图文件)

    //这里先不用看,到了那里再说。
    LPDIRECTDRAWSURFACE7 lpDDS_MapBack; //地图临时保存点
    LPDIRECTDRAWSURFACE7 lpDDS_TMouse; //Tile鼠标
    int MapBx,MapBy; //用来优化机器

  这样不就介绍完了吗?简单吧,不过后面的越来越难,做好心理准备。

二.坐标转换

各大文章在这里都快讲疯了,我不想说推理方法了,你记住以下函数就可以:

    //斜45度的坐标转换成屏幕坐标
    inline void MIToMD(int Dx,int Dy,int &Ix,int &Iy)
    {
        Ix=(TileWidth>>1)*(Dx-Dy);//转换为绝对坐标x
        Iy=(TileHeight>>1)*(Dx+Dy);//转换为绝对坐标y      大菱形
    }

    //屏幕坐标转换成斜45度的坐标
    inline void MDToMI(int Ix,int Iy,int &Dx,int &Dy)
    {
        Dx=int(0.5*((Iy<<1)+Ix)/(TileWidth>>1));
        Dy=int(0.5*((Iy<<1)-Ix)/(TileWidth>>1));
    }

其中
    #define TileWidth 32 //每个Tile的宽
    #define TileHeight 16 //每个Tile的高


三.绘制地图

  绘制地图有什么难的,错!地图绘制好了FPS能提高数倍。

传统的地图绘制方法:

for(int i=0;i<height;i++)
{
    for(int t=0;t<width;t++)
    {
        绘制。。。。。
    }
}

经过改进我这样做

if (MapBx!=x&&MaxBy!=y)
{
    for(int i=0;i<height;i++)
    {
        for(int t=0;t<width;t++)
        {
            绘制。。。。。
            更新MaxBx和MaxBy
            备份地图(存成图片)
        }
    }
}
else
{
    还原地图(取出图片)
}

这样空闲状态的FPS就会提升,什么?还想提升,这样办吧!

推理方法从略(其实我也不记得的,春天写的):

    #define MapDMX int(0.5*((ScreenHeight<<1)+ScreenWidth)/(TileWidth>>1))+1  //最大画出点X
    #define MapDMY int(0.5*(ScreenHeight<<1)/(TileWidth>>1))+1 //最大画出点Y
    #define MapDSY int(0.5*(-ScreenWidth)/(TileWidth>>1))-1  //最小画出点Y(特殊)

然后
if (MapBx!=x&&MaxBy!=y)
{
    for (int Y=IntSizeL(MapStartY+MapDSY,0); Y<IntSizeS(MapStartY+MapDMY,Height); Y++)
    {
        for (int X=IntSizeL(MapStartX-1,0); X<IntSizeS(MapStartX+MapDMX,Width); X++)
        {
            绘制。。。。。
            更新MaxBx和MaxBy
            备份地图(存成图片)
        }
    }
else
{
    还原地图(取出图片)
}

其中IntSizeL取两个数大的,IntSizeS取两个数小的!

速度优化到极限了,好了,先写到着,下一次我再说遮挡。


由于高度图自动生成斜45度地图 《古月游戏开发库》官方示例程序二十二──由高度图自动实时生成斜45度地图   这是一个稍微有些用处的程序,它可以利用一张灰度图做为高低依据,自动实时生成二维游戏中常用的斜45度地图画面。   当然,这个程序做的很简单,而且没有做太多的优化,有些地方也不尽人意,但它已经说明了问题。 立即下载

相关推荐

斜45度角游戏视角分析及AI示范-代码

斜45度角游戏视角分析及AI示范-代码 代码分析,带一个简单的AI,喜欢做游戏的朋友可以拿去研究

cocos对斜45度伪3D游戏的合批方案思考(模拟经营,RTS等)

伪3D大地图渲染效率的合批思路

u013962723的博客 1143

Anaconda详细安装及使用教程(带图文)

Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和Python)。 Conda是一个开源的包、环境管理器,可以用于...

代码帮 186万+

突破等角贴片——再谈斜45度角游戏

斜45度视角游戏的思考 斜45度视角游戏,相信大家都不会佰生,经典的如《暗黑》、《星际》、《传奇》等等。这类游戏,都用2D的贴图来构造“假3D”的游戏世界。具有很强的表现力和很好的交互性。这也是这类游戏得以流行的原因。我在大学二年级时,也做过这类游戏的尝试,你可以在查看http://mysticc.go1.icpcn.com/param/param_arpg_demo.htm...

weixin_30730151的博客 524

别再死记硬背HJB方程了!用Python数值求解一个简单最优控制问题(附完整代码)

本文通过Python数值求解Hamilton-Jacobi-Bellman(HJB)方程,帮助读者从工程实践角度理解最优控制问题。教程涵盖从建立简单车辆控制模型到离散化HJB方程、实现值迭代算法及可视化结果的完整流程,适合具备Python基础的开发者学习。

weixin_42520796的博客 371

【AWS】创建aws云服务器EC2实例

本文介绍了如何创建aws的EC2云服务器,并介绍了如何使用Xshell远程连接上云服务器

Marcos921的博客 2501

同层物体间的遮挡处理

瞬间灵感所得,绝对没有看任何资料。在处理图层的时候,如果总是先画远处的物体,再画近处的物体,那么一定可以得到正确的遮挡关系。举例,在斜角45度的场景中,就要总是从上到下的绘制物体。如何绘制,首先给每个物体指定一个轴点。这个轴点决定物体的远近。如下:红色即表示物体的轴点。当轴点靠下的时候,这个物体后画(它将遮盖轴点靠上的物体一部分或全部);当轴点靠上的时候,它先画(将被轴点靠下的物体遮盖一部分或全部...

weixin_30312659的博客 256

基于 openEuler 24.03 LTS 源码编译安装 Zabbix 7.4

Zabbix是一款开源的企业级分布式监控系统,支持网络、服务器、应用等多种IT资源的监控。核心功能包括数据采集、告警通知、可视化展示等,采用Server/Agent架构,支持多种操作系统。本文详细介绍了在openEuler 24.03系统上部署Zabbix 7.4.2的完整流程,包括环境准备、MySQL配置、PHP/Apache安装、Zabbix编译安装等步骤,为构建企业级监控系统提供了实践指导。

广然笔记 1191

Java中2.5D游戏(斜45度角)的设计与实现(1)

通常的概念中,2D也就是所谓的二维,也就是平面图形——即由X与Y坐标构成的图形,其内容由水平的X轴向与垂直的Y轴描绘确定,也就是由长和高的形成所谓的二维平面。而所谓3D,也称之为三维。其图形内容除了有水平的X轴向与垂直的Y轴向外还有进深的Z轴,故称三维(XYZ),也就是由长、宽、高三项要素形成所谓的三维立体。2D与3D的主要区别在于,3D可以包含360度的信息,能从各个角度去表现,构成近似于现实空

【Java究竟怎么玩?】 1万+

ROS2进程内通信:零拷贝Intra-Process原理与实战

Intra-Process通信是ROS2实现低延迟节点间数据交换的核心机制,其本质是通过C++17智能指针与零拷贝共享内存,在同一进程内绕过序列化、系统调用和上下文切换。相比传统DDS跨进程通信,它将`geometry_msgs::Twist`类消息延迟从42μs降至0.8μs,显著提升机器人实时控制性能。该技术并非自动启用,需满足同执行器、QoS严格匹配、内存所有权明确三大约束,适用于机械臂控制、视觉SLAM、图像处理流水线等对端到端延迟敏感的场景。本文聚焦ROS2原生Intra-Process通讯的原理

weixin_30619101的博客 363

电子科技大学计算机预推免(最终去向)

电子科技大学,预推免报名时必须要有一封本校老师写的推荐信,推荐信基本上就是复试的入场券,所以一定要提前联系老师,拿到推荐信。只要有机会进了面试,我觉得老师对于双非并不歧视,面试的个人表现才是关键性决定因素,技巧性也是很强的,如果有需要帮助的,欢迎私信~~

D1379951481的博客 3368

IsoMetric 2.5D等轴游戏中的坐标系彻底讲透

本文探讨了在斜45度视角游戏(如《龙之崛起》)中建立坐标系统的方法。作者通过逆向思维,从已有的45度视角素材出发,设计了一个坐标转换函数:将真实坐标(X,Y)转换为屏幕坐标(X-Y,(X+Y)/2)。在Godot引擎中使用C#脚本实现该函数后,只需调整X轴数值即可使游戏对象在屏幕上呈现正确的45度斜向排列。通过上下左右按键控制X、Y值移动对象时,屏幕显示效果完全符合预期,成功建立了所需的坐标转换系统。

刘欣的优快云博客 416

osgEarth加载大疆数据

【代码】osgEarth加载大疆数据。

weixin_44769745的博客 308

斜45度游戏开发(二)

                                                     斜45度游戏开发(二) 作者:Flysky 2005   上一篇我们讲了地图的结构和地图的基本的绘制,这个属于较简单的步骤,我做这些也不是特别的麻烦,如果你是老手,那么1天对你来说已经足够,我们这一组文章也没有讲任何的优化技巧,如果你想优化,还是需要在实际中摸索,当然,我有时间也会写的

amd k_7的专栏 2148

构建基于知识图谱的金融监管合规系统

金融行业是一个高度监管的领域,金融机构需要遵守众多复杂的法规和政策。传统的金融监管合规方式往往依赖于人工审查和简单的规则引擎,效率低下且容易出错。构建基于知识图谱的金融监管合规系统的目的在于利用知识图谱强大的知识表示和推理能力,实现对金融业务数据的自动化分析和合规检查,提高监管合规的效率和准确性。本系统的范围涵盖了金融机构的各类业务,如银行业务、证券业务、保险业务等。

AI天才研究院 1168

android 蓝牙通讯demo

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

Flame引擎斜45度视角游戏开发终极指南:如何实现沉浸式2D游戏体验

在Flutter游戏开发领域,Flame引擎凭借其轻量级架构和丰富的2D渲染能力,已成为构建斜45度视角游戏的首选方案。本文将深入探讨如何利用Flame引擎实现专业的斜45度视角游戏,涵盖从基础概念到高级优化的完整流程,为开发者提供一站式解决方案。 ## 问题定义:传统2D游戏开发的局限性 传统2D游戏开发在面对斜45度视角需求时,往往面临三大挑战: **坐标转换复杂度**:斜45度视角需要

gitblog_00471的博客 939

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

3步掌握Flame引擎斜45度视角:让2D游戏拥有3D沉浸感

还在为2D游戏画面单调而苦恼?想要复刻《仙剑奇侠传》《红色警戒》等经典游戏的立体视觉体验?Flame引擎的斜45度视角实现方案,让你无需复杂3D建模就能打造出令人惊艳的沉浸式游戏场景。本文将通过三个简单步骤,带你快速上手斜45度视角游戏开发。 ## 什么是斜45度视角?怀旧游戏的艺术密码 斜45度视角(Isometric View)是一种特殊的投影技术,通过将2D瓦片以特定角度排列,创造出视觉

gitblog_00662的博客 1108

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

探索Flutter游戏新维度:斜45度视角的艺术与技术

你是否曾经被经典RPG游戏中那种立体感十足的斜45度画面所吸引?这种看似简单的视角变换,却能让2D游戏瞬间拥有沉浸式的深度体验。今天,让我们一起揭开Flame引擎如何用创新的方式,让怀旧风格在现代移动设备上焕发新生。 ## 为什么斜45度视角依然重要? 在3D游戏盛行的今天,斜45度视角(Isometric Perspective)为何依然具有独特的魅力?答案在于它巧妙平衡了视觉效果与开发成本

gitblog_00312的博客 700

打造沉浸式游戏世界:Flame引擎斜45度视角深度开发实战

想要为你的Flutter游戏注入立体感与深度吗?Flame引擎的斜45度视角技术能够让你轻松实现经典RPG游戏的沉浸式体验。无需复杂3D建模,仅通过2D资源即可构建出层次分明的游戏场景,为玩家带来全新的视觉享受。 ## 为什么选择斜45度视角? 斜45度视角(Isometric Perspective)通过特殊的瓦片排列方式,在2D平面上创造出3D空间的错觉。这种技术不仅让游戏画面更加生动立体

gitblog_00343的博客 761

怀旧游戏画面新活力:Flame引擎斜45度视角实现指南

你是否怀念经典游戏中立体感十足的斜45度画面?想在Flutter项目中快速复刻这种怀旧风格却不知从何下手?本文将带你用Flame引擎的flame_tiled插件,从零开始打造专业级斜45度视角游戏场景,无需复杂3D建模,只需简单配置即可让2D画面呈现出沉浸式深度。 ## 斜45度视角基础:从像素到立体 斜45度视角(Isometric Perspective)通过特殊的网格排列,让2D图像产生

gitblog_00202的博客 1212

终极指南:如何用Flame引擎打造沉浸式斜45度游戏场景

Flame引擎是一款功能强大的2D游戏开发框架,特别适合创建斜45度(等轴测)游戏场景。本指南将带你了解如何利用Flame的核心组件和工具,从零开始构建令人惊叹的斜45度游戏世界。无论你是游戏开发新手还是有经验的开发者,都能通过本教程掌握斜45度场景的设计与实现技巧。 ## 为什么选择斜45度视角? 斜45度视角(等轴测投影)能在2D平面上创造出3D深度感,让游戏场景更具沉浸感。这种视角广泛应

gitblog_00892的博客 705

Tiled实现斜45度瓦片地图

首先是我最近在做的一个项目的需求,要做一个斜45度角的大地图,里面有很多的建筑,会有人在里面走来走去。一个手指按住滑动可以拖动地图,两个手指按下可以调整地图的放大和缩小。   1、tiled新建地图,加入我们要做一个480*320的地图   地图方向:选择45度(交错的)这样生成的地图就基本上是矩形的,比较方便。个人感觉用正常方式的也可,不知道有人尝试过没有。 c

u013790419的专栏 8915

Flame引擎斜45度视角开发终极指南:从像素地狱到视觉天堂

Flame引擎作为Flutter游戏开发的终极解决方案,为开发者提供了完整的2D游戏开发框架。今天,我们将深入探讨如何在Flame中实现令人惊艳的斜45度视角(Isometric View)游戏效果,让你轻松打造2.5D视觉体验!🚀 ## 为什么选择斜45度视角? 斜45度视角,也称为等轴测投影,是一种独特的视觉呈现方式。它既保留了2D开发的简单性,又提供了3D游戏的深度感。这种视角在策略游

gitblog_00971的博客 968
上一篇: Satan's Syntax
下一篇: 斜45度游戏开发(二)
amdk_7
博客等级 码龄22年 12粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值