天天看点

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

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

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

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

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

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

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

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

这时候有两种殊途同归的方式可供选择:一是利用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游戏是无异的。

上述操作代码如下:

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

package org.loon.framework.game.image;

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

import java.awt.Color;

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

import java.awt.Frame;

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

import java.awt.Graphics;

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

import java.awt.Image;

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

import java.awt.Panel;

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

import java.awt.event.KeyEvent;

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

import java.awt.event.KeyListener;

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

import java.awt.event.MouseEvent;

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

import java.awt.event.MouseListener;

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

import java.awt.event.WindowAdapter;

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

import java.awt.event.WindowEvent;

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

import org.loon.framework.game.script.map.BitmapToMap;

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

import org.loon.framework.game.sprite.Configure;

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

import org.loon.framework.game.sprite.Event;

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

import org.loon.framework.game.sprite.Sprite;

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

import org.loon.framework.game.sprite.SpriteGroup;

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

/**

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

 * <p>

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

 * Title: LoonFramework

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

 * </p>

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

 * Description:Java纯2D伪2.5D测试

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

 * Copyright: Copyright (c) 2007

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

 * Company: LoonFramework

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

 * 

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

 * @author chenpeng

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

 * @email:[email][email protected][/email]

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

 * @version 0.1

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

 */

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

public class RpgTest extends Panel implements KeyListener, MouseListener {

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

    /**

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

     * 

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

     */

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

    private static final long serialVersionUID = 1L;

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

    BitmapToMap btm = null;

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

    Sprite[] roleMain = new Sprite[2];

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

    Configure config = null;

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

    //role图行排列顺序

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

    final String imgList = "0,1,2,3,4,6,5,7";

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

    Image img = null;

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

    public RpgTest() {

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

        setSize(800, 600);

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

        setBackground(Color.BLACK);

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

        //精灵组

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

        SpriteGroup sgp = new SpriteGroup();

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

        //载入角色图

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

        Bitmap bit = new Bitmap("./imagerpg/ro.png");

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

        try {

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

            // 重新排列图片行列,超出索引则指定位置无图

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

            img = bit.getScriptRegroup(70, 124, imgList);

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

        } catch (Exception e) {

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

            e.printStackTrace();

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

        }

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

        //创建精灵,宽70,高124

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

        roleMain[0] = new Sprite(img, 70, 124);

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

        //定位

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

        roleMain[0].setXY(45,50);

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

        roleMain[0].setVisible(true);

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

        roleMain[1] = new Sprite(img, 70, 124);

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

        roleMain[1].setXY(31,41);

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

        roleMain[1].setVisible(true);

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

        //变更角色方向

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

        roleMain[1].setDirection(5);

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

        // 加载原始背景图,背景镂空图(行走区域标注图)

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

        btm = new BitmapToMap("./imagerpg/map_1.png", "./imagerpg/map_1_2.png",800,600);

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

        //镂空色

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

        btm.setFiltrateColor(new LColor(255, 255, 255));

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

        //打印字符地图

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

        System.out.println(btm.toStringMap());

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

        // 允许显示网格

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

        btm.setReseau(false);

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

        // 加载角色

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

        sgp.add(roleMain[0]);

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

        sgp.add(roleMain[1]);

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

        // 追踪指定对象

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

        // roleMain[1].setPursueObject(roleMain[0]);

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

        // 以数组方式注入

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

        // config=new Configure(btm,roleMain);

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

        // 以spriteGroup方式注入Configure统一地图与角色管理

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

        config = new Configure(btm, sgp);

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

        //使用2.5d视角走法

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

        config.set25d(true);

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

        //显示移动路径

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

        config.setMovePath(false);

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

        setFocusable(true);

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

        addKeyListener(this);

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

        addMouseListener(this);

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

    }

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

    public void update(Graphics g) {

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

        paint(g);

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

    public void paint(Graphics g) {

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

        // g.drawImage(img, 0, 0, this);

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

        config.draw(g);

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

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

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

        // g.dispose();

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

    public void keyPressed(KeyEvent e) {

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

        // 控制指定角色移动

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

        config.go(roleMain[0], Event.select(e.getKeyCode()));

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

        // 刷新

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

        repaint();

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

    public void keyReleased(KeyEvent e) {

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

    public void keyTyped(KeyEvent e) {

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

    public void mouseClicked(MouseEvent e) {

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

        config.goMouse(roleMain[0], e.getPoint(), getGraphics());

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

    public void mouseEntered(MouseEvent arg0) {

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

    public void mouseExited(MouseEvent arg0) {

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

    public void mousePressed(MouseEvent arg0) {

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

    public void mouseReleased(MouseEvent arg0) {

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

    public static void main(String[] args) {

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

        java.awt.EventQueue.invokeLater(new Runnable() {

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

            public void run() {

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

                Frame frm = new Frame("Java纯2D伪2.5D测试");

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

                frm.add(new RpgTest());

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

                frm.setResizable(false);

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

                frm.setSize(800, 600);

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

                frm.addWindowListener(new WindowAdapter() {

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

                    public void windowClosing(WindowEvent e) {

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

                        System.exit(0);

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

                    }

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

                });

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

                frm.setLocationRelativeTo(null);

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

                frm.setVisible(true);

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

            }

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

        });

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

}

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

本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130065