1972 GODOT 入门案例

1972 GODOT 入门案例

第一章 项目介绍

第01节 游戏项目界面

第一个界面

第二个界面

第02节 代码文件结构

第二章 小球场景

第01节 创建节点

1、创建文件夹
复制代码
位置:
	在左下角文件区域(文件区域)

操作:
	1、创建一个文件夹
	2、将当前的小球场景所有内容保存在文件夹中。
	
名称:
	小球场景
2、父节点
复制代码
节点类型
	Area2D
	
原因:
	可以进行区域的检测,判断区域内节点。
3、一级子节点
复制代码
节点类型
	CollisionShape2D
	
原因:
	区域检测

需要调整属性:

​ 圆形检测区间

4、一级子节点
复制代码
节点类型
	Sprite2D
	
原因:
	添加图片信息

需要调整属性:

​ 1、将小球的图片,添加到 Texture 属性上

​ 2、调整小球和碰撞区域,保证两者重合

第02节 根节点脚本

1、创建脚本
复制代码
位置:
	在根节点(父节点位置)

操作:
	创建一个脚本
2、代码思路
复制代码
1、需要让小球 动起来
2、定义变量 记录小球移动的效果
3、小球飞出墙外的时候, 需要回归到初始位置
4、添加一个碰撞的标记, 用于记录小球碰撞的操作
5、计分系统中, 移出界面, 对应的全局变量加分操作
3、完整代码
ini 复制代码
extends Area2D

# 定义变量, 记录小球移动效果 二维向量类型 X轴和Y轴
var vec:Vector2 = Vector2(5, 5)

# 定义变量, 记录小球的初始位置
var init_position

# ready虚函数会在所有节点, 加入场景节点后, 被调用。
# 当一个场景的根节点ready被调用时, 说明这个场景的所有节点, 都加入到游戏
# 一句话概括就是 所有场景都已经准备就绪
func _ready() -> void:
	# 记录小球的初始位置
	init_position = position
	# 添加一个碰撞的标记, 用于记录小球碰撞的操作
	self.add_to_group("Ball")
	pass


# 重置到初始位置
func reset():
	position = init_position
	# 这里在判断计分的操作
	# 如果小球向右移动, 超出边界, 则玩家1得1分, 如果小球向左移动, 超出边界, 则玩家2得1分
	if vec.x > 0:
		CountScore.score1 = CountScore.score1 + 1
	else:
		CountScore.score2 = CountScore.score2 + 1
	pass

# 每帧都会调用。'delta'表示自上一帧以来经过的时间。
func _process(delta: float) -> void:
	self.position = self.position + vec
	pass

第三章 地图场景

第01节 创建节点

1、创建文件夹
复制代码
位置:
	在左下角文件区域(文件区域)

操作:
	1、创建一个文件夹
	2、将当前的地图场景所有内容保存在文件夹中。
	
名称:
	地图场景
2、父节点
复制代码
节点类型
	Node
	
原因:
	所有节点的父节点
3、一级子节点
复制代码
节点类型
	ColorRect
	
原因:
	可以作为地图的底部颜色

需要调整属性:

​ 1、调整地图的颜色,通过调色板调色

​ 2、调整位置,在 Transform 中可以调整 Size 大小覆盖整个屏幕(默认: 宽度 1152 高度 648)

4、一级子节点
复制代码
节点类型
	Sprite2D
	
原因:
	可以添加图片, 目的是为了添加中间的分割线。

需要调整属性:

​ 1、将分割线的图片,添加到 Texture 属性上

​ 2、调整位置,在 Transform 中可以调整 Position 其中 X轴位置是 576 就可以调整到中间

​ 3、快捷栏中,点击缩放模式(快捷键 S)可以调整节点的大小

5、一级子节点
复制代码
节点类型
	Area2D
	
原因:
	1、构建左右墙壁, 准备添加一些碰撞等相关的效果
	2、构建上下墙壁, 准备添加一些碰撞等相关的效果
	
快捷键
	Ctrl + D 可以快速复制节点
	
注意:
	左边是一个一级子节点
	右边是一个一级子节点
	上边是一个一级子节点
	下边是一个一级子节点
5.1 二级子节点
复制代码
节点类型
	CollisionShape2D
	
原因:
	准备碰撞效果实现

需要调整属性:

​ 1、将形状 shape,调整为矩形 recta

​ 2、拖拽2D界面中的矩形大小,覆盖到左侧整个墙壁

第02节 墙壁脚本

1、创建脚本
复制代码
位置:
	在墙壁节点(子节点位置)

操作:
	创建一个脚本
2、代码思路

左右墙壁的构建思路

复制代码
1、需要使用 物理引擎的刷新回调方法
2、检测碰撞的区域返回所有的 Area2D 数组
3、获取到数组中所有的 Area2D 的元素
4、判断发生碰撞的 Area2D 元素是否是小球(小球的标识)
5、如果是小球, 那么需要重置小球位置

上下墙壁的构建思路

复制代码
1、需要使用 物理引擎的刷新回调方法
2、检测碰撞的区域返回所有的 Area2D 数组
3、获取到数组中所有的 Area2D 的元素
4、判断发生碰撞的 Area2D 元素是否是小球(小球的标识)
5、如果是小球, 那么需要调整 Y轴的位置
3、完整代码

左右墙壁的完整脚本代码

ini 复制代码
extends Area2D	
	
# 物理引擎每刷新一次, 就会执行一次
func _physics_process(delta: float) -> void:
	# 函数 get_overlapping_areas 是Area2D的内置函数, 返回的是一个数组, 类型是 Area2D
	# 可以使用 for 来遍历数组, 逐个对 i 进行判断, 判断 i 是否为小球。(需要在小球中, 添加一个判断的标志)
	# 检测碰撞的区域
	for i in get_overlapping_areas():
		# 查看小球是否在碰撞的场景中
		if i.is_in_group("Ball"):
			# 这里的 i 是小球, 运行小球内部的 reset 函数
			i.reset()
		pass 
	pass

上下墙壁的完整脚本代码

ini 复制代码
extends Area2D

# 构建一个变量, 可以外部进行控制移动的值
@export var y = -5


# 物理引擎每刷新一次, 就会执行一次
func _physics_process(delta: float) -> void:
	# 函数 get_overlapping_areas 是Area2D的内置函数, 返回的是一个数组, 类型是 Area2D
	# 可以使用 for 来遍历数组, 逐个对 i 进行判断, 判断 i 是否为小球。(需要在小球中, 添加一个判断的标志)
	# 检测碰撞的区域
    for i in get_overlapping_areas():
    	# 查看小球是否在碰撞的场景中
        if i.is_in_group("Ball"):
        	# 这里的 i 是小球,  i.vec.y 表示小球的Y轴坐标
        	# 意思是将小球的Y轴坐标, 赋值给外部变量 y
            i.vec.y=y

第03节 其他操作

1、加载脚本
复制代码
1、原因:
	左右两个墙壁,都是子节点,都具备有碰撞的功能,两者都是同一套脚本检测功能。
	
2、操作:
	可以在右侧的脚本中,【加载】左侧的脚本。
2、装载场景
复制代码
1、原因:
	小球需要在地图的场景里面运行, 两个场景是存在关联关系的。 【关联】
	
2、操作:
	将小球场景关联到地图场景中
	A、需要点击地图场景的根节点, Node 节点
	B、选择 Instantiate Child Scene 添加子场景
	C、关联到 小球的场景, 点击打开
	D、自己调整小球的位置
3、外部变量
复制代码
1、原因:
	小球的上下墙体碰撞过程中, 因为 Y轴的修改值, 可能会随着上下墙体的不同而产生变化。
	A、如果小球碰撞的是上墙体,  Y轴需要修改变量为正值
	B、如果小球碰撞的是下墙体,  Y轴需要修改变量为负值
	
2、操作:
	A、在脚本当中定义的变量格式:
		@export var y = 5
	B、鼠标点击左侧节点, 在属性区域, 可以看到 Area2D的变量 Y 值

第四章 积分场景

第01节 创建节点

1、创建文件夹
复制代码
位置:
	在左下角文件区域(文件区域)

操作:
	1、创建一个文件夹
	2、将当前的积分场景所有保存在文件夹中。
	
名称:
	积分场景
2、父节点
复制代码
节点类型
	Node
	
原因:
	所有节点的父节点
3、一级子节点
复制代码
节点类型
	Label
	
原因:
	显示玩家1的得分数据
	显示玩家2的得分数据

第02节 相关点脚本

1、创建脚本
复制代码
位置:
	A. 在根节点(父节点位置)
	B. 子节点 Label1 
	C. 子节点 Label2

操作:
	A. 创建一个脚本 全局积分
	B. 创建一个脚本 子节点 Label 得分
	C. 创建一个脚本 子节点 Label 得分
2、代码思路
复制代码
全局变量:
	1、需要定义全局的变量
	2、全局记录两个玩家的分数
	
积分Label
	1、玩家1的 Label 获取全局变量, 积分
	2、玩家2的 Label 获取全局变量, 积分
3、完整代码

全局变量

ini 复制代码
extends Node

# 定义两个变量, 分别用于表示玩家1和玩家2的分数
var score1 :int = 0
var score2 :int = 0

玩家积分

ini 复制代码
extends Label

# 每次刷新的时候, 都需要执行这段代码
func _process(delta: float) -> void:
	text = "PLAYER_1 得分: " + String.num_int64(CountScore.score1)
	pass
4、全局变量
复制代码
操作步骤:
	1、 菜单栏中, 找到 【项目】 打开 【项目设置】
	2、 在项目设置的 Autoload 选项卡里面
	3、 找到脚本的路径(指向 xxxx.gd 脚本文件)
	4、 点击右侧的【添加】按钮

第五章 玩家场景

第01节 创建节点

1、创建文件夹
复制代码
位置:
	在左下角文件区域(文件区域)

操作:
	1、创建一个文件夹
	2、将当前的玩家所有内容保存在文件夹中。
	
名称:
	玩家场景
	
因为存在两个不同的玩家,所以针对不同的玩家, 创建不同的场景。
意思是在玩家场景的文件夹中, 分别创建 玩家1 和 玩家2 两个文件夹。
2、父节点
复制代码
节点类型
	Area2D
	
原因:
	可以进行区域的检测,判断区域内节点。
3、一级子节点
复制代码
节点类型
	CollisionShape2D
	
原因:
	区域检测

需要调整属性:

​ 矩形检测区间

4、一级子节点
复制代码
节点类型
	Sprite2D
	
原因:
	可以添加图片, 目的是为了添加球拍

需要调整属性:

​ 1、将球拍的图片,添加到 Texture 属性上

​ 2、在 2D界面中,对位置进行调整

第02节 相关点脚本

1、创建脚本
复制代码
位置:
	在根节点(父节点位置) 

操作:
	反弹小球的代码实现
2、代码思路
复制代码
1、碰撞逻辑, 玩家和球的碰撞监控做反弹操作
2、监控移动器, 移动坐标位置变换
3、预防移动的边界点, 在合理的移动范围
3、完整代码

玩家1的脚本

ini 复制代码
extends Area2D

# 物理引擎每次刷新的时候, 执行这段代码
func _physics_process(delta: float) -> void:
	# 反弹小球的代码
	for i in get_overlapping_areas():
		if i.is_in_group("Ball"):
			i.vec.x = 5
	# 移动控制的代码实现
	# 监控按键方向
	var move_up = Input.get_action_strength("player1up")*5
	var move_down = Input.get_action_strength("player1down")*5
	# 记录玩家移动之后的Y轴坐标
	var new_y = position.y - move_up + move_down
	# 在地图场景中, 合理的范围内移动, 预防移出屏幕了。可以通过 print(new_y) 查看移动的点
	if new_y>-25 && new_y<400:
			position.y = new_y

玩家2的脚本

ini 复制代码
extends Area2D

# 物理引擎每次刷新的时候, 执行这段代码
func _physics_process(delta: float) -> void:
	# 反弹小球的代码
	for i in get_overlapping_areas():
		if i.is_in_group("Ball"):
			i.vec.x = -5
	# 移动控制的代码实现
	# 监控按键方向
	var move_up = Input.get_action_strength("player2up")*5
	var move_down = Input.get_action_strength("player2down")*5
	# 记录玩家移动之后的Y轴坐标
	var new_y = position.y - move_up + move_down
	# 在地图场景中, 合理的范围内移动, 预防移出屏幕了。可以通过 print(new_y) 查看移动的点
	if new_y>-25 && new_y<400:
			position.y = new_y

第03节 其他操作

1、键位映射
复制代码
1、原因:
	通过操作按键, 控制游戏程序。
	通过键盘的操作, 能够控制游戏的进行。
	
2、操作:
	A、在菜单栏上面, 找到【项目】其中的 【项目设置】找到 【键位映射】
	B、在 Add New Action... 中编写键位映射的名称
	C、在 后面加号, 添加键位映射的值 (例如: 物理按键W、物理按键S)
2、导出项目
复制代码
1、原因:
	当前的操作, 仅仅在 GODOT 编辑器当中
	需要将内容, 导出到对应的平台上运行
	例如: windows  macos  android  ios 等
	
2、操作:
	A、在菜单栏上面, 找到【项目】 选择 【导出】
	B、在导出弹窗中, 选择【添加】 找到需要导出的平台, 例如: Windows Desktop
	C、管理导出模板中, 添加需要导出的模板, 如果没有则需要下载
	D、选择导出路径, 直接导出即可。
相关推荐
乂爻yiyao2 小时前
HotSpot 内存区域详解
java·jvm
独自破碎E2 小时前
【双指针】反转字符串
java·开发语言
时艰.2 小时前
JVM 垃圾收集器ParNew&CMS与三色标记算法
java·jvm·算法
百***07452 小时前
小米MiMo-V2-Flash深度解析:国产开源大模型标杆+一步API接入全指南
java·大数据·开源·php
信也科技布道师2 小时前
基石Redis实例自动化调度之路
java·开发语言·redis·自动化
666HZ6662 小时前
程序设计竞赛java
java·开发语言
coder6162 小时前
如何监控数据表中的新记录并自动推送到企业微信群,同时在企业微信中发起处理流程?
java·服务器·企业微信
三不原则2 小时前
AIOps 技术架构全景:数据采集→分析→自动化执行全流程
java·架构·自动化