在上一节课中,我们对即将要完成的战旗Demo有了一个大概的了解,本节课当中,我们将会学习绘制游戏地图。

自从在JavaFX 2.2中增加了Canvas相关的功能,我们就可以使用Canvas来实现游戏绘制了。

游戏地图绘制主要用到GraphicsContext.drawImage方法。

drawImage(Image image,double sx,double sy,double sw,double sh,double dx,double dy,double dw,double dh);

其中image 表示源图片。

sx,sy,sw,sh表示相对于源图片的x,y坐标和截取的宽度和高度。

dx,dy,dw,dy表示绘制到画布上的x, y坐标和绘制的宽度和高度。

单元图片如下:

地图绘制就是将单元格进行拼接。

通常使用一个二维数组来表示地图数据如下:

int[][] mapIndex = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 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 }, };

下面来看看我们的游戏地图类:

import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;public class GameMap {private int[][] mapIndex = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 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 }, };private int tileWidth;private int tileHeight;private int cols;private Image image;public GameMap(int tileWidth,int tileHeight, Image map){this.tileWidth = tileWidth;this.tileHeight = tileHeight;this.image = map;cols = (int) (map.getWidth() / tileWidth);}public void drawMap(GraphicsContext gc) {int mapWidth = mapIndex[0].length;int mapHeight = mapIndex.length;for (int y = 0; y < mapHeight; y++) {for (int x = 0; x < mapWidth; x++) {int px = mapIndex[y][x] % cols;int py = mapIndex[y][x] / cols;gc.drawImage(image, px * tileWidth, py * tileHeight, tileWidth, tileHeight, x * tileWidth, y* tileHeight, tileWidth, tileHeight);}}}public int[][] getMapIndex() {return mapIndex;}public void setMapIndex(int[][] mapIndex) {this.mapIndex = mapIndex;}
}

在实际游戏开发中,游戏地图数据通常存储在文件中,从文件读取,由于我这只是个Demo,写进来方便大家直观的了解。

首先,我们通过地图贴图的宽度和单元格的宽度来计算地图贴图单元格的列数,然后在绘制的时候,就可以通过地图索引和单元格列数,计算当前绘制的贴图的行和列,通过drawImage绘制出来。

接下来,创建我们的Canvas类:

import javafx.application.Platform;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;public class MainCanvas extends Canvas {// 游戏地图private GameMap gameMap;private GraphicsContext gContext;private Image map;private int tileWidth = 32;private int tileHeight = 32;private boolean isRunning = true;private long sleep = 100;// 主线程private Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (isRunning) {Platform.runLater(new Runnable() {@Overridepublic void run() {draw();update();}});try {Thread.sleep(sleep);} catch (InterruptedException e) {e.printStackTrace();}}}});public MainCanvas(double width, double height) {super(width, height);map = new Image(getClass().getResourceAsStream("map0.png"));gContext = getGraphicsContext2D();// 初始化游戏地图gameMap = new GameMap(tileWidth, tileHeight, map);thread.start();}public void draw() {gameMap.drawMap(gContext);     }public void update() {}
}

MainCanvas类比较简单,创建一个线程,用于执行draw和update方法。然后载入地图贴图,初始化GameMap,并完成绘制工作。

最后,在Main类中,将我们的Canvas加入到布局中。

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;public class Main extends Application {@Overridepublic void start(Stage primaryStage) {try {AnchorPane root = new AnchorPane();Scene scene = new Scene(root,640,480);MainCanvas mainCanvas = new MainCanvas(640, 480);root.getChildren().add(mainCanvas);scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());primaryStage.setScene(scene);primaryStage.show();} catch(Exception e) {e.printStackTrace();}}public static void main(String[] args) {launch(args);}
}

下面看看运行效果:

这样,游戏地图就绘制成功了。有兴趣的朋友也可以自行修改地图索引,来绘制不同的地图。当然在实际开发中,我们还是会用地图编辑器来编辑的。

这一节课就到此结束了,下一节再见。

本文章为个人原创,版权所有,转载请注明出处:http://blog.csdn.net/ml3947。另外我的个人博客:http://www.wjfxgame.com.

JavaFX战旗类游戏开发 第二课 游戏地图绘制相关推荐

  1. JavaFX战旗类游戏开发 第一课 概述

    用JavaFX开发的地图编辑器已经可以正式使用了.也写了JavaFX读取地图的库,准备抽空实现U3D的地图读取,然后再进行游戏开发. 虽然在我的JavaFX游戏开发库内已经实现了TMX地图的读取,但是 ...

  2. JavaFX战旗类游戏开发 第三课 创建游戏角色

    在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.Graph ...

  3. 游戏开发20课 tilemap 绘制

    在瓦片地图上绘制 下文将详细介绍在瓦片地图上绘制瓦片的步骤和工具.但是,如果要绘制等距瓦片地图,请参阅创建用于等距瓦片地图的瓦片面板以了解具体步骤和信息. 要开始绘制瓦片,请从 Tilemap Pal ...

  4. Cocos Creator 实现战旗类游戏《火焰纹章》移动范围效果

    编者按 本文来自于"Cocos 荣耀讲师"征稿活动第1期,最先发表于 Cocos 中文社区,作者,ituuz.2013 年便加入社区,ituuz 堪称是社区元老成员,曾发布< ...

  5. 2D平台类游戏开发教程(翻译)

    这是一篇实现2D平台类游戏的技术指导文章,原文地址:http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-pla ...

  6. web策略类游戏开发(四)一个可以承载万人在线的架构

    web策略类游戏开发(四)一个可以承载万人在线的架构 Webgame现在已经开始需要进入大统一服务器时代,每个游戏区域容纳的玩家数量将从现在的几万人发展到几十万人,因此在新的背景下,webgame如何 ...

  7. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第二讲html运行原理及结构

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第二讲html运行原理及结构 摘要:通过前节<陈力:传智播客古代 珍宝币 泡泡龙游戏开发>第一讲:前言的学习,我们知道了PHP是PHP: Hype ...

  8. 2D横板解谜类游戏开发日志-角色移动和动画

    2D横板解谜类游戏开发日志-角色移动和动画 一.创建角色 1新建精灵 2拉入素材 3添加组件*2,方便后续使用 4创建动画文件夹,动画帧素材丢进去(方便以后管理 5创建代码文件,挂在player对象上 ...

  9. qq机器人开发第二课-发送图片

    重要的知识点: 监听图片发送,要注意一点 图片除了可能在一般的消息中发送,还有可能是通过离线文件发送来的 qq机器人开发第二课-发送图片

最新文章

  1. LeetCode Permutation Sequence(求排列中的第k个排列是什么)
  2. java实现md5加密示例
  3. VirtualBox Nonexistent host networking interface 错误解决方案
  4. VTK修炼之道47:图形基本操作进阶_法向量计算
  5. 增加FiroFox3对迅雷的支持
  6. (转)吴寿鹤:区块链中的软分叉与硬分叉详解
  7. 31省份及直辖市自治区的下拉框代码
  8. 鸿蒙手机系统pc版下载,鸿蒙系统os下载官网版v1.0开源版
  9. 常遇电脑故障应急处理方法(转)
  10. [渝粤教育] 郑州工程技术学院 试验设计与数据处理 参考 资料
  11. ArcGIS获取点图层对应栅格图层的栅格行列号(或属性值)
  12. 计算机科学二审需要多久,寒冬展风采,文体两开花——记计算机科学学院迎新晚会节目二审暨素美部“计体两开花”品牌活动...
  13. 计算机删除默认共享怎样操作,清除windows默认共享方法
  14. 网络工程师还吃香吗?
  15. 万年历黄历星座查询v3.6.9引流吸粉 实用工具 流量变现小程序
  16. 树莓派搭建LAMP和FTP服务器
  17. 产品战略与战术之行业分析
  18. java.util.LinkedHashMap cannot be cast to 问题
  19. 七个研究生必备高效科研网站
  20. 微信小程序毕业设计 基于javaweb后台网上书店图书商城小程序系统毕业设计

热门文章

  1. QSlider 拖动滑动条使用valueChanged(int value)信号重复调用槽函数问题解决
  2. 在1G内存的计算机中能否malloc(1.2G)?为什么?
  3. 积分系统软件怎么做?如何用积分机制快速“抓住用户”?
  4. 在Android用vulkan完成蓝绿幕扣像
  5. iPhone12 Pro最高溢价3000元 蓝色最为畅销
  6. linux mdadm 源码,mdadm命令_Linux mdadm 命令用法详解: mdadm 标准的软件 RAID 管理工具...
  7. 计算机中的目标程序是指什么意思,源程序、目标程序、可执行程序的含义是什么...
  8. centos卸载软件及其依赖方法
  9. HoloLens 1代 简单开发
  10. 【机器学习】svm模型训练后的参数说明