`
lixinye0123
  • 浏览: 341067 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

J2ME游戏开发中的地图设计与绘制

    博客分类:
  • Java
阅读更多
在开发很多类型的游戏中,地图系统都需要良好的设计,直观的说,我们需要的地图系统仅仅是一个2D数组,然后用最快的方式将数组影射到屏幕上。

      游戏中的地图通常不是由程序员用键盘输入到程序里然后再在程序中修改然后再修改的狂乱过程,而是一般先由程序员做一个地图编辑器,在这个地图编辑器中用鼠标点点点,再保存的过程,或者是从网络上下载的一些成熟编辑器比如:mappy这样的工具生成地图,再用脚本语言为mappy写一个应该保存成什么样格式的程序。通常地图分为45度角,侧视角和俯视角等等,45度角的也有很多种,这种视角相对俯视角和侧视叫较复杂,我们主要讨论俯视角,其实侧视叫和俯视角主要的区别是图片的表现风格不一样,比如雷电这样的空战就是俯视角,mario这样的游戏就是侧视角,可以用相同的地图编辑器做出来。综上,你要知道游戏地图不是程序员用程序写出来的,你喜欢写也可以,修改起来较麻烦,也不能像资源一样动态管理而是一次性读入到内存里,比较不爽。

      在这个文章里面,我们假设我们的2D数组是通过,资源读取出来的,内容如下:

public static byte[][] B_MAZE_2D_ARRAY = {
        {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0}
        , {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}
        , {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

    };

  这个地图中一共0,1两种byte数,0代表一种图块,1代表一种图块,也可以是动画图块,你绘制的时候区别一下就可以了。因为我们程序里面想把这整个图形绘制出来的话有N多种方案,我给出两个比较合理的方案,当然第二种是比较优化的.我们假设你的主角一直在屏幕中央,当你主角移动的时候,地图相应的变化,就是说主角为参照物,地图动.我们知道地图的大小要超过屏幕的,我们需要设定一个坐标系统,我的方法是,以左上角为0,0也就是和我们常用的Canvas的坐标系统是相同的,我们的图块大小为:ELEMENT_WIDTH, ELEMENT_HEIGHT,所以我们整个地图的面积(绝对面积)是 ELEMENT_WIDTH * 横坐标的块数 * ELEMENT_HEIGHT*纵坐标的块数。因此,我们把这么大的题图画在屏幕上时,需要把需要画的坐标面积(也就是屏幕面积)从这个地图中拿出来,其他地方被切除,这就比较的高效了。

  方法一:循环整个2维数组,不需要的地方不绘制只绘需要的部分:

     int kI = 0;// 表示
     int kJ = 0;
//nEleStartedX, nEleStartedY表示从2D Array哪个位置开始绘制地图
     for (int i = nEleStartedY; i < B_MAZE_2D_ARRAY.length; i++) {
       kJ = 0;
//是否需要绘制
       boolean isDrawed = false;
       for (int j = nEleStartedX; j < B_MAZE_2D_ARRAY[i].length; j++) {
//绘制需要的面积,N_MAZE_ELEMENT_WIDTH,N_MAZE_ELEMENT_HEIGHT表示图块宽高
         int bX = nMapStartedX + j * N_MAZE_ELEMENT_WIDTH;
         int bY = nMapStartedY + i * N_MAZE_ELEMENT_HEIGHT;
//SCREEN_WIDTH,SCREEN_HEIGHT屏幕大小
         if (bX <= SCREEN_WIDTH
             &&
             bY <= SCREEN_HEIGHT
             &&
             bX >= -N_MAZE_ELEMENT_WIDTH
             &&
             bY >= -N_MAZE_ELEMENT_HEIGHT
             ) {
           g.drawImage(mapImages[B_MAZE_2D_ARRAY[i][j]], bX,
                       bY,
                       Graphics.TOP | Graphics.LEFT);//绘制图块
           isDrawed = true;
           kJ++;
// N_MAX_MAZE_ITEM_X , N_MAX_MAZE_ITEM_Y屏幕面积内图块的最大值
           if (kJ > N_MAX_MAZE_ITEM_X + 2) {
             break;
           }

         }
       }
       if (isDrawed) {
         kI++;
       }
       if (kI > N_MAX_MAZE_ITEM_Y + 2) {
         break;
       }

     }

  方法二:事先找到需要绘制的横坐标纵坐标的图块编号(2DArray的数组下标),循环屏幕面积大小的数组:

    //  需要绘制的2DArray左上角位置,nMapStartedX,nMapStartedY在地图绝对面积上的坐标
    int nArrayI = ( -N_MAZE_ELEMENT_HEIGHT - nMapStartedY) /
        N_MAZE_ELEMENT_HEIGHT;
    int nArrayJ = ( -N_MAZE_ELEMENT_WIDTH - nMapStartedX) /
        N_MAZE_ELEMENT_WIDTH;
    for (int i = nArrayI;
         i < SCREEN_HEIGHT / N_MAZE_ELEMENT_HEIGHT + 2; i++) {
      for (int j = nArrayJ;
           j < SCREEN_WIDTH / N_MAZE_ELEMENT_WIDTH + 2; j++) {

        if (i < 0 || j < 0 || i > B_MAZE_2D_ARRAY.length ||
            j > B_MAZE_2D_ARRAY[0].length) {
          continue;
        }
        else {
          int bX = nMapStartedX + j * N_MAZE_ELEMENT_WIDTH;
          int bY = nMapStartedY + i * N_MAZE_ELEMENT_HEIGHT;
          g.drawImage(mapImages[B_MAZE_2D_ARRAY[i][j]], bX,
                      bY,
                      Graphics.TOP | Graphics.LEFT);

        }
 }
 }

  根据我的测试,方法一的地图面积越大fps掉的越为厉害,而方法二基本上不会掉fps,强烈推荐方法二.

  地图系统做好了之后,你就可以使用地图做更多的表现力了,只要改变nMapStartedX,nMapStartedY,就可以绘制出地图上的相应部分,代码的复用效率非常的高。RPG, SLG, PUZZLE等游戏类型都可以使用.

分享到:
评论

相关推荐

    J2ME游戏开发中的地图设计与绘制.doc

    在J2ME游戏开发中,地图的设计与绘制是至关重要的环节,它涉及到游戏世界的构建、玩家的导航以及游戏性能的优化。本文将深入探讨如何在Java Micro Edition (J2ME)环境中有效地创建和呈现游戏地图。 首先,地图系统...

    J2ME_Map.rar_J2ME 地图_J2ME游戏_j2me 游戏_j2me_m_绘制地图

    在"J2ME游戏开发中的地图设计与绘制.txt"文件中,可能详细讲解了如何规划地图结构,如何使用二维数组存储地图数据,以及如何利用J2ME的图形API高效地渲染地图。同时,文件可能还讨论了如何实现动态加载和滚动地图,...

    J2ME 游戏开发(基本功能开发)

    在J2ME中进行游戏开发,开发者可以利用其跨平台特性,将游戏移植到各种不同的设备上。本教程将探讨J2ME游戏开发的基本功能,特别是人物和地图的绘制。 **1. J2ME游戏架构** 在J2ME中,游戏通常基于MIDP(Mobile ...

    J2ME游戏开发地址制作工具

    6. **导出与集成**:最后,将制作好的地图导出为J2ME游戏能够识别的格式,然后在游戏代码中进行集成,确保地图数据能在游戏中正常加载和显示。 **J2ME游戏开发中的地图技术** 1. **Tiled Maps**:MapWin1411可能...

    基于J2ME平台的手机游戏贪吃蛇程序的设计与实现

    - **游戏地图代码设计**:实现游戏地图的绘制及更新机制。 - **操作控制代码设计**:实现玩家通过按键控制蛇头移动的功能。 - **进入游戏画面极其字体设计**:设计吸引人的游戏启动界面和适合游戏风格的文字样式...

    J2me 基础学习 rpg游戏开发学习

    5. **数据结构与算法**:在 RPG 游戏中,地图、物品、角色等通常需要高效的数据结构存储。学习如何使用链表、数组、队列等数据结构,并掌握基本的搜索和排序算法,能帮助优化游戏性能。 6. **游戏逻辑**:了解如何...

    j2me游戏引擎详解

    在J2ME的环境中,游戏引擎扮演着至关重要的角色,它们简化了开发过程,使得开发者能够创建出丰富的、交互性强的游戏,尤其在资源有限的移动设备上。 **J2ME游戏引擎的核心组件** 1. **图形渲染**:J2ME游戏引擎...

    J2ME 游戏(基本功能开发)

    地图绘制在J2ME游戏中是一个复杂但关键的环节。开发者可以使用二维数组或对象网格来表示游戏地图,每个单元格代表地图上的一个位置。地图可以是静态的,也可以是动态生成的,支持滚动和缩放。以下是一些常见的地图...

    J2ME的RPG游戏Demo

    地图绘制在J2ME中通常使用二维数组来表示游戏世界,通过不同的值代表不同的地形或对象。开发者可能利用位图或自定义图形精灵来展示地图细节。人物移动则涉及到坐标系统和移动逻辑,确保角色能在游戏世界中平滑地移动...

    j2me 地图编辑器

    在J2ME中开发地图编辑器是一项具有挑战性的任务,因为它需要处理图形界面、数据存储以及用户交互等多个方面。 **1. J2ME基础** J2ME包含两个主要部分:配置(Configurations)和 profiles(配置文件)。配置定义了...

    j2me游戏地图制作软件(中文版)

    在这个领域,地图制作是游戏开发中的重要环节,而“j2me游戏地图制作软件(中文版)”则为开发者提供了一个方便、直观的工具,帮助他们创建和编辑游戏地图,生成可读性强的地图数组数据。 该软件的核心功能在于地图...

    J2ME手机游戏地图编辑器

    J2ME手机游戏地图编辑器就是针对这一平台设计的工具,专门用于创建和编辑手机游戏中的地图内容。 **地图编辑器的重要性** 在开发手机角色扮演游戏(RPG)时,地图是游戏世界的基础,它不仅定义了游戏的环境,还...

    j2me游戏开发精灵及贴图

    本文将深入探讨J2ME游戏开发中的核心概念——精灵(Sprites)和贴图(Tile Maps),并通过一个实际案例来阐述如何在J2ME环境中创建和管理这些元素。 精灵是游戏开发中的基本元素,它代表了游戏中可移动或动画化的...

    J2ME地图编辑器mappy

    Mappy是一款专为J2ME游戏设计的地图编辑软件,它允许开发者轻松地创建、编辑和管理游戏中的背景地图。这款工具的强大之处在于其简洁的用户界面和对J2ME平台的深度理解,使得非专业程序员也能快速上手,进行地图设计...

    J2me 地图编辑器

    在手机游戏开发中,J2ME地图编辑器的使用有助于提高开发效率,减少调试时间,并使游戏地图设计更加精细和多样化。它能够帮助开发者快速构建各种复杂的游戏环境,无论是简单的2D平台游戏还是带有丰富交互元素的角色...

    J2ME游戏源码---泡泡堂

    3. **图形与用户界面**:游戏中的图形和用户交互是通过J2ME的Graphics API来实现的,如`Graphics`类用于绘制图像、文本和形状。此外,`LCDUI`(Limited Connected Device User Interface)组件如`Canvas`用于创建...

    J2me游戏开发经验总结

    在J2ME游戏开发中,经验的积累是提升游戏性能和用户体验的关键。以下是一些重要的技术要点和优化策略: 1. 地图大小限制:为了兼容各种设备,地图大小应控制在合理范围内,例如30*30。这有助于减少内存占用,确保...

    基于J2ME的推箱子游戏设计与实现

    3 推箱子游戏设计 3.1 游戏规则与界面设计 推箱子游戏的目标是将所有箱子推到指定位置,同时不允许箱子被推到角落无法移动。游戏界面由地图、玩家角色和箱子组成,通过触摸屏或按键操作进行移动。 3.2 双缓存技术 ...

    J2ME 手机3D游戏设计

    总结来说,【J2ME手机3D游戏设计】涉及了移动游戏开发的关键技术和策略,包括J2ME平台、MIDP 2.0、M3G 3D图形标准,以及利用立即模式和深度优先遍历算法进行游戏地图生成。这些技术的结合使得开发者能够在资源受限的...

    j2me 中的几个小游戏(源码)

    在本压缩包中,包含了多个用J2ME开发的小游戏,这些游戏展示了J2ME在游戏开发方面的应用。 1. **《单机版泡泡堂》源码** 泡泡堂是一款非常受欢迎的休闲游戏,其J2ME版本的源码能帮助开发者了解如何在移动设备上...

Global site tag (gtag.js) - Google Analytics