ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

libGDX游戏开发之地图制作和使用(一)

2021-10-03 16:59:05  阅读:246  来源: 互联网

标签:游戏 Keys libGDX 地图 相机 camera Input mapY keycode


libGDX游戏开发之地图制作和使用(一)

libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm…国内用libgdx比较少,多数情况需要去官网和google找资料,相互学习的可以加了联系方式。

下载 Tiled

制作地图使用Tiled,官网下载:https://libgdx.com/dev/tools/
创建一个新地图 200x200
在这里插入图片描述
在这里插入图片描述
自己找个地方存一下即可,就叫mymap,libgdx官网有说明推荐使用base64zlib加载地图。
再新建一个图片,用来把地图背景放到地图里
在这里插入图片描述
在这里插入图片描述
图片的话随意找一张
这时我们回到地图,创建一个图层,就叫acg把在这里插入图片描述
选择图层,然后选择右下角的图块集,将图块添加到地图中。
在这里插入图片描述
保存,将上面的资源放到core的assets/demo中,不用管idea的资源报错
在这里插入图片描述

加载地图

加载地图代码

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.utils.ScreenUtils;

/**
 * @author lingkang
 * @date 2021/10/3 15:54
 * @description
 */
public class MyMap extends ApplicationAdapter{

    private TiledMap map;// 地图
    private OrthographicCamera camera;// 相机
    private OrthogonalTiledMapRenderer renderer;// 正交相机渲染

    @Override
    public void create() {
        // 加载地图
        map = new TmxMapLoader().load("demo/mymap.tmx");
        // 不切割单元
        renderer = new OrthogonalTiledMapRenderer(map, 1f);
        // 创建一个正交摄影机,向我们显示20x24个单位的世界
        camera = new OrthographicCamera();
        // 相机大小,注意我们的地图是 20*10=200的 200x200地图
        // 为看到效果,我们把相机看到的大小设为 80x80
        camera.setToOrtho(false, 80, 80);
        camera.update();
    }
    @Override
    public void render() {
        // 清除相机内容
        ScreenUtils.clear(225f, 225f, 225f, 0.4f);

        // 摄影机查看并渲染内容
        renderer.setView(camera);
        renderer.render();
    }
}

运行代码:

import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import demo.MyMap;

public class DesktopApp {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        // 窗口需要保持与相机大小一致
        config.width=80;
        config.height=80;
        new LwjglApplication(new MyMap(), config);
    }
}

效果
在这里插入图片描述
咦?为啥这么小?因为我们的相机是80x80,只能看到全部的(80*80)/(200*200)窗口也是80x80
那我们就添加一个移动相机:

/**
 * @author lingkang
 * @date 2021/10/3 15:54
 * @description
 */
public class MyMap extends ApplicationAdapter {

    private TiledMap map;// 地图
    private OrthographicCamera camera;// 相机
    private OrthogonalTiledMapRenderer renderer;// 正交相机渲染
    private float mapX = 40, mapY = 40; // 地图坐标,用于相机观察这个坐标
    private final float moveSpeed = 10; // 相机移动的速度

    @Override
    public void create() {
        // 加载地图
        map = new TmxMapLoader().load("demo/mymap.tmx");
        // 不切割单元
        renderer = new OrthogonalTiledMapRenderer(map, 1f);
        // 创建一个正交摄影机,向我们显示20x24个单位的世界
        camera = new OrthographicCamera();
        // 相机大小,注意我们的地图是 20*10=200的 200x200地图
        // 为看到效果,我们把相机看到的大小设为 80x80
        camera.setToOrtho(false, 80, 80);
        camera.update();

        // 上下左右
        Gdx.input.setInputProcessor(new InputAdapter() {
            @Override
            public boolean keyDown(int keycode) {
                if (keycode == Input.Keys.LEFT || keycode == Input.Keys.A)
                    mapX -= moveSpeed;
                if (keycode == Input.Keys.RIGHT || keycode == Input.Keys.D)
                    mapX += moveSpeed;
                if (keycode == Input.Keys.UP || keycode == Input.Keys.W)
                    mapY += moveSpeed;
                if (keycode == Input.Keys.DOWN || keycode == Input.Keys.S)
                    mapY -= moveSpeed;
                return false;
            }
        });
    }

    @Override
    public void render() {
        // 清除相机内容
        ScreenUtils.clear(225f, 225f, 225f, 0.4f);

        // 相机观察地图的位置 :  mapX ,mapY
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();// 一定要记得更新这个相机的视图

        // 摄影机查看并渲染内容
        renderer.setView(camera);
        renderer.render();
    }
}

效果:
在这里插入图片描述

我们添加一个玩家,这里任意找了一张 20x20的图片player.png,将图片放到资源目录下

public class MyMap extends ApplicationAdapter {

    private TiledMap map;// 地图
    private OrthographicCamera camera;// 相机
    private OrthogonalTiledMapRenderer renderer;// 正交相机渲染
    private float mapX = 40, mapY = 40; // 地图坐标,用于相机观察这个坐标
    private final float moveSpeed = 10; // 相机移动的速度
    private SpriteBatch spriteBatch;// 用于绘制我们的玩家 player
    private Texture playerTexture; // 玩家显示

    @Override
    public void create() {
        // 加载地图
        map = new TmxMapLoader().load("demo/mymap.tmx");
        // 不切割单元
        renderer = new OrthogonalTiledMapRenderer(map, 1f);
        // 创建一个正交摄影机,向我们显示20x24个单位的世界
        camera = new OrthographicCamera();
        // 相机大小,注意我们的地图是 20*10=200的 200x200地图
        // 为看到效果,我们把相机看到的大小设为 80x80
        camera.setToOrtho(false, 80, 80);
        camera.update();

        // 上下左右
        Gdx.input.setInputProcessor(new InputAdapter() {
            @Override
            public boolean keyDown(int keycode) {
                if (keycode == Input.Keys.LEFT || keycode == Input.Keys.A)
                    mapX -= moveSpeed;
                if (keycode == Input.Keys.RIGHT || keycode == Input.Keys.D)
                    mapX += moveSpeed;
                if (keycode == Input.Keys.UP || keycode == Input.Keys.W)
                    mapY += moveSpeed;
                if (keycode == Input.Keys.DOWN || keycode == Input.Keys.S)
                    mapY -= moveSpeed;
                return false;
            }
        });

        spriteBatch=new SpriteBatch();
        // 初始化,加载玩家
        playerTexture = new Texture("demo/player.png");
    }

    @Override
    public void render() {
        // 清除相机内容
        ScreenUtils.clear(225f, 225f, 225f, 0.4f);

        // 相机观察地图的位置 :  mapX ,mapY
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();// 一定要记得更新这个相机的视图

        // 摄影机查看并渲染内容
        renderer.setView(camera);
        renderer.render();

        // 将玩家放到相机里,注意是相机的坐标位置,不是地图的坐标位置;
        // 不管地图坐标mapX、mapY移动到哪里,我们的玩家仍在相机的中心位置
        spriteBatch.begin();
        spriteBatch.draw(playerTexture,40,40); // 把玩家绘画到相机的中心 40,40 (相机大小80x80)
        spriteBatch.end();
    }
}

效果:
在这里插入图片描述
是不是玩家一致在中心走?
如果想按下方向就能自动走的话,把按键逻辑放到渲染中即可:注意将速度调整为 1

/**
 * @author lingkang
 * @date 2021/10/3 15:54
 * @description
 */
public class MyMap extends ApplicationAdapter {

    private TiledMap map;// 地图
    private OrthographicCamera camera;// 相机
    private OrthogonalTiledMapRenderer renderer;// 正交相机渲染
    private float mapX = 40, mapY = 40; // 地图坐标,用于相机观察这个坐标
    private final float moveSpeed = 1; // 相机移动的速度
    private SpriteBatch spriteBatch;// 用于绘制我们的玩家 player
    private Texture playerTexture; // 玩家显示

    @Override
    public void create() {
        // 加载地图
        map = new TmxMapLoader().load("demo/mymap.tmx");
        // 不切割单元
        renderer = new OrthogonalTiledMapRenderer(map, 1f);
        // 创建一个正交摄影机,向我们显示20x24个单位的世界
        camera = new OrthographicCamera();
        // 相机大小,注意我们的地图是 20*10=200的 200x200地图
        // 为看到效果,我们把相机看到的大小设为 80x80
        camera.setToOrtho(false, 80, 80);
        camera.update();

        // 上下左右
        /*Gdx.input.setInputProcessor(new InputAdapter() {
            @Override
            public boolean keyDown(int keycode) {
                if (keycode == Input.Keys.LEFT || keycode == Input.Keys.A)
                    mapX -= moveSpeed;
                if (keycode == Input.Keys.RIGHT || keycode == Input.Keys.D)
                    mapX += moveSpeed;
                if (keycode == Input.Keys.UP || keycode == Input.Keys.W)
                    mapY += moveSpeed;
                if (keycode == Input.Keys.DOWN || keycode == Input.Keys.S)
                    mapY -= moveSpeed;
                return false;
            }
        });*/

        spriteBatch=new SpriteBatch();
        // 初始化,加载玩家
        playerTexture = new Texture("demo/player.png");
    }

    @Override
    public void render() {
        // 清除相机内容
        ScreenUtils.clear(225f, 225f, 225f, 0.4f);

        if (Gdx.input.isKeyPressed(Input.Keys.LEFT) || Gdx.input.isKeyPressed(Input.Keys.A)) {
            if (mapX < 0) {
                mapX = 0; // 不给玩家走出屏幕外
            } else
                mapX -= moveSpeed;
        }

        if (Gdx.input.isKeyPressed(Input.Keys.RIGHT) || Gdx.input.isKeyPressed(Input.Keys.D)) {
            if (mapX > 200) {
                mapX = 200;// 不给玩家走出屏幕外
            } else
                mapX += moveSpeed;
        }
        if (Gdx.input.isKeyPressed(Input.Keys.UP) || Gdx.input.isKeyPressed(Input.Keys.W)) {
            if (mapY > 200) {
                mapY = 200;// 不给玩家走出屏幕外
            } else
                mapY += moveSpeed;
        }
        if (Gdx.input.isKeyPressed(Input.Keys.DOWN) || Gdx.input.isKeyPressed(Input.Keys.S)) {
            if (mapY < 0) {
                mapY = 0;// 不给玩家走出屏幕外
            } else
                mapY -= moveSpeed;
        }

        // 相机观察地图的位置 :  mapX ,mapY
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();// 一定要记得更新这个相机的视图

        // 摄影机查看并渲染内容
        renderer.setView(camera);
        renderer.render();

        // 将玩家放到相机里,注意是相机的坐标位置,不是地图的坐标位置;
        // 不管地图坐标mapX、mapY移动到哪里,我们的玩家仍在相机的中心位置
        spriteBatch.begin();
        spriteBatch.draw(playerTexture,40,40); // 把玩家绘画到相机的中心 40,40 (相机大小80x80)
        spriteBatch.end();
    }
}

标签:游戏,Keys,libGDX,地图,相机,camera,Input,mapY,keycode
来源: https://blog.csdn.net/weixin_44480167/article/details/120595074

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有