【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球

2024-04-12 04:12

本文主要是介绍【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在第三十四节我实现了来回无限滚动的伤害铁刺球,这一节我准备实现一个圆形移动或扇形移动,并带有链条的铁球。效果如下:
请添加图片描述

一、实现原理

绕一点做圆周运动,简单的说就是: 每一帧根据旋转的角度计算出下一个位置的坐标 。因此我们需要两个数值: 旋转角度(偏移量)、距离(半径) 。这样每一帧都根据计算的坐标来更新平台的位置,实现平台绕中心点做圆周运动。这么怎么才能计算出移动的位置呢?这需要我们初中学的一些数学知识。给你一个坐标系,以原点为圆心,画一个半径为r的圆,若果我们知道圆上任意一点A的旋转角度为α,那么如何求得A点坐标呢?
请添加图片描述

初中知识,我们从A点分别向X轴,Y轴做垂线,分别交于a点和b点,我们可以得到两个直接三角形,一个是三角形Abo,一个是三角形Aao。已知条件是半径r,和旋转角度a,在直角三角形中sin等于对边比上斜边;cos等于临边比上斜边,也就是说Aa/r等于rsin(a),oa/r=cos(a),以我们可以求出ob=rsin(a),oa=rcos(a),所以A点坐标是(rcos(a),r*sin(a))。
还记得角的表示方法有两种吗?一种是角度制,一种是弧度制。在godot中常用的是角度制,也就是a的取值为0到2π,2π对应着360度。以上就是圆周运动的基础理论。
还记得角的表示方法有两种吗?一种是角度制,一种是弧度制。在godot中常用的是角度制,也就是a的取值为0到2π,2π对应着360度。以上就是圆周运动的基础理论。

二、节点配置

新建node2场景,命名为RotateBall,保存在Scenes目录文件下。为根节点添加Sprite2D节点命名为MovingSpikes,将Texture设置为为我们的链球图片。
请添加图片描述

节点结构非常简单。

三、编写代码

为根节点RotateBall添加代码,编写如下代码:

extends Node2D
@onready var moving_spikes = $MovingSpikes  #获取滚动小球
var angle_offset = 0  #旋转角度
var radius = 50  #旋转半径
var startPoin: = Vector2(0.0,0.0) #旋转中心
var line #定义line节点用来表示旋转链球的链条
@export var speed :=2.0 #旋转速度
@export var startPI = PI  #旋转开始角度
@export var EndPI = PI   #选择结束角度func _ready():angle_offset = startPI	#设置旋转角度等于初始角度moving_spikes.position = startPoin +  Vector2(cos(angle_offset) * radius,sin(angle_offset) * radius) #计算初始位置,等于旋转中心+新的位置draw_linemy(startPoin,moving_spikes.position) #画出链条#画链条,第一个参数为半径起点,第二个参数为半径中点
func draw_linemy(startpoint:Vector2,endpoind:Vector2):if not line:#判断链条是否存在,如果不存在line = Line2D.new()  #新建Line2D节点line.width=2  #链条宽度设为2line.show_behind_parent=true #设置链条在底部显示,目的是刺球挡住半径看起来更美观line.default_color = Color.DARK_SLATE_BLUE  #设置链条颜色add_child(line)	 #将连线添加到场景line.points = PackedVector2Array([startPoin, endpoind])#设置链条的长度func _physics_process(delta):rotateBall(delta) #调用链球位置#链球位置计算
func rotateBall(delta:float):if startPI==EndPI: #如果起始角度和节结束角度相等,做圆周运动angle_offset +=  delta * speed #旋转角度等于速度*时间else:#如果起始角度和结束角度不同,做钟摆运动if absf(angle_offset)>absf(EndPI) or abs(angle_offset)<absf(startPI): #如果旋转角度大于结束角度,旋转方向向相反方向旋转了speed = -1 * speedangle_offset +=  delta*speed #计算角度# 计算下一个位置moving_spikes.position = startPoin + Vector2(cos(angle_offset) * radius,sin(angle_offset) * radius) #加上旋转中心draw_linemy(startPoin,moving_spikes.position)

四、主场景调用

在主场景实例化2个RotateBall场景。
第一个场景speed设置为2,start pi设置为-0.2,end pi设置为-2.9,这样是个逆时针摇摆的链球,如果顺时针摇摆,start pi和end pi只需要设置正数即可。
请添加图片描述

第2个场景speed设置为5,start pi和end pi均设置为3.14,这样是个圆周运动的链球。
请添加图片描述

看一下预览效果:
请添加图片描述

这篇关于【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896074

相关文章

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

linux dlopen手册翻译

名称 dlclose, dlopen, dlmopen 打开和关闭一个共享对象 简介 #include <dlfcn.h>void *dlopen(const char*filename, int flags);int dlclose(void *handle);#define _GNU_SOURCE#include <dlfcn.h>void *dlmoopen(Lmid_t lm

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的通信中,多播可大大节约网络资源。假设视频服务器向 90 台主机传送同样的视频节目,单播与多播的比较如下图所示。 下图(a)是视频服务器用单播方式向 90 台主机传