libGDX游戏开发之添加玩家和敌人(三)
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();
}
}