[GodotDL C# D2]从空格控制转弯到撞墙检测

news/2024/9/22 13:22:43

书接上回:https://www.cnblogs.com/meny233/p/18250399
新增功能:
空格控制转弯
导出变量
撞墙检测
音乐播放
前戏
image

点击查看代码
using Godot;
using System;public partial class Line : CharacterBody3D
{[Export]public float Speed = 10f;[Export]public bool turn = false;[Export]public bool alive = true;[Export]public bool start = false;[Export]public MeshInstance3D tail;[Export]public AudioStreamPlayer song;[Export]public AudioStreamPlayer die;public override void _PhysicsProcess(double delta){Vector3 velocity = Velocity;if (alive){if (!IsOnFloor()){velocity += GetGravity() * (float)delta;}if (Input.IsActionJustPressed("ui_accept")){if (!start){start = true;song.Play();}turn = !turn;}if (start){if (turn){velocity.X = 0;velocity.Z = Speed;}else{velocity.Z = 0;velocity.X = Speed;}}if (IsOnWall()){alive = false;die.Play();song.Stop();}}Velocity = velocity;MoveAndSlide();MakeTail();}public void MakeTail(){//Soon}
}

参考
https://space.bilibili.com/508557497

点击查看代码
extends CharacterBody3Dvar gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
var lastonfloor:bool = true
var song_time:float = 0@onready var last_linetail:MeshInstance3D = $MeshInstance3D2
@onready var fallpar:CPUParticles3D = $CPUParticles3D
@onready var body:MeshInstance3D = $MeshInstance3D
@onready var song:AudioStreamPlayer = $AudioStreamPlayer
@onready var playing_ui = $CanvasLayer/playing
@onready var end_ui = $CanvasLayer/end
@onready var start = $CanvasLayer/start
#@onready var start_ui = $start
signal go_dead
var turn:String = ''
var timeLine:Array
#@export_file('*.json') var chart_file:Stringfunc _ready():body.scale = Lineinfo.scalelast_linetail.scale = Lineinfo.scaleplaying_ui.visible = falseend_ui.visible = falsestart.connect("startgame", Callable(self, "_start"))Lineinfo.connect('turn_main_line', Callable(self, 'turn_line'))Lineinfo.connect('jump_line', Callable(self, 'jump'))Lineinfo.connect("change_auto", Callable(self, "do_auto_play"))turn = Lineinfo.turndo_auto_play()Levelinfo.song_time = 0func do_auto_play():if Lineinfo.auto_play:load_autoplay()else:timeLine = []func load_autoplay():var chart := FileAccess.open(Levelinfo.chart_file, FileAccess.READ)if not chart:returnvar json := chart.get_as_text()var roadInfo:Dictionary = JSON.parse_string(json)timeLine = []while (roadInfo.note.size() > 1):var a_note:Array = roadInfo.note[0].beatvar bpm:float = roadInfo.time[0].bpmtimeLine.push_back((a_note[0]*60/bpm)+(60/bpm/4*(a_note[1]+1)))roadInfo.note.remove_at(0)func jump():velocity.y += Lineinfo.jump_velocityfunc _physics_process(delta):if Lineinfo.auto_play and timeLine.size() > 0:if Levelinfo.song_time >= timeLine[0]:turn_line()timeLine.remove_at(0)if not Lineinfo.auto_play:turn = Lineinfo.turnif Lineinfo.can_fall:if not is_on_floor():velocity.y -= gravity * deltalastonfloor = falseelse:if not lastonfloor:var fall:CPUParticles3D = fallpar.duplicate()add_child(fall)fall.top_level = truefall.position = global_positionfall.emitting = truelastonfloor = truemake_line()move_and_slide()if is_on_wall():go_die()var SPEED:float = Lineinfo.speedif Levelinfo.started and not Lineinfo.dead and Lineinfo.can_move:if turn == 'left':position.x += delta * -SPEEDif is_on_floor() or not Lineinfo.can_fall:last_linetail.scale.x += delta *SPEEDif last_linetail.top_level:last_linetail.position.x += delta * -SPEED/2else:last_linetail.position.x += delta * SPEED/2elif turn == 'up':position.z += delta * -SPEEDif is_on_floor() or not Lineinfo.can_fall:last_linetail.scale.z += delta * SPEEDif last_linetail.top_level:last_linetail.position.z += delta * -SPEED/2else:last_linetail.position.z += delta * SPEED/2elif turn == 'down':position.z += delta * SPEEDif is_on_floor() or not Lineinfo.can_fall:last_linetail.scale.z += delta * SPEEDif last_linetail.top_level:last_linetail.position.z += delta * SPEED/2else:last_linetail.position.z += delta * -SPEED/2elif turn == 'right':position.x += delta * SPEEDif is_on_floor() or not Lineinfo.can_fall:last_linetail.scale.x += delta *SPEEDif last_linetail.top_level:last_linetail.position.x += delta * SPEED/2else:last_linetail.position.x += delta * -SPEED/2Lineinfo.moving = trueelse:Lineinfo.moving = falseif Input.is_action_just_pressed("play"):turn_line()if song.playing:song_time += deltaLevelinfo.song_time = song_timeLevelinfo.song_percent = int(song_time / (song.stream.get_length() - 40) *100)func go_die():if not Lineinfo.dead:song.stop()$AudioStreamPlayer2.play()$CPUParticles3D2.emitting = trueend_ui.visible = trueplaying_ui.visible = falseLineinfo.dead = truefunc _input(event):if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT and (is_on_floor() or not Lineinfo.can_fall) and not Lineinfo.dead and Lineinfo.can_control:if Lineinfo.auto_play and Levelinfo.started:returnturn_line()func _start():start.visible = falsefunc turn_line():if not start.visible:if not Levelinfo.started:Levelinfo.started = truevar offset:float = Levelinfo.offsetif offset > 0:var tween = create_tween()tween.tween_interval(offset/1000)tween.tween_callback(playsong)elif offset <= 0:song.play()song.seek(-offset/1000)#song_time += offset/1000playing_ui.visible = truereturnif Lineinfo.next_turn != '':Lineinfo.turn = Lineinfo.next_turnLineinfo.next_turn = ''else:if Lineinfo.auto_play:if turn == 'left':turn = 'up'elif turn == 'up':turn = 'left'elif turn == 'down':turn = 'right'elif turn == 'right':turn = 'down'else:	if Lineinfo.turn == 'left':Lineinfo.turn = 'up'elif Lineinfo.turn == 'up':Lineinfo.turn = 'left'elif Lineinfo.turn == 'down':Lineinfo.turn = 'right'elif Lineinfo.turn == 'right':Lineinfo.turn = 'down'make_line()func playsong():song.play()func make_line():last_linetail.top_level = truevar linetail:MeshInstance3D = $MeshInstance3D2.duplicate()linetail.position = body.positionlinetail.scale = body.scalelast_linetail = linetailadd_child(linetail)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

设计模式-观察者模式

观察者模式 观察者模式(Observer Pattern),又叫发布-订阅(Publisher/Subscribe)模式,模型-视图模式,源-监听器模式或从属者模式。定义一种一对多的依赖关系,一个主题对象可以同时被多个监听者同时监听,使得每当主题对象状态发生变化时,所有依赖于它的对象都会得到通知…

王鼎杯 RCE命令執行 五字節限制

源碼: <?php error_reporting(0); highlight_file(__FILE__); if(strlen($_GET[cmd])<=5 && !preg_match(/rm/,$_GET[cmd])) {echo shell_exec($_GET[cmd]); } ?>对cmd限制长度五字节起初是想通过变量来绕过五字节 但好像不起作用 于是尝试使用 常规做法通…

C - Tile Distance 2

C - Tile Distance 2 https://atcoder.jp/contests/abc359/tasks/abc359_c思路 在x方向上,让s<t 然后 如果s在tile的左边,移动到右边, 如果t在tile的右边,移动到左边, 计算x 和 y方便的必走的steps, y方向上容易计算(跨的格子就是), x方向有些复杂, s在x方向上,…

一、系统学习微服务遇到的问题集合

1、启动了nacos服务,没有在注册列表 应该是版本问题 Alibaba-nacos版本 nacos-文档 Spring Cloud Alibaba-中文 Spring-Cloud-Alibaba-英文 Spring-Cloud-Gateway 写的很好的一篇文章在Spring initial上面配置 start.aliyun.com 重新下载 < 2、 No Feign Client for loadBa…

数组和链表-《算法图解》学习

内存工作原理 需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存 储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它 们的差别很重要。接下来介绍数组和链表以及它们的优缺点。==============to be con…

爬取同样内容,xpath方法会比bs4要慢很多吗?

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【沐子山树】问了一个Python网络爬虫的问题,问题如下:爬取同样内容,xpath方法会比bs4要慢很多吗? 二、实现过程 这里【Kimi】给了个思路如下: 爬取网页内容时,使用XPath和BeautifulSoup(bs4)这两种方法的…

FPGA学习网站推荐

FPGA学习网站推荐 本文首发于公众号:FPGA开源工坊 引言 FPGA的学习主要分为以下两部分语法 领域内知识做FPGA开发肯定要首先去学习相应的编程语言,FPGA开发目前在国内采用最多的就是使用Verilog做开发,其次还有一些遗留下来的项目会采用VHDL做开发,现在有一部分公司也开始使…

UaG论文阅读笔记

User-as-Graph: User Modeling with Heterogeneous Graph Pooling for News Recommendation论文阅读笔记 Abstract 现存的问题 ​ 现有的新闻推荐方法通常通过顺序模型或关注模型从用户行为中建立用户兴趣模型。然而,它们无法对用户行为之间的丰富关联性进行建模,而这种关联性…