libGDX游戏开发之添加玩家和敌人(三)

23 篇文章 4 订阅
23 篇文章 8 订阅

libGDX游戏开发之添加玩家和敌人(三)

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

添加玩家

按照之前的文章(一),我们在地图编辑器Tiled中编辑一个块=20x20,64*48的地图,添加一个背景用来识别玩家在走路:
在这里插入图片描述
将地图资源添加到项目后,编写下面的代码。

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
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/5 21:18
 * @description
 */
public class WorldMap extends ApplicationAdapter {
    // 精灵批处理
    public SpriteBatch batch;
    // 地图相关
    private TmxMapLoader maploader;
    private TiledMap map;
    private OrthographicCamera camera;// 相机
    private OrthogonalTiledMapRenderer renderer;

    private float mapX = 128f, mapY = 128f; // 地图的位置,用于相机观察这个位置
    private float moveSpeed = 4f; // 相机移动的速度

    // 玩家
    private TextureRegion player;

    @Override
    public void create() {
        batch = new SpriteBatch();

        // 加载地图和地图渲染
        maploader = new TmxMapLoader();
        // 地图是 块=20  像素大小:1280x960
        map = maploader.load("worldmap/worldmap.tmx");
        renderer = new OrthogonalTiledMapRenderer(map, 1);// 将地图单元设置为 1

        camera = new OrthographicCamera();
        // 相机可看到的宽高
        camera.setToOrtho(false, 500, 500);
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();

        // 玩家 大小 256*256 随意找一张图片
        player = new TextureRegion(new Texture("worldmap/badlogic.jpg"), 256, 256);
    }

    @Override
    public void render() {
        // 清除相机内容
        ScreenUtils.clear(225f, 225f, 225f, 0.4f);
        // 用户的输入
        userInput();

        // 更新相机
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();// 一定要记得更新这个相机的视图
        // 摄影机查看并渲染内容
        renderer.setView(camera);
        renderer.render();

        // 绘制玩家, -128 是因为绘制的原点是中央
        batch.begin();
        batch.draw(player, Gdx.graphics.getWidth() / 2 - 128, Gdx.graphics.getHeight() / 2 - 128);
        batch.end();
    }

    /**
     * 轮询,用户输入
     */
    private void userInput() {
        if (Gdx.input.isKeyPressed(Input.Keys.LEFT) || Gdx.input.isKeyPressed(Input.Keys.A)) {
            if (mapX < 64) {
                mapX = 64; // 不给玩家走出屏幕外
            } else
                mapX -= moveSpeed;
        }

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

    @Override
    public void dispose() {
        super.dispose();
    }
}

编写main函数,窗口大小为1280*960

/**
 * @author lingkang
 * @date 2021/10/5 15:24
 * @description
 */
public class WorldMapApp {
    public static void main(String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        config.width = 1280;
        config.height = 960;
        new LwjglApplication(new WorldMap(), config);
    }
}

运行效果如下:按方向键移动。
在这里插入图片描述

添加敌人

任意找一张图片当做敌人,代码如下:
在这里插入图片描述
代码如下,

/**
 * @author lingkang
 * @date 2021/10/5 21:18
 * @description
 */
public class WorldMap extends ApplicationAdapter {
    // 精灵批处理
    public SpriteBatch batch;
    // 地图相关
    private TmxMapLoader maploader;
    private TiledMap map;
    private OrthographicCamera camera;// 相机
    private OrthogonalTiledMapRenderer renderer;

    private float mapX = 128f, mapY = 128f; // 地图的位置,用于相机观察这个位置
    private float moveSpeed = 4f; // 相机移动的速度

    // 玩家
    private TextureRegion player;

    // 敌人 ,  enemyX  enemyY 敌人的位置为地图位置
    private TextureRegion enemy;
    private int enemyX = 200, enemyY = 700,enemyMoveSpeed=2;

    @Override
    public void create() {
        batch = new SpriteBatch();

        // 加载地图和地图渲染
        maploader = new TmxMapLoader();
        // 地图是 块=20  像素大小:1280x960
        map = maploader.load("worldmap/worldmap.tmx");
        renderer = new OrthogonalTiledMapRenderer(map, 1);// 将地图单元设置为 1

        camera = new OrthographicCamera();
        // 相机可看到的宽高
        camera.setToOrtho(false, 500, 500);
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();

        // 玩家 大小 256*256 随意找一张图片
        player = new TextureRegion(new Texture("worldmap/badlogic.jpg"), 256, 256);
        // 敌人,随便找了一张 250 250的截图
        enemy = new TextureRegion(new Texture("worldmap/enemy.png"), 250, 250);
    }

    @Override
    public void render() {
        // 清除相机内容
        ScreenUtils.clear(225f, 225f, 225f, 0.4f);
        // 用户的输入
        userInput();

        // 更新相机
        camera.position.x = mapX;
        camera.position.y = mapY;
        camera.update();// 一定要记得更新这个相机的视图
        // 摄影机查看并渲染内容
        renderer.setView(camera);
        renderer.render();

        // 敌人移动
        enemyX=enemyX+enemyMoveSpeed;
        if (enemyX>600){
            enemyMoveSpeed=-1;// 往左走
        }
        if (enemyX<200){
            enemyMoveSpeed=1;// 往右走
        }
        // 调用渲染,绘制敌人到地图上
        renderer.getBatch().begin();
        renderer.renderImageLayer(new TiledMapImageLayer(enemy, enemyX, enemyY));
        renderer.getBatch().end();

        // 绘制玩家, -128 是因为绘制的原点是中央
        batch.begin();
        batch.draw(player, Gdx.graphics.getWidth() / 2 - 128, Gdx.graphics.getHeight() / 2 - 128);
        batch.end();
    }

    /**
     * 轮询,用户输入
     */
    private void userInput() {
        if (Gdx.input.isKeyPressed(Input.Keys.LEFT) || Gdx.input.isKeyPressed(Input.Keys.A)) {
            if (mapX < 64) {
                mapX = 64; // 不给玩家走出屏幕外
            } else
                mapX -= moveSpeed;
        }

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

    @Override
    public void dispose() {
        super.dispose();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌康ACG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值