【Godot引擎开发】简单基础,外加一个小游戏DEMO

在这里插入图片描述

博主:_LJaXi
专栏: Godot | 横版游戏开发

Godot

  • 物体规律移动
  • 内置虚函数
  • 浮点计算
  • 浮点数计算
  • 数组API
  • Input单例与自定义单例
  • 节点
    • Node
    • Sprite2D
    • Area2D
    • CollisionShape2D
    • KinematicBody2D
    • RigidBody2D
  • Pong
    • 游戏场景安排
    • 玩家1
    • 玩家2
    • 小球
    • 记分系统
    • 文件概要

下面是介绍 Godot 开发游戏注意事项

物体规律移动

像这种物体移动,实际开发不应该使用帧插值而是物理插值

具体来说,就是写在_physics_process中,固定每秒运行的次数保证不同电脑的结果一致

extends Sprite2D# Called when the node enters the scene tree for the first time.
func _ready():pass # Replace with function body.# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):self.position.x = self.position.x + 1;pass

代码片段中的 _process 函数实际上并不是帧插值。它是 Godot 引擎中的一个函数,会在每一帧被调用,代码片段中的内容表示每一帧节点的 position.x 值都会增加 1,实现了水平方向的移动效果

要使不同电脑看到的移动效果一致,可以使用固定的时间步长来计算位置。具体做法是将每一帧的移动距离乘以时间步长,例如乘以 delta 变量,delta 表示自上一帧以来的时间差,它能够平滑处理游戏在不同帧率下的表现

extends Sprite2D# Called when the node enters the scene tree for the first time.
func _ready():pass # Replace with function body.# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):var speed = 100  # 设置移动速度self.position.x += speed * delta  # 根据时间步长计算移动距离pass

内置虚函数

内置虚函数的调用
虚函数是指没有实际处理流程的函数,这部分函数的内容可以由我们自行编写。而内置虚函数则是指 Godot 的制作组

规定了特定名称却没有实际处理流程的函数,节点内的虚函数会在特定的条件下自动被触发

条件 1: 当节点本身或其周围节点状态发生改变时【节点创建、节点入“树”、节点出“树”、节点死亡前、节点的
子节点全部加入场景树】

条件 2: 当场景树的状态发生改变时,且节点自身处于“树”下,【画面刷新、物理引擎刷新、硬件设备输入】

条件 3: 其他情况

常用虚函数: _init, ready, _process, _physic_process

# _init
节点被创建时,调用的虚函数# ready
当一个节点的全部子节点加入场景树中调用的虚函数# _process
画面刷新时,节点自动调用的虚函数# _physic_process
引擎刷新时,节点自动调用的虚函数# _process 和 _physic_process 都有一个相同的参数,即 delta,这个参数代表自上一次帧或物理引擎更新以来经过的时间,单位是秒.

浮点计算

浮点计算只保留整数,不采取四舍五入

浮点数计算

is_equal_approx(a :float, b :float)

extends Sprite2Dfunc _ready():var a = 1;var b = 0;var c = 0.1;var d = 0.2;if (a > 0):print("True");if (is_equal_approx(c+d, 0.3)):print("True, float!");while (b < 1):print("True");break;pass;@warning_ignore("unused_parameter")
func _process(delta):pass;

这个函数的作用是检查 a + b 的值是否接近于 0.3,它使用 is_equal_approx 函数来进行近似相等的比较

在计算机中,由于浮点数的精度问题,直接使用相等运算符 == 进行浮点数的比较可能会导致不准确的结果,而使用 is_equal_approx 函数可以进行近似相等的比较,用于处理浮点数的比较误差

在这个例子中,如果 a + b 的值接近于 0.3,那么条件判断 is_equal_approx(a+b, 0.3) 的结果将为真(True),并输出 “True, float!”

数组API

extends Nodefunc _enter_tree():pass;func _ready():var a :Array[int] = [1, 2, 3];a.append(4); # 追加元素print(a.size()); # get数组长度a.erase(4); # 删除元素(删除第一个)print(a);# 使用 for遍历for i in a:i += 1; # for循环处理的数据并不会改变原数组print(i);pass;print(a);

Input单例与自定义单例

extends Sprite2D# 可以在 项目 --> 项目设置 --> 键入映射
# 来添加新的动作# Input 是一个重要对象,它可以对玩家的按键情况进行反馈# get_action_strength(action: StringName, exact_match: bool = false)
# 返回按下某个按键的力度,按键取决于设置的action, 返回值一般在 0到1之间,按下为1,没按为0# 轮询-说明
# 在_process中或_physic_process中通过Input单例来获取按键情况,这种一秒数十次检测游戏输入情况的编码方式称为轮询
# If+轮询+修改内置变量 = 游戏在玩家的控制下发生实质性的改变
func _ready():print(Input.get_action_strength("GoLeft"))# 可以在项目中添加自定义脚本	# 脚本可以单独设置己的变量,方法等属性# 访问脚本属性print(AAAA.a);AAAA.b();func _process(delta):# 轮询if (Input.get_action_strength("GoLeft")):self.position.x = self.position.x - 1;pass

在这里插入图片描述
在这里插入图片描述

就可以通过访问 BBBB.a 来获取 new_script2 脚本中的属性了

我项目里加的是 AAAA

extends Nodevar a = 12;func b():print("单例的自定义函数");

节点

Node

Node(节点)是 Godot 引擎中构建游戏场景和游戏逻辑的基本单元

Sprite2D

Sprite2D节点是用于在2D游戏中渲染和显示2D图像的节,它可以用来显示精灵、图片、纹理等在游戏界面中的2D元素

Area2D

Area2D 是一个区域节点,用于检测其他节点(如碰撞体、角色、敌人等)是否进入、离开或停留在其范围内的区域。它可以用于实现触发器区域、区域伤害、搜寻敌人等功能,Area2D 可以检测碰撞体、物理体和其他 Area2D 节点,通过发射信号来通知开发者有关碰撞事件的发生

CollisionShape2D

CollisionShape2D 是用于定义2D物体碰撞形状的节点。它可以附加到其他节点上(如 SpriteKinematicBody2DRigidBody2D)来定义它们的碰撞边界

CollisionShape2D可以设置为矩形、圆形、多边形或线段等形状,以便与其他碰撞体进行碰撞检测。当两个 CollisionShape2D 重叠或相交时,引擎将触发碰撞事件,使开发者能够处理碰撞逻辑

KinematicBody2D

KinematicBody2D 是 Godot 引擎中的一个节点类型,用于在2D场景中创建基于运动和碰撞的物体。

KinematicBody2D 是一个虚拟的物理体,它不受外部力的影响,而是通过编程控制来移动。它可以模拟刚体的运动、碰撞和物理响应,但与真正的刚体(如 RigidBody2D)不同,KinematicBody2D 不受物理引擎的力或碰撞影响。

使用 KinematicBody2D,您可以编程控制物体的位置、速度和碰撞行为。它适用于需要精确控制对象运动的情况,例如角色控制器、平台、游戏角色和敌人等。KinematicBody2D 具有内置的碰撞检测功能,可以与 CollisionShape2DArea2D 等碰撞形状节点一起使用,以检测物体之间的碰撞并触发相应的逻辑处理。

总而言之,KinematicBody2D 是一个在2D场景中用于控制运动和碰撞的节点类型,适用于需要精确控制物体行为的场景

RigidBody2D

RigidBody2D 是 Godot 引擎中的一个节点类型,用于在2D场景中创建具有物理效果的刚体物体

RigidBody2D 是一个具有质量、碰撞和物理响应的物理体。它会受到物理引擎自动计算的力和力矩的作用,并在场景中模拟物体的物理行为,如重力、摩擦力、碰撞等

使用 RigidBody2D,您可以模拟物体受到的真实物理力和力矩的影响,例如重力使物体下落、施加力或冲量使物体移动、碰撞引起物体反弹等。您可以通过设置 RigidBody2D 的质量、摩擦力、弹性等属性来调整物体的物理特性

RigidBody2D 通常与 CollisionShape2D 等碰撞形状节点一起使用,以定义物体的碰撞形状,并实现与其他物体的碰撞检测和响应

总而言之,RigidBody2D 是一个用于在2D场景中创建具有物理效果的刚体物体的节点类型。它可以模拟物体的物理行为,并与其他碰撞形状节点一起使用,实现真实的碰撞和物理交互效果

Pong

Pong 是世界上最古老的电子游戏之一
它的玩法非常简单,只需要两个玩家使用控制器控制不同的球拍互相击球即可

游戏场景安排

游戏地图地图以黑色为背景
在中央显示一道竖直白线,上下两侧显示白色墙壁
小球进入白色墙壁的范围后会发生移动角度的改变
小球从左右两侧飞出后,会让小球回到原点

玩家1

接受玩家输入控制,能在一定范围内移动
与小球接触后会击飞小球

玩家2

接受玩家输入控制,能在一定范围内移动
与小球接触后会击飞小球

小球

能够在地图中自由移动,碰到球拍与墙壁会发生速度方向的改变

记分系统

能够记录左右两名玩家的分数,将玩家分数显示到屏幕上方

文件概要

已存入百度网盘,需要自行下载
Game-Pong 双人乒乓球

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++学习(模板+排序+测时)

本文主要记录使用模板函数来编写排序算法&#xff0c;并计算运行时间。 模板函数&#xff08;Template Function&#xff09;是一种通用函数&#xff0c;可以在其定义时不指定具体的参数类型&#xff0c;在调用时再根据需要指定具体类型。模板函数可以接受不同类型的参数&…

『力扣刷题本』:相交链表

咳咳&#xff0c;实在抱歉&#xff0c;刚开始心气太高了&#xff0c;叫『每日一题』&#xff0c;我是真的坚持不下了。 经过这次打击&#xff0c;我算是摸明白自己在写博客这件事情上几斤几两了&#xff0c;现在预计一周两更&#xff0c;再慢慢把更新频率提上来。 正在努力补…

Java数字处理类-- Math类--数学运算

在Java中提供了一个执行数学基本运算的Math类,该类包括了常用的数学运算方法和常量&#xff0c;包括【三角函数方法】&#xff0c;【指数函数方法】&#xff0c;【取整函数方法】、【取最大值函数方法】、【取最小值函数方法】、【取平均值函数方法】、【对数函数方法】&#x…

MSF入门

漏洞数据库、利用工具集MSF MSF: The Metasploit Framework 简称美少妇 MSF安装 安装平台 Kali Linux: 自带Linux: 阿里云CentOS7安装msfWindows.msi 使用方式 msfconsole 交互终端 msfcli . msfconsole -x"command:..."图形界面: artimate、viper 下面我会用…

ES6 Class和Class继承

1.class的基本语法 class可以理解为是一个语法糖&#xff0c;将js只能通过构造函数创建实例的方法进行了补充 构造函数&#xff1a; function Person ({ name, age18 }) {this.name namethis.age age } new Person({name: 张三}) Class类&#xff1a; class Person {con…

SLAM从入门到精通(构建自己的slam包)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们学习了很多的开源包&#xff0c;比如hector、gmapping。但其实我们也可以自己编写一个slam包。这么做最大的好处&#xff0c;主要还是可以帮助…

抽象轻松的java

先看问题代码和运行结果 public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println("输入一串数字");int i scanner.nextInt();System.out.println("i&#xff1a;" i);int z scanner.nextInt();System.ou…

宏(预编译)详解

目录 一、程序的编译环境 二、运行环境 三、预编译详解 3.1预定义符号 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 3.2.3#define替换规则 3.2.4 #和## 2)##的作用&#xff1a; 3.2.5宏和函数的对比 3.2.6宏的命名约定和#undef指令 一、命名约定&#xff1a; …

学信息系统项目管理师第4版系列32_信息技术发展

1. 大型信息系统 1.1. 大型信息系统是指以信息技术和通信技术为支撑&#xff0c;规模庞大&#xff0c;分布广阔&#xff0c;采用多级 网络结构&#xff0c;跨越多个安全域&#xff1b;处理海量的&#xff0c;复杂且形式多样的数据&#xff0c;提供多种类型应用 的大系统 1.1.…

【常用图像增强技术,Python-opencv】

文章目录 常用图像增强技术调整大小灰度变换标准化随机旋转中心剪切随机裁剪高斯模糊亮度、对比度和饱和度调节水平翻转垂直翻转高斯噪声随机块中心区域 常用图像增强技术 图像增强技术是常用于数据增强的方法&#xff0c;可以帮助增加数据集中图像的多样性&#xff0c;提高深…

论文阅读:Point-to-Voxel Knowledge Distillation for LiDAR Semantic Segmentation

来源&#xff1a;CVPR 2022 链接&#xff1a;https://arxiv.org/pdf/2206.02099.pdf 0、Abstract 本文解决了将知识从大型教师模型提取到小型学生网络以进行 LiDAR 语义分割的问题。由于点云的固有挑战&#xff0c;即稀疏性、随机性和密度变化&#xff0c;直接采用以前的蒸馏…

Mapping 设计指南

Mapping 设计指南 目录概述需求&#xff1a; 设计思路实现思路分析1、properties2.fields 3.search_analyzer4.2、format1、enabled2、doc_values 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0…

Vue3 + Nodejs 实战 ,文件上传项目--大文件分片上传+断点续传

目录 1.大文件上传的场景 2.前端实现 2.1 对文件进行分片 2.2 生成hash值&#xff08;唯一标识&#xff09; 2.3 发送上传文件请求 3.后端实现 3.1 接收分片数据临时存储 3.2 合并分片 4.完成段点续传 4.1修改后端 4.2 修改前端 5.测试 博客主页&#xff1a;専心_前端…

【Python】文件操作

一、文件的编码 思考:计算机只能识别:0和1&#xff0c;那么我们丰富的文本文件是如何被计算机识别&#xff0c;并存储在硬盘中呢? 答案:使用编码技术( 密码本)将内容翻译成0和1存入 编码技术即:翻译的规则&#xff0c;记录了如何将内容翻译成二进制&#xff0c;以及如何将二…

人人开源前后端分离开源项目启动流程(超详细)

renren-security是一个轻量级的&#xff0c;前后端分离的Java快速开发平台&#xff0c;能快速开发项目并交付【接私活利器】采用SpringBoot、Shiro、MyBatis-Plus、Vue3、TypeScript、Element Plus、Vue Router、Pinia、Axios、Vite框架&#xff0c;开发的一套权限系统&#xf…

【计算机网络笔记】OSI参考模型基本概念

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

(H5轮播)vue一个轮播里显示多个内容/一屏展示两个半内容

效果图 : html: <div class"content"><van-swipeclass"my-swipe com-long-swipe-indicator":autoplay"2500"indicator-color"#00C4FF"><van-swipe-itemclass"flex-row-wrap"v-for"(items, index) in M…

【Git】升级MacOS系统,git命令无法使用

终端执行git命令报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun安装这个东东&#xff0c;&#xff1f;需要42小时 最终解决&#xff1a; 下载安装 https…

微信小程序开发的OA会议之会议个人中心的页面搭建及模板,自定义组件的学习

目录 一.自定义组件及会议效果编写 效果显示 二.个人中心布局 编写结果 ​编辑 一.自定义组件及会议效果编写 在页面中创建一个以components命名的项目来存放组件 再在components文件夹中创建一个组件&#xff0c;名为 :tabs &#xff0c;创建操作如图所示 刚刚创建好会报…

山海鲸可视化B/S架构应用

一、什么是B/S架构 BS架构&#xff08;Browser-Server架构&#xff09;是一种常见的软件架构模式&#xff0c;其中系统的核心业务逻辑和数据处理都发生在服务器端&#xff08;Server&#xff09;&#xff0c;而客户端&#xff08;Browser&#xff09;主要负责显示和用户交互。…