【GodotV4.0-Game-Legacy Fantasy】文章内附素材(百度网盘)

简介: 【GodotV4.0-Game-Legacy Fantasy】文章内附素材(百度网盘)


player script after simple completion of map and player scenes

重力和时间差 delta 的乘积来更新 velocity 的垂直方向上的速度

Main场景的script

extends CharacterBody2D
# ProjectSettings.get("physics/2d/default_gravity") 拿到项目设置中的默认重力值
# as float 转换为浮点数
# := 是一种变量声明和赋值的操作符,通常被称为「分配运算符」或「绑定运算符」它用于在声明变量的同时为其赋值
var gravity := ProjectSettings.get("physics/2d/default_gravity") as float;
# 参数 delta 表示上一帧到这一帧所经过的时间间隔
func _physics_process(delta: float) -> void:
    # velocity 是一个表示物体速度的变量, velocity.y 是一个用于表示物体在垂直方向上的速度的属性
    # velocity.y += gravity * delta; 根据重力和时间差(delta)的乘积来更新物体在垂直方向上的速度
  velocity.y += gravity * delta;
  move_and_slide();

将项目设置中的默认重力值获取并存储到变量 gravity 中,然后在 _physics_process 函数中,根据重力和时间差 delta 的乘积来更新 velocity 的垂直方向上的速度。最后,调用 move_and_slide() 函数来应用物体的运动和滑动

添加键盘映射 并控制玩家移动以及跳跃

键盘映射,A,D,Space

extends CharacterBody2D
const RUN_SPEED := 200.0;
const JUMP_VELOCITY := -300.0;
var gravity := ProjectSettings.get("physics/2d/default_gravity") as float;
# 可以按住 CTRL + 鼠标左键选择节点,拖动到代码块中
# sprite_2d 场景图层
# animation_player 动画
@onready var sprite_2d = $Sprite2D;
@onready var animation_player = $AnimationPlayer;
func _physics_process(delta: float) -> void:
    # Input.get_axis() 是一个用于获取输入轴值的方法,接收一个或多个参数,若你原地不动则一直是0,若向左走,则为 -1, 向右走则为 1
  var direction := Input.get_axis("move_left", "move_right");
    # 根据移动方向和一个预设的运行速度,设置角色在水平方向上的速度
  velocity.x = direction * RUN_SPEED;
  velocity.y += gravity * delta;
    # is_on_floor() 是个判断玩家是否站在地板上的API
  # Input.is_action_just_pressed("jump"): 检测是否触发了 "jump" 动作
  if is_on_floor() and Input.is_action_just_pressed("jump"):
        # 若当前角色在地板上,也正常触发了 Space键 则角色会向上以给定的垂直速度进行跳跃
    velocity.y = JUMP_VELOCITY;
  if is_on_floor():
        # 若玩家在地板上,且移动方向为0时,播放站立动画
        # is_zero_approx() 是一个用于近似比较浮点数是否接近于零的方法
    if is_zero_approx(direction):
      animation_player.play("idle");
        # 若玩家在地板上,且移动方向不为0时,播放跑动动画
    else:
      animation_player.play("running");
    # 若玩家不在地板上,播放跳跃动画
  else:
    animation_player.play("jump");
    # 若移动方向不为0时
  if not is_zero_approx(direction):
        # sprite_2d.flip_h 控制水平翻转
        # 当移动方向值小于0时,水平翻转,大于零时,则不进行水平翻转
        # sprite_2d.flip_h = true \ false;
    sprite_2d.flip_h = direction < 0;
  move_and_slide();

为玩家添加 Camera2D(摄像机) 节点, 并设置摄像机的垂直以及水平的交互

Player 节点添加子节点 Camera2D,并设置节点的 Drag 内的 Horizontal_Enabled 属性以及 Vertical_EnabledDisabled

如果horizontal_enabled被启用(true),相机仅在达到水平(左及右)拖动边

距时才移动,如果为 false,相机会垂直移动而不管边距

vertical_enabled启用(true)时,相机仅在达到垂直(顶部及底部)拖动边

距时才移动,如果为 false,相机会垂直移动而不管边距

Camera2DEditor 属性内可以勾选 Draw_Drag_Margin 属性,来在 2D 预览面板查看水平以及垂直拖动的限制距离,四个值分别为百分比,0表示摄像机中心点位置,1表示摄像机边缘位置

Camera2DDrag 属性内可以修改 Left\Right\Top\Bottom 属性,修改摄像机水平垂直限制拖动的距离

Position_Smoothing 属性设置为 True,则相机会进行位置平滑,好处是不会显得死板

使相机节点触碰到场景边缘时停下来

Limit 属性,可修改摄像机最边缘停止的位置,比如地板底部边缘,当玩家下落时并不会看到地图外侧,Limit 属性内启用 Smoothed 可以在玩家下落时,不僵硬的使摄像机方向边缘平滑的移动到限制距离

手动计算你可以使用 xy 坐标轴辅助线来进行测量

每次这样手动计算都会很麻烦,可以进行计算

World 根节点添加一个 script

extends Node2D
@onready var tile_map: TileMap = $TileMap
@onready var camera_2d: Camera2D = $Player/Camera2D
func _ready() -> void:
  # 场景初始化,先拿到们在 tilemap 上占用了多大范围
  # tile_map.get_used_rect() 是一个用于获取 TileMap(瓷砖地图)中已使用的矩形区域的方法
  # used 返回 [P: (-5, 5), S: (47, 9)], [左上角坐标,右上角坐标]
  var used := tile_map.get_used_rect();
  # tile_map.tile_set.tile_size是一个属性,用于获取TileMap(瓷砖地图)所使用的瓷砖集合(TileSet)中每个瓷砖的尺寸
  # tile_set是一个包含所有可用瓷砖的集合,而tile_size是其中的一个属性,表示每个瓷砖的尺寸,该属性返回的是一个二维向量(Vector2),其中x表示瓷砖的宽度,y表示瓷砖的高度
  # 下面这个写法是拿到一个图块的大小
  var tile_size := tile_map.tile_set.tile_size;
  # 算出上下左右的边距
  camera_2d.limit_top = used.position.y * tile_size.y;
  camera_2d.limit_right = used.end.x * tile_size.x;
  camera_2d.limit_bottom = used.end.y * tile_size.y;
  camera_2d.limit_left = used.position.x * tile_size.x;
  print(used.position, used.end)

图层问题以及地形(简)

使地图边缘隐藏(缩小边缘可见度)

extends Node2D
@onready var tile_map: TileMap = $TileMap
@onready var camera_2d: Camera2D = $Player/Camera2D
func _ready() -> void:
  # tile_map.get_used_rect().grow(-1) 对该矩形区域进行缩小操作
  var used := tile_map.get_used_rect().grow(-1);
  var tile_size := tile_map.tile_set.tile_size;
  camera_2d.limit_top = used.position.y * tile_size.y;
  camera_2d.limit_right = used.end.x * tile_size.x;
  camera_2d.limit_bottom = used.end.y * tile_size.y;
  camera_2d.limit_left = used.position.x * tile_size.x;
  camera_2d.reset_smoothing();

截至目前预览DEMO

链接

提取码:0621

相关文章
|
5月前
|
关系型数据库 MySQL 数据库
《深入探讨XGBoost与MySQL数据交互:细节与洞察》
在数据驱动时代,XGBoost与MySQL的数据交互至关重要。本文探讨了两者结合时的多个关键点:**数据格式适配**(如文本编码、日期处理)、**性能考量**(分批读取、索引优化)、**数据一致性与完整性**(事务管理、异常回滚)、**数据安全与权限管理**(授权访问、加密传输)、**数据更新与实时性**(触发器或轮询机制)以及**连接管理与稳定性**(连接池技术、重试机制)。全面处理这些方面,可实现高效、稳定且安全的数据交互,为数据分析和机器学习提供可靠支持。
131 28
|
Python
【Python】 已解决:NameError: name ‘python‘ is not defined
【Python】 已解决:NameError: name ‘python‘ is not defined
1843 8
|
5月前
|
消息中间件 Java Kafka
Spring Boot整合kafka
本文简要记录了Spring Boot与Kafka的整合过程。首先通过Docker搭建Kafka环境,包括Zookeeper和Kafka服务的配置文件。接着引入Spring Kafka依赖,并在`application.properties`中配置生产者和消费者参数。随后创建Kafka配置类,定义Topic及重试机制。最后实现生产者发送消息和消费者监听消息的功能,支持手动ACK确认。此方案适用于快速构建基于Spring Boot的Kafka消息系统。
1043 7
|
9月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
2139 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
消息中间件 存储 Ubuntu
Linux安装kafka3.5.1
Linux安装kafka3.5.1
369 2
|
缓存 搜索推荐 网络安全
Google Hacking
Google Hacking,也称为Google Dorking,是一种利用Google搜索引擎和其高级搜索技术来查找安全漏洞、敏感信息或用于渗透测试的特定数据的技术。
245 11
|
Web App开发 JavaScript 前端开发
深入理解Playwright的高级功能和用法
Playwright是一个强大而灵活的Python库,用于自动化浏览器操作和测试。它提供了一套简洁、直观的API,使得编写可靠、可扩展的浏览器自动化脚本变得非常容易。无论是模拟用户交互、抓取网页数据还是进行端到端的Web应用程序测试,Playwright都是一个值得信赖的选择。 Playwright支持多种浏览器,包括Chrome、Firefox和WebKit(Safari)。这意味着您可以根据需要选择合适的浏览器来运行自动化脚本。Playwright还提供了跨浏览器的一致性保证,这意味着您可以在不同的浏览器上运行相同的脚本,并获得相似的结果。
|
定位技术 API 开发者
【Godot引擎开发】简单基础,外加一个小游戏DEMO
【Godot引擎开发】简单基础,外加一个小游戏DEMO
436 0
|
Linux Docker 容器
更改docker容器中的时间而不影响宿主机
更改docker容器中的时间而不影响宿主机
|
前端开发 JavaScript
react的类组件和函数式组件有什么区别
react的类组件和函数式组件有什么区别
279 0