`
wangxiaohigh
  • 浏览: 1464492 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
上次我已说过Java实现2.5D的关键在于斜视图坐标的转化,只要“你的美工”或者“你——的美工”技术到位,2D到2.5D的图形就简单实现来说就已经足够了(暂不考虑日照及云雾等特殊效果)。但反过来说,2.5D界面也确实对美工有了一定的要求,如果没有好的原图,2.5D程序实现起来将事倍功半,枉费气力不说,还达不到应有的效果。

而遗憾的是,对于我这种非游戏开发人员来说,游戏美工简直不可求更不可遇,而我搜遍google,却也找不到多少2.5D地图可供使用(我想找皇家骑士团或最终幻想战略版那种地图,居然没有现成的……准备过两天重下游戏自己抠图……)。于是我怒从胸中起,恶向胆边行,将一种更加极端的方法付诸于实践……

我所谓更加极端的方法,就是利用看上去向2.5D的2D程序蒙混过关——也就是所谓的“伪2.5D实现”

举例来说,下为我以前文章中曾构建过的2D地图:



我们可以看到,在此例中角色及建筑始终由X,Y交织点确定,即采取通常的2D算法实现。

但我们都知道,3D或2D本质上区别只是视觉上的,反映到屏幕上的无外是分辨率不等的象素罢了。如果我们直接将做好的2D地图放入其中,能否起到想要的作用呢?

我们来试试看,首先,我载入一个做好的2.5D地图(取材自幻想三国,原图大小2675X930,我以800X600卷帘显示)




我们可以看到,由于采用了2.5D的视觉图,单就画面而言,通常没有人会怀疑所见到的是“斜45度立体视图”。

而问题来了,原来我们使用的传统2D地图描绘方式(见文章),要如何应用在这张伪2.5D的视图中呢?这时的难点就在于,我们要如何令原来在2D地图中使用的数组,在此图中发挥作用。

这时候有两种殊途同归的方式可供选择:一是利用ps等工具,在斜视图上生成镂空图,利用楼空图生成map数组来演算此斜视图。二是直接利用编辑器等工具在斜视图上标注通行区域,以此生成数组。

我并没有开发专用的编辑器,所以利用ps制作镂空图如下(原图于斜视图大小一致,为演示用缩小):



其中我将黑色设定为禁行区域,白色为通行区域,而生成一个二维的整形数组,代表map的所有x,y点

将字符打印成地图如下(部分)



此时,我们就可以利用地图数组在斜视图上描绘出对应的x,y点。



于通常的2D地图相同,坐标由左上x,y点开始,到右下x,y点结束,描绘出了整张地图内容(图中红色为不可移动区域,黑色为可移动区域)

那么我们现在要做的,就是将角色置身于当中了。

利用构建好的sprite类,我们能轻松的分解角色图,我将一个ro中人物置身其中。



这时,由于地图+人物俱为斜视图,所以会形成斜45度视角的错觉。

但新的问题来了,我们如何令角色移动呢?首先,我们显示角色的移动路径出来。



大家可以看到,如果我们沿用原来2D的寻径方式,那么在移动过程中角色将按照2D路线行走。虽然对平面游戏来说在正常不过,但对于已经是"2.5D"画面的我们来讲,显然是不能够容忍的,这时候就需要我们摒弃原先的寻径方式,将2.5D寻径的A*方法引入其中,具体方式将在下次介绍。

最后,我们去除辅助线等,运行效果如下:



由于设定的关系,此时背景画面随角色运动而卷帘移动,但就操作感受上讲,与普通的2.5D游戏是无异的。

上述操作代码如下:

packageorg.loon.framework.game.image;

importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Panel;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;

importorg.loon.framework.game.script.map.BitmapToMap;
importorg.loon.framework.game.sprite.Configure;
importorg.loon.framework.game.sprite.Event;
importorg.loon.framework.game.sprite.Sprite;
importorg.loon.framework.game.sprite.SpriteGroup;

/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:Java纯2D伪2.5D测试
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/

publicclassRpgTestextendsPanelimplementsKeyListener,MouseListener...{
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

BitmapToMapbtm
=null;

Sprite[]roleMain
=newSprite[2];

Configureconfig
=null;

//role图行排列顺序
finalStringimgList="0,1,2,3,4,6,5,7";

Imageimg
=null;

publicRpgTest()...{
setSize(
800,600);
setBackground(Color.BLACK);

//精灵组
SpriteGroupsgp=newSpriteGroup();

//载入角色图
Bitmapbit=newBitmap("./imagerpg/ro.png");
try...{
//重新排列图片行列,超出索引则指定位置无图
img=bit.getScriptRegroup(70,124,imgList);
}
catch(Exceptione)...{
e.printStackTrace();
}

//创建精灵,宽70,高124
roleMain[0]=newSprite(img,70,124);
//定位
roleMain[0].setXY(45,50);
roleMain[
0].setVisible(true);
roleMain[
1]=newSprite(img,70,124);
roleMain[
1].setXY(31,41);
roleMain[
1].setVisible(true);
//变更角色方向
roleMain[1].setDirection(5);
//加载原始背景图,背景镂空图(行走区域标注图)
btm=newBitmapToMap("./imagerpg/map_1.png","./imagerpg/map_1_2.png",800,600);
//镂空色
btm.setFiltrateColor(newLColor(255,255,255));
//打印字符地图
System.out.println(btm.toStringMap());
//允许显示网格
btm.setReseau(false);

//加载角色
sgp.add(roleMain[0]);
sgp.add(roleMain[
1]);

//追踪指定对象
//roleMain[1].setPursueObject(roleMain[0]);

//以数组方式注入
//config=newConfigure(btm,roleMain);
//以spriteGroup方式注入Configure统一地图与角色管理
config=newConfigure(btm,sgp);
//使用2.5d视角走法
config.set25d(true);
//显示移动路径
config.setMovePath(false);

setFocusable(
true);
addKeyListener(
this);
addMouseListener(
this);


}


publicvoidupdate(Graphicsg)...{
paint(g);
}


publicvoidpaint(Graphicsg)...{
//g.drawImage(img,0,0,this);
config.draw(g);

//g.drawImage(bit.getFleshKeepOut("./s.jpg"),0,0,this);
//g.dispose();
}


publicvoidkeyPressed(KeyEvente)...{
//控制指定角色移动
config.go(roleMain[0],Event.select(e.getKeyCode()));
//刷新
repaint();
}


publicvoidkeyReleased(KeyEvente)...{
}


publicvoidkeyTyped(KeyEvente)...{
}



publicvoidmouseClicked(MouseEvente)...{
config.goMouse(roleMain[
0],e.getPoint(),getGraphics());
}


publicvoidmouseEntered(MouseEventarg0)...{

}


publicvoidmouseExited(MouseEventarg0)...{

}


publicvoidmousePressed(MouseEventarg0)...{
}


publicvoidmouseReleased(MouseEventarg0)...{

}


publicstaticvoidmain(String[]args)...{

java.awt.EventQueue.invokeLater(
newRunnable()...{
publicvoidrun()...{
Framefrm
=newFrame("Java纯2D伪2.5D测试");
frm.add(
newRpgTest());
frm.setResizable(
false);
frm.setSize(
800,600);
frm.addWindowListener(
newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
System.exit(
0);
}

}
);
frm.setLocationRelativeTo(
null);
frm.setVisible(
true);
}

}
);
}


}

分享到:
评论

相关推荐

    Java 2.5D游戏Demos

    在Java中实现,开发者需要了解如何处理图形的绘制、碰撞检测以及游戏循环。游戏循环是所有实时游戏的基础,它负责更新游戏状态、渲染画面以及处理用户输入。通过分析这个Java实现,我们可以学习到如何使用Java的AWT...

    JAVA写的2.5D小游戏.zip

    JAVA写的2.5D小游戏.zipJAVA写的2.5D小游戏.zipJAVA写的2.5D小游戏.zip JAVA写的2.5D小游戏.zipJAVA写的2.5D小游戏.zipJAVA写的2.5D小游戏.zip JAVA写的2.5D小游戏.zipJAVA写的2.5D小游戏.zipJAVA写的2.5D小游戏.zip...

    Java实现2.5D推箱子游戏.pdf

    Java实现2.5D推箱子游戏

    selenium-java版本2.5

    在Java版本2.5中,Selenium提供了丰富的API和功能,使得测试工程师能够编写出高效、可维护的自动化测试脚本。这篇文档将深入探讨Selenium Java 2.5版本中的关键知识点。 一、Selenium WebDriver API 在Selenium 2.5...

    arcgisfor java api 2.5

    ArcGIS for Java API 2.5 是Esri公司推出的一款强大的地理信息系统开发工具,它专为Java开发者设计,用于构建地图应用、空间分析以及地理数据管理。这个API提供了丰富的类库和方法,使得开发者能够轻松地在Java环境...

    JAVA写的2.5D小游戏.zip学习资源

    pytorch JAVA写的2.5D小游戏.zip学习资源

    Java Servlet API 2.5

    12. **WebSocket支持**:尽管Java Servlet API 2.5不直接包含WebSocket规范,但后续的Servlet 3.1版本开始添加了WebSocket支持,使得在Servlet容器中实现双向通信成为可能。 总的来说,Java Servlet API 2.5是Java ...

    J2EE5 API Java Servlet2.5 Document.chm

    Java Servlet2.5 的函数介绍

    struts2+Spring2.5+Spring3.2)实现登录.

    ### Struts2 + Spring2.5 + Spring3.2 实现登录模块的详细解析 #### 一、项目背景与架构概述 本项目旨在利用Struts2框架、Spring2.5和Spring3.2来实现一个登录系统。Struts2作为MVC框架负责处理用户的请求,而...

    基于java实现的利用bp神经网络预测PM2.5

    【作品名称】:基于java实现的利用bp神经网络预测PM2.5 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于java实现...

    spring2.5中文文档

    3. **XML配置与注解配置的融合**:Spring 2.5引入了对Java注解的广泛支持,使得开发者可以选择使用XML配置或者注解配置,或者两者结合,更加灵活地定义bean和它们的依赖。 4. **Bean表达式语言(Bean Expression ...

    servlet-2.5 API文档

    Servlet 2.5 API是Java Web开发中的一个重要组成部分,它定义了服务器端应用程序与Web服务器交互的一系列接口和类。这个API文档详细介绍了如何使用这些组件来构建动态、交互式的Web应用。以下是对Servlet 2.5 API...

    Z25d:javafx 2.5d RPG 游戏

    在IT行业中,游戏开发是一项充满挑战与创新的工作,尤其在2D与3D之间游走的2.5D游戏,更是受到众多开发者和玩家的喜爱。"Z25d: javafx 2.5d RPG 游戏"是一个使用JavaFX技术构建的2.5D角色扮演游戏(RPG)项目。本文...

    cors-filter-2.5 + java-property-utils-1.9.1.zip

    在这个"cors-filter-2.5 + java-property-utils-1.9.1.zip"压缩包中,主要包含了两个关键组件:CORS Filter和Java Property Utils。 1. CORS Filter: CORS Filter是处理跨域请求的一种解决方案,它作为一个...

    maven-plugin-tools-java-2.5.jar

    maven-plugin-tools-java-2.5.jar

    UDF 2.5文件系统

    - **兼容性**:UDF 2.5在设计时充分考虑了与现有系统的兼容性,确保可以在多种操作系统和硬件平台上无缝运行。 - **扩展性**:为了适应不断变化的技术需求,UDF 2.5提供了良好的扩展性,可以通过文档变更通知(DCN...

Global site tag (gtag.js) - Google Analytics