【Godot4自学手册】第十三节初建创建敌人

从本节起,将要学习创建第一人。

一、创建敌人动画

1.导入素材。

在Sprites文件夹下新建Enemy文件夹,并将需要的敌人素材导入到文件夹。文档结构如下:
请添加图片描述

2.创建Enemy场景。

新建场景,根节点设置为CharacterBody2D,命名为Enemy。先为跟节点添加AnimatedSprite2D和CollisionShape2D两个节点,将该场景保存到Scenes目录下。目前场景目录如下:
请添加图片描述

3.完善AnimatedSprite2D节点,实现敌人动画。

AnimatedSprite2D节点属性检查器中sprite_frames属性选择新建sprite_frames,如下:
请添加图片描述

这样就可以在动画帧面板中编辑动画了。
在动画帧点击添加动画按钮,联系添加5个动画,双击名称分别重名为:Idle,Run,Attack,Death,TakeHit五种动画分别对应待机,跑,攻击、死亡和受伤五种状态,如下。
请添加图片描述

下面详细介绍一下动画帧面板中的各个按钮功能。
请添加图片描述

图片对应序号功能如下:

序号功能
1添加动画
2删除动画
3加载后自动播放
4动画循环
55FPS表示动画速度
6从当前位置倒放到选中动画
7从结束时间倒放到选中动画
8暂停、停止动画播放
9从头播放到选中动画
10从当前位置播放到选中动画
11从文件中添加帧
12从精灵表中添加帧
13复制帧
14粘贴帧
15在所选之前插入空白帧
16在所选之后插入空白帧
17向左移动帧
18向右移动帧
19删除帧
20帧持续时间
选中Idle动画,单击从精灵表中添加帧按钮,在弹出对话中选择idle.png图片,然后出现下面对话框:

请添加图片描述

水平设置4,垂直设为1,然后选择四张图片,单击添加4帧按钮。然后将动画设置为加载后自动播放,动画循环、动画速度设置为7FPS,如下:
请添加图片描述

同理,依次设置Run,Attack,Death,TakeHit4个动画。

4.完善CollisionShape2D节点。

CollisionShape2D节点检查器Shape2D属性选择新建CapsuleShape2D,然后调整大小和位置,最终如下:
请添加图片描述

二、创建敌人脚本

为敌人创建enemy.gd脚本,保存到scritpts文件夹内。修改代码如下:

extends CharacterBody2D
enum {
	IDLE,
	CHASE,
	ATTACK,
	HURT,
	DEATH
}
const SPEED = 300.0
var state = IDLE:
	set(value):
		state=value
		match state:
			IDLE:
				idle_state()
			CHASE:
				chase_state()
			ATTACK:
				attack_state()
			HURT:
				hurt_state()
			DEATH:
				death_state()

func _physics_process(delta):		
	state =IDLE	
	move_and_slide()
	
	
func idle_state():
	pass

func chase_state():
	pass
func attack_state():
	pass
func hurt_state():
	pass
func death_state():
	pass

上述代码,定义了敌人的五种状态,分别是闲置、追踪、攻击、受伤和死亡。定义了敌人状态state,当状态改变时,执行对应的状态代码。match函数与主人公调用的位置不同,在第五节中,代码在_physics_process函数里面使用了match,这节我们在更改属性设置时,使用了该函数。别的功能现在指示打架一个框架,今后,我会逐渐完成各部分功能。

三、将敌人添加到主场景

将敌人场景展现到主场景,有两种方法实现:一是在主场景根节点直接点击实例化子场景按钮,或按住快捷键ctrl+shift+A快捷键,选择敌人场景,这样就可以了。第二种方法用编码的方式把敌人加载到主场景中。下面我将用编码实现将敌人添加到主场景,且是每2秒钟出现一个敌人,位置随机。在开始之前,先学习一下Timer节点,它是一个倒数计时器,用指定的间隔进行倒计时,并在到达 0 时发出信号,可以设置为重复或“一次性”模式。
第一步:在主场景中给根节点添加一个Node2D节点,命名为Enemy。
第二步:在主场景中给根节点添加一个Timer节点,检查器中将wait_time设置为2,表示2秒钟执行一次;autostart开启,表示始终自动执行,结果如下:
请添加图片描述

目前,主场景的目录结构如下:
请添加图片描述

第三步:在Main节点的代码中,引入Timer信号。选择Timer节点,切换到节点面板,然后双击timerout信号,选择Main节点,单击连接按钮,这样会在代码中添加 _on_timer_timeout()函数,操作过程如下:
请添加图片描述

第四步:在Main节点代码中录入代码:
首先定义变量enmey_preload,预先加载enemy场景。

var enmey_preload = preload("res://Scenes/enemy.tscn")

编写敌人复制函数,代码如下:

func enemy_spawn():
	var enemy = enmey_preload.instantiate()
	enemy.position = Vector2(randi_range(100,1140),randi_range(100,570))
	$Enemy.add_child(enemy)

第一行代码,实例化敌人;
第二行代码表示设置敌人的位置,x坐标在100,1140直接随机产生,y坐标在100和570之间随机产生;
第三行代码,将实例化的敌人添加到Enemy节点下。
最后在_on_timer_timeout函数中调用enemy_spawn函数:

func _on_timer_timeout():
	enemy_spawn()

这样,就实现了将敌人添加到主场景中。最后预览效果如下:
请添加图片描述

新年快乐,今天就到这了。谢谢同学们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/386897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…

PR:熟悉PR工作环境

新建项目 设置自己的页面布局 首选项

vim编辑代码后退出编辑显示vim编辑的内容

在/etc/profile.d/下新建terminal.sh: 在terminal.sh里添加如下代码: #!/bin/bashexport TERMlinux 然后同步文件到内存: source /etc/profile

ACM训练题:互不侵犯

一看数据范围,如果是枚举所有的棋盘情况,2^K,肯定超了,自然是要一行一行递推,而相邻这个情况用位运算会比较方便,所以用状压dp。 具体算法:dp[i][j][k]表示第i行,前i行有j个棋子&…

【网站项目】023实验室耗材管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

九、OpenCV自带colormap

项目功能实现&#xff1a;每隔1500ms轮流自动播放不同风格图像显示&#xff0c;按下Esc键退出 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 colormap.h #pragma once #include<opencv2/opencv.hpp> using namespace cv;class ColorMap { public:vo…

Spring 如何解决循环依赖?Spring三级缓存

什么是循环依赖 说白是一个或多个对象实例之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成了构成一个环形调用。 自己依赖自己 两个对象间的依赖关系 多个对象间的依赖关系 Spring出现循环依赖的场景 单例的setter注入 Service public class A {Resourceprivate…

flask+python儿童福利院管理系统pycharm毕业设计项目

本系统解决了儿童福利院管理事务中的主要问题&#xff0c;包括首页、个人中心、爱心人士管理、员工管理、后勤人员管理、儿童信息管理、院所风采管理、活动管理、食谱管理、领养流程管理、政策法规管理、楼栋管理、宿舍管理、领养申请管理、义工申请管理、捐赠信息管理、宿舍物…

linux应用 进程间通信之共享内存(POSIX)

1、前言 1.1 定义 POSIX共享内存是一种在UNIX和类UNIX系统上可用的进程间通信机制。它允许多个进程共享同一块内存区域&#xff0c;从而可以在这块共享内存上进行读写操作。 1.2 应用场景 POSIX共享内存适用于需要高效地进行大量数据交换的场景&#xff0c;比如多个进程需要…

消息中间件特点

1.  消息中间件概念 消息中间件是消息传递的过程中保存消息的容器。 主要目的&#xff1a;提供路由并保证消息的传递&#xff1b;如果发送消息时接受者不可用&#xff0c;消息队列会保留信息&#xff0c;直到可以成功传递为止。 消息中间件保存消息也是有期限的。 2.  消息…

openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存

文章目录 openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存217.1 查看内存状况217.2 性能参数分析 openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存 获取openGauss节点的CPU、内存、I/O和网络资源使用情况&…

加固平板电脑丨三防智能平板丨工业加固平板丨智能城市管理

随着智能城市的不断发展&#xff0c;人们对于城市管理的要求也在不断提高&#xff0c;这就需要高效、智能的城市管理平台来实现。而三防平板就是一款可以满足这一需求的智能设备。 三防平板是一种集防水、防尘、防摔于一体的智能平板电脑&#xff0c;它可以在复杂的环境下稳定运…

《Think in Java》

《Think in Java》 第一章&#xff1a;对象导论 1.1 抽象过程 1&#xff09;万物皆对象。 2&#xff09;程序是对象的集合&#xff0c;它们通过发送消息来告诉彼此所要做的。 3&#xff09;每个对象都有其他对象构成的存储&#xff0c;一个对象可以复用其他对象&#xff0c;从而…

【C++】模版初阶

目录 泛函编程 函数模版 概念 格式 原理 实例化 模版函数的匹配原则 类模板 定义格式 泛函编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, dou…

搜索专项---最小步数模型

文章目录 魔板 一、魔板OJ链接 本题思路:最小步数模型: 将整个“图”视为一个状态也即一个节点. 状态的转移视为权值为1的边. BFS求解, 注意几点: 状态的存储: 一般用字符串存储状态, 用哈希表存储初始状态到每个状态的距离. 方案记录: 记忆数组存储. 本题中需要存储上一个状…

低资源学习与知识图谱:构建与应用

目录 前言1 低资源学习方法1.1 数据增强1.2 特征增强1.3 模型增强 2 低资源知识图谱构建与推理2.1 元关系学习2.2 对抗学习2.3 零样本关系抽取2.4 零样本学习与迁移学习2.5 零样本学习与辅助信息 3 基于知识图谱的低资源学习应用3.1 零样本图像分类3.2 知识增强的零样本学习3.3…

5秒!全网最简单的幻兽帕鲁服务器搭建教程来了!

幻兽帕鲁官方服务器不稳定&#xff1f;自己搭建幻兽帕鲁服务器&#xff0c;低延迟、稳定不卡&#xff0c;目前阿里云和腾讯云均推出幻兽帕鲁专用服务器&#xff0c;腾讯云直接提供幻兽帕鲁镜像系统&#xff0c;阿里云通过计算巢服务&#xff0c;均可以一键部署&#xff0c;鼠标…

【C++初阶:类和对象(下篇)】初始化列表 | static成员 | 友元

目录 一、构造函数构造函数体赋值&#x1f43e;初始化列表&#x1f43e;&#x1f4a6; explicit关键字 二、static成员&#x1f43e;概念**&#x1f4a6; 关于静态的特性** 三、友元&#x1f4a6; **友元函数**&#x1f4a6; **友元类** **四、内部类** 一、构造函数 构造函数…

CSS之水平垂直居中

如何实现一个div的水平垂直居中 <div class"content-wrapper"><div class"content">content</div></div>flex布局 .content-wrapper {width: 400px;height: 400px;background-color: lightskyblue;display: flex;justify-content:…