libGDX游戏开发之NPC敌人事件(六)
libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm…国内用libgdx比较少,多数情况需要去官网和google找资料,相互学习的可以加我联系方式。
libGDX游戏开发之NPC敌人事件(六)
前面的文章提到在地图中添加敌人,这只时候不参与事件点击等一些操作的场景,不适合RPG游戏,因为RPG游戏会点击怪物或者点击NPC。
通过阅读代码我发现文理Texture、精灵Sprite等无法添加鼠标点击等事件。前面提到的舞台Stage标签可以添加事件。通过阅读源码发现他们是继承Actor实现的。那么我们的NPC、敌人也能通过继承它实现。
编写一个NPC、敌人Actor
NPC
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Disposable;
/**
* @author lingkang
* @date 2021/10/10 15:01
* @description
*/
public class NPCActor extends Actor implements Disposable {
private Texture npc;
private float npcX = 200, npcY = 400; // NPC的位置
public NPCActor(SpriteBatch batch) {
// 任意找一张图片,我这里选择70*105 最好是2的幂大小
npc = new Texture(Gdx.files.internal("npc.png"));
// 设置npc演员的大小
setWidth(70);
setHeight(105);
}
/**
* 重写演员的绘制方法
*/
@Override
public void draw(Batch batch, float parentAlpha) {
// 将地图上的位置映射到相机上
Vector3 project = ActorEventApplicationAdapter.camera.project(new Vector3(npcX, npcY, 0));
batch.draw(npc, project.x, project.y,
// 将纹理设置绘制起点和大小
0, 0, 70, 105);
// 设置npc演员的位置
setPosition(project.x, project.y);
}
@Override
public void dispose() {
// 防止内存溢出
npc.dispose();
}
}
编写相机渲染
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.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.Scaling;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.ScalingViewport;
/**
* @author lingkang
* @date 2021/10/10 15:12
* @description
*/
public class ActorEventApplicationAdapter extends ApplicationAdapter {
// 精灵批处理
private SpriteBatch batch;
// 地图相关
private TmxMapLoader maploader;
private TiledMap map;
// 公开这个相机
public static OrthographicCamera camera;// 相机
private OrthogonalTiledMapRenderer renderer;
private float mapX = 128f, mapY = 128f; // 地图的位置,用于相机观察这个位置
private float moveSpeed = 4f; // 相机移动的速度
// 舞台
public Stage stage;
// 玩家
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, 800, 600);
camera.position.x = mapX;
camera.position.y = mapY;
camera.update();
// 玩家 大小 256*256 随意找一张图片
player = new TextureRegion(new Texture("worldmap/badlogic.jpg"), 256, 256);
ScalingViewport scalingViewport = new ScalingViewport(Scaling.stretch,
Gdx.graphics.getWidth(),
Gdx.graphics.getHeight(),
new OrthographicCamera()); // 舞台所在的相机与我们的相机不是同一个
// 必须保持舞台上的精灵批处理是同一个
stage = new Stage(scalingViewport, batch);
NPCActor npcActor = new NPCActor(batch);
// 添加npc点击事件
npcActor.addListener(new InputListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
// 注意,这里的X,Y是NPC大小内的位置,不是相机的位置
System.out.println(String.format("NPC被点击!NPC身体上的位置:%f,%f ",
x, y));
return false;
}
});
stage.addActor(npcActor);
Gdx.input.setInputProcessor(stage); // 必须添加输入事件
}
@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();
stage.draw();
stage.act();// 演员事件
}
/**
* 轮询,用户输入
*/
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;
}
}
}
编写启动入口
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import top.lingkang.enemy.ActorEventApplicationAdapter;
/**
* @author lingkang
* @date 2021/10/10 15:21
* @description
*/
public class ActorEventApp {
public static void main(String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.width = 1280;
config.height = 960;
new LwjglApplication(new ActorEventApplicationAdapter(), config);
}
}
效果:

控制台输出我们的点击事件:

后记
类似地,我们将上面的NPC改为敌人,鼠标选择后,按技能键一顿输出就是RPG。
打赏
觉得内容不错就赏作者一杯咖啡吧!(恰饭)

后续我会出更多libgdx文章:寻路、寻路算法、打怪,以RPG的视角。
libGDX游戏开发之NPC敌人事件(六)的更多相关文章
- [整理]Unity3D游戏开发之Lua
原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...
- Cocos2d-x 3.x游戏开发之旅
Cocos2d-x 3.x游戏开发之旅 钟迪龙 著 ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...
- 【转载】浅谈游戏开发之2D手游工具
浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android 程序设计: 其它 编程语言: 引擎/SDK ...
- Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)
Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读
---------------------------------------------------------------------------------------------------- ...
- iOS游戏开发之UIDynamic
iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...
- [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse
---------------------------------------------------------------------------------------------------- ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)
---------------------------------------------------------------------------------------------------- ...
- Unity3D游戏开发之C#编程中常见数据结构的比较
一.前言 Unity3D是如今最火爆的游戏开发引擎,它可以让我们能轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型的互动内容.它支持2D/3D游戏开发,据不完全统计,目前国内80%的手机游戏都 ...
- 3D游戏开发之在UE4中创建非玩家角色(NPC)
接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...
随机推荐
- 【保姆级安装使用教程#1】Xshell与Xftp的下载、安装和使用
1. 下载 官网下载地址:==Xshell与Xftp下载地址== 当然也可以用鄙人的百度网盘连接下载这是链接:链接百度网盘下载Xshell与Xftp分别下载Xshell与Xftp 2. 安装Xshel ...
- C/C++基础——引用与指针有什么区别?C++中输入输出加速
文章目录 1 引用与指针有什么区别? 2 C++中输入输出加速 tie sync_with_stdio 应用 1 引用与指针有什么区别? 指针和引用都是地址的概念,指针指向一块内存,它的内容是所指内存 ...
- 前端三件套系例之JQuery——JQuery动画效果、JQuery插件、
文章目录 1 JQuery动画效果 1. 基本效果 2. 滑动效果 3 淡入淡出效果 4 自定义动画 5 动画控制 6 设置 7 事件 7-1 常用事件 7-2 事件绑定 7-3 移除事件 7-4 阻 ...
- 【matplotlib 实战】--饼图
饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表.在饼图中,每个扇形的弧长(以及圆心角和面积)大小,表示该种类占总体的比例,且这些扇形合在一起刚好是一个完全的圆形. 饼图最显著的功能在于表现&qu ...
- MQ系列15:MQ实现批量消息处理
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...
- Frog 3 题解
Frog 3 题目大意 题意都这么明确了还要这个干什么. 存在 \(n\) 个点,每个点有一个属性 \(h_i\),\(h_i\) 单增,从点 \(i\) 移动到点 \(j(j>i)\) 的代价 ...
- 入门篇-其之六-附录一-以Java字节码的角度分析i++和++i
前言:众所周知,i++和++i的区别是:i++先将i的值赋值给变量,再将i的值自增1:而++i则是先将i的值自增1,再将结果赋值给变量.因此,二者最终都给i自增了1,只是方式不同而已. 当然,如果在面 ...
- 字符串小记 II:字符串自动机
OI 中的自动机指的是"有限状态自动机",它是对一串信号进行处理的数学模型,一般由以下三部分构成: 字符集(\(\Sigma\)),能够输入进自动机的字符集合. 状态集合(\(Q\ ...
- [Python急救站课程]Python集成环境IDEA:Pycham专业版2023.2.3安装与破解方法
今天给大家带来了我们的第一课内容,Pycharm专业版2023.2.3安装并破解 首先,在浏览器中搜索Pycharm即可进入官网下载:https://www.jetbrains.com/pycharm ...
- JavaScript高级程序设计笔记11 期约与异步函数(Promise & Async Function)
期约与异步函数 ES6新增Promise引用类型,支持优雅地定义和组织异步逻辑. ES8增加了使用async和await关键字定义异步函数的机制. 异步编程 JavaScript这种单线程事件循环模型 ...