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编 ...
随机推荐
- linux中的sar命令
linux中的sar命令 sar命令的安装 [root@localhost test]# yum install sysstat 安装成功! sar命令说明 语法格式 sar [ 选项 ] [ < ...
- 文心一言 VS 讯飞星火 VS chatgpt (100)-- 算法导论9.3 6题
六.用go语言,对一个包含n个元素的集合来说,k分位数是指能把有序集合分成k个等大小集合的第k-1个顺序统计量.给出一个能找出某一集合的k分位数的 O(nlgk)时间的算法. 文心一言: 要找到一个集 ...
- 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
三.用go语言,仿照图 10-2,画图表示依次执行操作 ENQUEUE(Q,4).ENQUEUE(Q,1).ENQUEUE(Q,3).DEQUEUE(Q).ENQUEUE(Q,8)和 DEQUEUE( ...
- python第6章code
01条件判断语句 # 条件判断语句(if语句)# 语法:if 条件表达式 : # 代码块# 执行的流程:if语句在执行时,会先对条件表达式进行求值判断,# 如果为True,则执行if后的语句# 如果为 ...
- Capture Data.dmg
苹果apple mac 系统检测 日常分析 软件 https://gigafiles.apple.com/#/download 现有文件可供下载. 备注 Capture Data 9.9.0 Th ...
- DPDK丢包那些事
本文来自博客园,作者:T-BARBARIANS,博文严禁转载,转载必究! 一.前言 DPDK技术原理相关的文章不胜枚举,但从实战出发,针对DPDK丢包这一类问题进行系统分析的文章还是凤毛麟角. 刚好最 ...
- umicv cv-summary1-全连接神经网络模块化实现
全连接神经网络模块化实现 Linear与Relu单层实现 LossLayer实现 多层神经网络 不同梯度下降方法 Dropout层 今天这篇博文针对Assignment3的全连接网络作业,对前面学习的 ...
- MongoDB-SQL语法
MongoDB-SQL语法 可视化软件:Navicat 1. MongoDB-查询 db.getCollection('表名').find({}); db.getCollection('表名').fi ...
- Spring 缓存注解这样用,太香了!
作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 @Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位. S ...
- Net 高级调试之七:线程操作相关命令介绍
一.简介 今天是<Net 高级调试>的第六篇文章.上一篇文章我们说了值类型,引用类型,数组等的内存表现形式.有了这个基础,我们可以更好的了解我们的程序在运行时的状态,内存里有什么东西,它们 ...