godot学习笔记

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

单例:


可以在任意脚本直接访问的对象,分为内置和自定义;
不是节点,可以直接使用控制图形和音效;
例:Input,对玩家按键情况进行反馈
Input.get_action_strength(”自定义按键“)//按下为true,没按为0

在某一节点可以使用self指定其本身,position代表其位置.x和 .y可以访问坐标

在pong中使用到的函数

func _physics_process(delta: float) -> void:

#随每个物理帧刷新一次,

get_overlapping_areas()

返回相交的 Area2D 的列表,可以用for访问

for i in get_overlapping_areas():
		if i.is_in_group("Ball"):
			i.vec.x=5

● bool is_in_group(group: StringName)

判断节点是否在这个组里(node,例子如上

Input.get_action_strength(action: StringName, exact_match: bool = false)

返回一个介于 0 和 1 之间的值,表示给定动作的强度。前者为在项目中设置的键位映射

Input为内置类,检测玩家输入输出

var y1=Input.get_action_strength("玩家1上")*5

 String num_int64(number: int, base: int = 10, capitalize_hex: bool = false)

将给定的数字 number 转换为字符串表示,进位制由 base 给定。

默认情况下 base 为十进制(10)。编程中常见的进位制还有二进制(2)、八进制  (8)、十六进制(16)。

如果 capitalize_hex 为 true,比 9 大的数位会大写。

是String内置类下的函数

text="score_two:"+String.num_int64(NewScript.score1)

后续学习


Node get_node(path: NodePath)

获取一个节点。NodePath 可以是到一个节点的相对路径(从该节点开始)或绝对路径(从 SceneTree.root 开始)。

var a=get_node("sound")#sound为子节点名字
			#等效于:get_node("sound").play();等效于$sound.play

Node get_child(idx: int, include_internal: bool = false)

通过索引获取子节点。每个子节点都有一个相对于其同级节点的索引(请参阅 get_index())。第一个子节点位于索引 0 处。负值也可用于从列表末尾开始。该方法可以与 get_child_count() 结合使用来迭代该节点的子节点。如果给定索引处不存在子节点,则该方法返回 null 并生成一个错误。

如果 include_internal 为 false,则忽略内部子节点(请参阅 add_child() 的 internal 参数)。
 

get_child(2).play()#直接调用,其余形式同上(get_node)

 Node get_parent()

返回该节点的父节点,如果该节点没有父节点,则返回 null。
使用get_node("..")也可以获取父节点,操作如下

┖╴root
    ┠╴Character(你在这里!)
    ┃  ┠╴Sword
    ┃  ┖╴Backpack
    ┃     ┖╴Dagger
    ┠╴MyGame
    ┖╴Swamp
    ┠╴Alligator
    ┠╴Mosquito
    ┖╴Goblin

使用”/“获取多级子节点
get_node("Sword")
get_node("Backpack/Dagger")
get_node("../Swamp/Alligator")#从当前节点的父节点搜索
get_node("/root/MyGame")#直接从全局根节点搜索

Array[Node] get_children(include_internal: bool = false)

返回该节点的所有子节点到一个 Array 内。即只能返回直接相连的子节点,多级不返回

如果 include_internal 为 false,则从返回的数组中排除内部子节点(见 add_child() 的 internal 参数)。

信号的连接与发射


 Error connect(signal: StringName, callable: Callable, flags: int = 0)

按名称将 signal 连接到 callable。还可以添加可选的 flags 来配置该连接的行为(请参阅 ConnectFlags 常量)。

一个信号只能连接到同一个 Callable 一次。

signal abc
func _ready() -> void:
	self.connect("abc",Callable(self,"a"))
func a(b):
	print(b)

 void disconnect(signal: StringName, callable: Callable)

按名称从给定的 callable 断开 signal。如果连接不存在,则生成一个错误。

bool is_connected(signal: StringName, callable: Callable) const

如果给定的信号名称 signal 与可调用体 callable 之间存在连接,则返回 true。

 

Error emit_signal(signal: StringName, ...)

按名称发出给定的 signal。该信号必须存在,所以它应该是该类或其继承类之一的内置信号,或者是用户定义的信号(参见 add_user_signal())。该方法支持可变数量的参数,所以参数可以以逗号分隔的列表形式传递。
 

signal abc
func _ready() -> void:
	self.connect("abc",Callable(self,"a"))
	emit_signal("abc",12)#信号若要发出,需要有对应与其链接的函数参数,否则无效
func a(b):
	print(b)

SceneTreeTimer create_timer(time_sec: float, process_always: bool = true, process_in_physics: bool = false, ignore_time_scale: bool = false)
 

返回一个新的 SceneTreeTimer。在以秒为单位的 time_sec 过去后,该计时器将发出 SceneTreeTimer.timeout 并自动释放。
 

var time=get_tree().create_timer(3)
	await time.timeout
#或者省略中间变量,不能省略timeout
await get_tree().create_timer(3).timeout
#get_tree()也是必要的,接收creat.timer()

一个对象内部的信号只属于这个对象,另一个对象b的同名信号在发射后无法触发a所绑定的方法

类,继承

在一个脚本中定义的变量另一份脚本无法直接访问,可以使用继承方式获取;

var a#在a中的变量


extends "res://new_script.gd"#父类路径,即a的路径
func _ready() -> void:
	a=10

同时可以使用类进行继承;

class_name ha#在a中开头定义类

extends ha#b中继承类

func _ready() -> void:
	a=10

super关键字

调用父节点的函数

super.method()#优先访问父节点同名函数,必须写在某个函数中

在子类中的函数调用父类同名函数;
func _ready() -> void:
	_mysuper()
func _mysuper():
	super()#或者super._mysuper()
	print("brother")

object

记录object的变量都是引用变量?

 void _init() virtual

实例化对象的脚本时调用,通常是在对象在内存中初始化之后(通过 GDScript 中的 Object.new() 或 C# 中的 new GodotObject)。也可以将其定义为接受参数的形式。该方法类似于大多数编程语言中的构造函数。

void _enter_tree() virtual

当节点进入 SceneTree 时调用(例如实例化时、场景改变时或者在脚本中调用 add_child() 后)。如果节点有子节点,则首先调用它的 _enter_tree() 回调函数,然后再调用子节点的回调函数。
 

func _init() -> void:
	print("okinit")
func _enter_tree() -> void:
	print("yestree")

void _notification(what: int) virtual
 

当对象收到通知时被调用,可以通过将 what 与常量比较来识别通知。

基类 Object 定义了一些通知(NOTIFICATION_POSTINITIALIZE 和 NOTIFICATION_PREDELETE)。Node 等继承类定义了更多通知,这些通知也由该方法接收。
 

#NOTIFICATION_POSTINITIALIZE = 0
该对象初始化时收到的通知,发生在附加脚本之前。内部使用。
# NOTIFICATION_PREDELETE = 1
该对象即将被删除时收到的通知。可以用作其他面向对象编程语言中的析构函数。
# NOTIFICATION_EXTENSION_RELOADED = 2
当对象完成热重加载时收到的通知。该通知仅针对扩展类和派生类发送。


func _ready() -> void:
	free()#调用即清除,what变1,输出;

func _notification(what: int) -> void:
	if(what==1):
		print("再见")

● void free()

在节点中,不推荐使用

#从内存中删除该对象。对该对象的预先存在的引用会变得无效,并且任何访问它们的尝试都将会产生一个运行时错误。

 void queue_free()

在空闲帧清除节点

将该节点加入队列以在当前帧末尾删除。被删除时,其所有子节点也将被删除,并且对该节点及其子节点的所有引用都将变得无效。

与 Object.free() 不同,该节点不会被立即删除,并且它在被删除前仍然可以访问。多次调用 queue_free() 也是安全的。

void set_script(script: Variant)

将脚本 script 附加至该对象,并进行实例化。因此会调用该脚本的 _init()。Script 可用于扩展对象的功能。

如果已存在脚本,则该脚本的实例会被分离,其属性值和状态会丢失。仍会保留内置属性的值

func _ready() -> void:
	var src=load("res://新脚本.gd")
	$Node.set_script(src)#附加
	$Node.a()#附加之后可以调用脚本中的函数

 Resource load(path: String, type_hint: String = "", cache_mode: CacheMode = 1)

在给定的 path 中加载资源,并将结果缓存以供进一步访问。

RefCounted

引例

可以使用   

类名.new();创建一个新的Refcounted对象

load("路径“).new();同上

load中也可放入变量代替路径

preload在脚本资源生成时就进行preload的加载,这时候变量未出现,只能以文本字符串的形式告知preload加载的内容,其余同load

class_name person
extends RefCounted

var name:String=""
var age:int=0
func _init(p_name):#创建时的构造函数,需要加参数
	name=p_name
	print(name,"出生了")
func one_year_past():
	self.age+=1
func _notification(what: int) -> void:
	if(what==1):
		print(name,"死了")
		print("终年",age , "岁")

以上是一个类代码;已经定义为全局

extends Node
var person1
func _ready() -> void:
	person1=person.new("李老四")#直接调用构造,_init函数,
	var person2=load("res://新脚本.gd").new("王二");使用路径构造
	person2.one_year_past()
#当_ready函数运行结束,person2回收,触发notifaction

	

Variant new(...) vararg

返回该脚本的一个新实例化对象。

RefCounted特征:

1:内置引用计数器,即每有一个对象创建+1,销毁-1;归0自动删除

2.不包含内置属性,轻量

另一份

  ProjectSettings

可以在类中创建全局变量

场景的实例化(加载

一个场景资源调用instantiate,将生成对应节点集合,并将这些节点的根节点作为返回值返回

使一个处于场景树下的节点运行add_child();并将新生成的根节点作为add_child参数调用,则根节点就会成为这个节点的字节点,新生成的节点也将全部加到树下
 

func _ready()
    var scene=load("路径")#加载路径
    var root=scene.instantiate()#创建实例,会返回该场景的根节点
    self.add_child(root)#加入节点。即加入场景树

在实例化前即 _init()未执行时,节点间处于独立,无法通过get_node()获取子节点

在函数外部使用@onready关键字,可将变量赋值拖延到ready执行的时刻

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值