Godot实用代码1000例

2023-05-16

关于

这是《Godot实用代码1000例》的CSDN博客版本(之前是PPT版本),将收录笔者自己探索和学习的一些简单Godot编程案例。

文章目录

  • 关于
    • 原版开篇的废话
    • 适合哪些人群
    • 建议
    • 前置知识
  • 基础的移动、旋转操作
    • 图标跟随鼠标移动
    • 图标跟随鼠标旋转(1)
    • 图标跟随鼠标旋转(2)
    • rotation、rotation_degrees、rotate()
      • Node2D的rotate()方法
      • Vector2有一个rotated()方法,注意区分
    • 图标不断自转
      • @GDScript
    • 一个图标围绕另一个为中心旋转
      • 向量加减法
        • 加法
        • 减法
      • 与(b-a)相关的几个Vector2方法和写法
        • b.angle_to_point(a) = (b-a).angle()
        • a.direction_to(b) = (b-a).normalized() = (b-a)/(b-a).length()
    • 一个不断旋转的炮塔
      • 炮筒随鼠标位置围绕炮身移动
  • RTS相关
    • 实现图标在两个位置点循环往复移动(RTS巡逻)
    • 简单的建筑物集结点设置和造兵
    • 简单的无限制放置建筑物
    • 基于Tilemap的基础地图编辑
    • 基于Tilemap的基础地图编辑(多图块编辑)
      • AtlasTexture的引入
    • 获取TileMap的TileSet,以及其中的Tile的ID
    • 点击物体进行拖放
  • 视图操作
    • 简单的鼠标滚轮缩放视图
    • 鼠标左键拖动视图
    • Ctrl+鼠标滚轮旋转视图

原版开篇的废话

Godot最新的官方文档已经实现API中文化,这是一个很好的时机去进行再次深入的学习。Godot依然缺乏或系统或循序渐进的基础教程,而我们即将迎来2022——新的一年。
笔者认为模仿式学习和探索式学习结合是自学Godot的最佳方式。

  • 模仿式学习:抄写代码、跟做实例
  • 探索式学习:查API、查文档,探索可能性

学习是一个很主观的事情,尤其是自学。自学要持久,兴趣是第一要素。自学要循序渐进,更要厚积薄发。
在基础阶段进行模仿,在进阶阶段开始探索。 Godot实用代码1000例就是基于让初学者在基础阶段模仿为目的而创建的,当然越到后面的例子可能会越具有一些复杂性,这也会促使学习者不断进步。笔者自身也是Godot的万千新人学习者之一,经历了将近一年半的学习,并且编写有自己的插件和几份笔记文档,在B站也发过几个系列视频。本文档就来自于2022年初,其中大多数例子是自己随着自己兴趣写的。当然也参照和吸纳了不少官方文档,以及视频、文章以及Godoter群友们的优秀实例和代码。本文档会尽量参照官方文档给与的准确定义和示例,并且会引用笔者之前总结的文档中的内容。
本文档将以开放形式分享,任何Godoter爱好者、学习者都可以自由使用。
后期会创建word和pdf版本,链接也会放出来,供大家离线查看和使用。

适合哪些人群

  • 本教程中的内容跨度会比较大,案例的复杂度不一。
  • 但是会尽量在贴出操作过程和代码的同时,解释关键知识点。
  • 因此,本教程适合懂一些Godot基础和有一些Gdscript编程经验的Godot爱好者

建议

  • 建议基础入门的童鞋可以按内容顺序由上到下,由简入繁的学习,并且关注于对基础操作和知识点的掌握和理解
  • 建议基础扎实的童鞋略过简单事例,通过目录检索直奔主题,去了解你感兴趣的,而不是乏味的重复

前置知识

  • Godot是什么?能做什么?
  • Godot基础的界面操作和基础的Gdscript使用如:节点的引用、变量申明、基础的数据类型,节点类型等。
  • 任何编程经验都是有益的,任何其他游戏引擎使用和游戏编写经验也是有用的

基础的移动、旋转操作

图标跟随鼠标移动

本例实现一个Sprite跟随鼠标移动的效果。

extends Node2D

onready var icon = $icon

func _process(delta):
	icon.position = get_global_mouse_position()

图标跟随鼠标旋转(1)

extends Node2D

onready var icon = $icon

func _process(delta):
	icon.look_at(get_global_mouse_position())

图标跟随鼠标旋转(2)

根据之前的知识点,我们通过Sprite的rotation属性来实现一个与内置look_at()方法一样的效果:

extends Node2D

onready var icon = $icon

func _process(delta):
	icon.rotation =  get_global_mouse_position().angle_to_point(icon.position)
extends Node2D

onready var icon =$icon
func _process(delta):
	icon.rotation= icon.position.direction_to(get_global_mouse_position())angle()
extends Node2D

onready var icon = $icon
func _process(delta):
	icon.rotation= (get_global_mouse_position()-icon.position).angle()

可以看到我们可以不止有一种写法,但是无论如何,我们其实都是在使用Vector2提供的方法.而且笔者采用了又臭又长的写法,通过简单的变量定义和引用,代码将变得更加清晰易懂。
在这里插入图片描述

rotation、rotation_degrees、rotate()

除了使用rotation属性之外,还可以使用姊妹属性rotation_degrees,两者都代表2D节点相对于自己的初始朝向(水平向右)旋转的角度,逆时针为负数,顺时针为正数,只不过两者采用的单位不一样,rotation属性以弧度为单位,rotation_degrees以度为单位

Node2D的rotate()方法

在这里插入图片描述

Vector2有一个rotated()方法,注意区分

在这里插入图片描述
在这里插入图片描述

图标不断自转

依然是旋转,不过这次我们让Sprite不断的自转

extends Node2D

onready var icon = $icon

func _process(delta):
	icon.rotate(degzrad(10))

这里我们用到了Node2D自身的rotate方法,并且为了直观,采用度数,并用GDS内置函数deg2rad()将度数转化为弧度。

等价写法:

extends Node2D

onready var icon =  $icon

func _process(delta):
	icon.rotation += deg2rad(10)

@GDScript

在这里插入图片描述
在这里插入图片描述

一个图标围绕另一个为中心旋转

这是利用偏移的方法

extends Node2D

onready var icon =  $icon
onready var icon2 = $icon2

func _process(delta):
	icon.position = icon2.position # 设定两个Sprite的位置重合
	icon.0ffset.× = 200 # 设定围绕物体距离被围绕物体的距离--围绕物体位置X向偏移
  	icon.rotate(deg2rad(1)) # 围绕物体围绕中心点旋转

下面是利用向量旋转和加减法实现

extends Node2D

onready var icon= $icon
onready var icon2 =$icon2

func _process(delta):
	var a:Vector2 =icon.position
	var b:Vector2 =icon2.position
	icon2.position = a + (b-a).rotated(deg2rad(1))

在这里插入图片描述

向量加减法

在这里插入图片描述

加法

三角形法则:AB+BC=AC,这种计算法则叫做向量加法的三角形法则,简记为:首尾相连、连接首尾、指向终点。

减法

AB-AC=CB,这种计算法则叫做向量减法的三角形法则,简记为:共起点、连终点、指被减。
在这里插入图片描述
在这里插入图片描述

与(b-a)相关的几个Vector2方法和写法

(b-a)
基础的向量减法,返回的是由A点指向B点的向量

b.angle_to_point(a) = (b-a).angle()

在这里插入图片描述
b.angle_to_point(a)简记为:B在A的什么方向,仍然是返回一个由A指向B的向量,当然这里不是直接返回这个向量,而是返回它与X轴正方向的夹角

a.direction_to(b) = (b-a).normalized() = (b-a)/(b-a).length()

在这里插入图片描述
在这里插入图片描述

一个不断旋转的炮塔

这其实是一个子节点围绕父节点进行旋转的问题。

extends Node2D

onready var body = $炮身
onready var paota = $炮身/炮塔

func _process(delta):
	paota.position=Vector:2.ZER0 # 设定子物体的位置为父物体的坐标原点--也就是两者中心重合
	paota.offset.X=48 # 设定围绕物体距离被围绕物体的距离--围绕物体位置X向偏移
	paota.rotate(deg2rad(1)) # 围绕物体围绕中心点旋转

炮筒随鼠标位置围绕炮身移动

我们只需要稍微结合一下上面学到的get_global_mouse_position()来获取鼠标位置,就可以让炮塔的炮筒随着我们的鼠标位置进行旋转。而下一步你只要实现点击发射炮弹,一个简单的设计游戏不就来了?

extends Node2D

onready var body=$炮身
onready var paota=$炮身/炮塔

func _process(delta):
	paota.position=Vector:2.ZER0 # 设定子物体的位置为父物体的坐标原点--也就是两者中心重合
	paota.offset.X=48 # 设定围绕物体距离被围绕物体的距离--围绕物体位置X向偏移
	paota.Look_at(get_global_mouse_position()) # 炮筒随鼠标位置围绕炮身移动

RTS相关

实现图标在两个位置点循环往复移动(RTS巡逻)

extends Node2D

onready var icon =$icon

var start_positon:Vector2=Vector:2(100,100)#起始位置
var end_positon:Vector2=Vector:2(300,300)#结束位置
var speed:float=5.0#速度

func _ready()
	icon.position = start_positon
	
func _process(delta):
	if icon.position.distance_to(end_positon)>0:
		icon.position = icon.position.move_toward(end_positon,speed)
	else:
	#起始位置与结束位置互换
	var old_start_positon = start_positon
	start_positon = end_positon
	end positon = old_start_positon

简单的建筑物集结点设置和造兵

在这里插入图片描述

extends Node2D

onready var soldier = $兵
onready var Camp = $兵营
onready var Flag = $旗帜

var new_soldier:KinematicBody2D # 新士兵
var can_move = false
var speed:float =100.0 # 移动速度
var velocity = Vector2.ZERO

func _ready():
	Flag.hide()
	soldier.hide()
	
func _input(event):
	if event is InputEventMouseButton and event.pressed:
		if event.button_index == BUTTON_LEFT:
			Flag.hide()
		if event.button_index == BUTTON_RIGHT:
			Flag.position = get_global_mouse_position() # 将鼠标点击位置设为集结点
			Flag.show()

func _process(delta):
	if can_move:
		if new_soldier.position.distance_to(Flag.position)>5:
			var dir = new_soldier.position.direction_to(Flag.position) # 方向
			velocity = dir * speed
			velocity = new_soldier.move_and_slide(velocity)
		else:
			new_soldier = null
			can_move =false



func _on_TextureButton_pressed():
	var n_soldier= soldier.duplicate()# 创建新的士兵
	add_child(n_soldier)
	n_soldier.position = Camp.position# 位于营地中心
	n_soldier.show()
	new_soldier = n_soldier
	can_move = true
	pass

简单的无限制放置建筑物

extends Node2D

var currnt_build # 当前要建造的建筑物
var can_build = false # 开启建筑物放置的标记变量

onready var fangBtn = $CanvasLayer/Panel/HBoxContainer/fangBtn
onready var sanjiaoBtn = $CanvasLayer/Panel/HBoxContainer/sanjiaoBtn
onready var yuanBtn = $CanvasLayer/Panel/HBoxContainer/yuanBtn


func _input(event):
	if event is InputEventMouseButton and event.pressed:
		if event.button_index == BUTTON_LEFT:
			if can_build:
				var t_build = currnt_build.duplicate()
				add_child(t_build)
				t_build.position = get_global_mouse_position()
				t_build.modulate.a = 1.0 # 透明度变为100%
				currnt_build.queue_free()
				can_build = false

func _process(delta):
	if can_build:
		currnt_build.modulate.a = 0.5 # 透明度变为50%
		currnt_build.position = get_global_mouse_position()
		

func _on_fangBtn_pressed():
	var ns = Sprite.new()
	ns.texture = fangBtn.texture_normal
	add_child(ns)
	currnt_build = ns
	can_build = true
	pass


func _on_sanjiaoBtn_pressed():
	var ns = Sprite.new()
	ns.texture = sanjiaoBtn.texture_normal
	add_child(ns)
	currnt_build = ns
	can_build = true
	pass


func _on_yuanBtn_pressed():
	var ns = Sprite.new()
	ns.texture = yuanBtn.texture_normal
	add_child(ns)
	currnt_build = ns
	can_build = true
	pass

在这里插入图片描述
在这里插入图片描述

基于Tilemap的基础地图编辑

在这里插入图片描述
为了简便起见,我们使用了如下的素材,作为TileMap的Tile来源。
在这里插入图片描述

extends Node2D

onready var tilemap= $TileMap

func _input(event )
	if event is InputEventMouseButton and event.pressed:
		if event.button index =BUTTON LEFT:
			var pos = get_global_mouse_position()# 获取鼠标当前位置
			# 换算鼠标位置为TileMap中的格子坐标
			var x = floor(pos.x/tilemap.cell_size.x)
			var y = floor(pos.y/tilemap.cell_size.y)
			tilemap.set_cell(X,y,0) # 设定格子的图块为Tileset索引0的图块

基于Tilemap的基础地图编辑(多图块编辑)

AtlasTexture的引入

我们使用的素材还是跟之前一样。不过这里我们用到了AtlasTexture资源来处理。
在这里插入图片描述
这要归功于Godoter群(笔者自己建立的一个Godot爱好者讨论群)中群友铁木球兄的推荐。
在这里插入图片描述

extends Node2D

onready var tilemap = $TileMap
onready var btns = $CanvasLayer/Panel/Btns

var current_id = 0 # 当前图块的ID

func _input(event):
	if event is InputEventMouseButton and event.pressed:
		if event.button_index == BUTTON_LEFT:
			var pos = get_global_mouse_position() # 获取鼠标当前位置
			# 换算鼠标位置为TileMap中的格子坐标
			var x = floor(pos.x/tilemap.cell_size.x)
			var y = floor(pos.y/tilemap.cell_size.y)
			
			tilemap.set_cell(x,y,current_id) # 设定格子的图块为Tileset索引0的图块

func _ready():
	var sets:TileSet = tilemap.tile_set #获取tilemap的Tileset资源
	var sets_ids = sets.get_tiles_ids() # 获取Tileset中所有Tile的ID组成的数组
	for set_id in sets_ids: # 遍历数组
		var btn = TextureButton.new()
		var texture = AtlasTexture.new() # AtlasTexture将纹理的一部分裁剪出来
		texture.atlas = sets.tile_get_texture(set_id) # AtlasTexture.atlas是整体的图
		texture.region = sets.tile_get_region(set_id) # AtlasTexture.region是要显示的区域
		
		btn.texture_normal = texture
		btn.expand = true
		btn.stretch_mode = 0
		btn.rect_min_size = Vector2.ONE * 40
		btn.connect("pressed",self,"btn_pressed",[set_id])
		btns.add_child(btn)

func btn_pressed(set_id):
	current_id = set_id

在这里插入图片描述
绿蓝红黄色块虽然也能表达意思,但是,为了更好的展现我们所做到的,可以把上面的素材改为下面这个:
在这里插入图片描述
然后不用修改代码,你就可以看到自己创建的自定义编辑器编辑类似平台游戏地图的效果了。
在这里插入图片描述

获取TileMap的TileSet,以及其中的Tile的ID

func ready()
	var sets:TileSet=tilemap.tile set#获取tilemap的Tileset资源
	var sets_ids=sets.get_tiles_ids()#获取Tileset中所有Tile的ID组成的数组
	for set_id in sets_ids:#逼历数组
		print(set id)#打印

在这里插入图片描述

点击物体进行拖放

参考了Hi小胡《[Godot]实现物体的拖拽移动》视频

extends Area2D

var can_drag=false#是否开启拖动
var offset =Vector2.ZERO

#input_event信号只存在于CollisionObject及其子类
func on_Area2D_input_event(viewport,event,shape_idx):
#_Input是全局的,点哪都算,input_event:是只处理Area2D的CollisionShape范围内的
    if event is InputEventMouseButton:#这里的event与Input的event参数一致
        if event.button_index == BUTTON_LEFT:
            if event.pressed:
                can_drag = true
                offset.position=event.global_position
            else:
                can_drag=false


func _process(delta):
    if can_drag:
        position = get_global_mouse_position() + offset

视图操作

简单的鼠标滚轮缩放视图

参考了Hi小胡的《[G0dot]教你实现2D摄像机的视角控制(缩放,平移)》视频教程

extends Node2D

onready var cam = $Camera2D
var scale_factor:float = 1.0 # 当前的缩放比例值
var scale_step:float = 0.1 # 缩放步幅
var scale_max:float = 2.0 # 最大缩放倍数
var scale_min:float = 0.0 # 最小缩放倍数

func _ready():
    cam.position=get_viewport_rect().siZe/2 # 将摄像机与视口中心对齐

func _input(event):
    if event is InputEventMouseButton:
        if event.button_index == BUTTON_WHEEL_DOWN: # 鼠标滚轮向下
            if scale_factor<scale_max:
                scale_factor +scale_step
            elif event.button_index==BUTTON_WHEEL_UP: # 鼠标滚轮向上
                if scale_factor>scale_min:
                    scale_factor -scale_step
            # cam.Zoom=Vector:2.0NE*scale_factor # 设定相机的缩放倍数
func _process(delta):
    cam.zoom = lerp(cam.zoom,Vector2.0NE * scale_factor,8 * delta) # 用lerp让缩放更加丝滑

鼠标左键拖动视图

extends Node2D

onready var cam = $Camera2D

var can_drag =false
var start_pos:Vector2#记录初始的鼠标位置

func _ready():
    cam.position = get_viewport_rect().size/2#将摄像机与视口中心对齐

func _input(event):
#鼠标左键按下
    if event is InputEventMouseButton and event.pressed:
        if event.button_index == BUTTON_LEFT:
            can_drag=true#开启视图拖放
            start_pos=get_global_mouse_position()#记录拖放开始时鼠标的位置
    
    #视图拖放进行中且鼠标移动时
    if event is InputEventMouseMotion and can_drag:
        var end_pos=get_global_mouse_position()#记录当前鼠标位置
        cam.position-=end_pos-start_pos#摄像机位置-鼠标移动的距离
    
    #鼠标左键释放
    if event is InputEventMouseButton and !event.pressed:
        can_drag = false#关闭视图拖放

Ctrl+鼠标滚轮旋转视图

extends Node2D


onready var cam = $Camera2D
var rotate_step = 1.0 # 单次旋转度数
var ctrl = false # 是否按下Ctrl键


func _ready():
    cam.rotating=true#开启相机“可旋转”属性,不开启则摄像机无法进行旋转
    cam.position=get_viewport_rect().size/2#将摄像机与视口中心对齐



func _input(event):
    if event is InputEventKey:#键盘按键
        if event.pressed:
            if event.scancode == KEY_CONTROL: # Ctrl键
                ctrl = true
        else:
            ctrl = false
    
    if event is InputEventMouseButton and ctrl:
        if event.button_index == BUTTON_WHEEL_UP:
            cam.rotation_degrees += rotate_step
        elif event.button_index == BUTTON_WHEEL_DOWN:
            cam.rotation_degrees -= rotate_step

为了让效果看起来更丝滑,我们还是加入lerp:

extends Node2D


onready var cam = $Camera2D
var rotate_step = 10.0 # 单次旋转度数
var ctrl = false # 是否按下Ctrl键
var to_rotation_degrees:float

func _ready():
    cam.rotating=true#开启相机“可旋转”属性,不开启则摄像机无法进行旋转
    cam.position=get_viewport_rect().size/2#将摄像机与视口中心对齐



func _input(event):
    if event is InputEventKey:#键盘按键
        if event.pressed:
            if event.scancode == KEY_CONTROL: # Ctrl键
                ctrl = true
        else:
            ctrl = false
 
	if event is InputEventMouseButton and ctrl:
	    if event.button_index == BUTTON_WHEEL_UP:
	        to_rotation_degrees = cam.rotation_degrees + rotate_step
	    elif event.button_index == BUTTON_WHEEL_DOWN:
	        to_rotation_degrees = cam.rotation_degrees - rotate_step

func _process(delta):
    if ctrl:
        cam.rotation_degrees = lerp(cam.rotation_degrees,to_rotation_degrees,10*delta)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Godot实用代码1000例 的相关文章

  • 【SpringBoot+阿里云ssl】完成 http转https以及ws转wss

    SpringBoot 43 阿里云ssl完成 http转https以及ws转wss 前言一 HTTP转HTTPS二 ws转wss 前言 本文工作是建立在已经有一个SSL证书的基础之上 阿里云证书如何申请可以参考以下链接 xff1a 阿里云免
  • 【python】pyplot绘制横轴为时间的图

    1 导入环境 span class token keyword import span numpy span class token keyword as span np span class token keyword import sp
  • 【Python】numpy二维数组删除指定行和列

    Python numpy二维数组删除指定行和列 1 原始数据2 删除指定行3 删除指定列4 删除指定多行和多列 1 原始数据 span class token keyword print span span class token punc
  • 【Pytorch】深度学习快速上手心得

    Pytorch 深度学习快速上手心得 前言一 环境安装1 1 安装Anaconda1 2 Anaconda 常见指令1 4 Pytorch环境安装1 3 Jupyter安装 二 一个简单的demo快速入门深度学习2 1 环境依赖2 2 数据
  • 【nginx】快速入门——SpringBoot项目代理及图片代理

    nginx快速入门 1 简介2 Ngnix下载2 Nginx启动与停止2 1 启动2 2 关闭2 3 重新启动 3 Ngnix配置文件4 SpringBoot项目代理5 图片代理6 代理html页面 1 简介 nginx engine x
  • 【Nginx+SSL】在华为云和腾讯云上配置Nginx+SSL,实现Http转Https

    Nginx 43 SSL 在华为云和腾讯云上配置Nginx 43 SSL xff0c 实现Http转Https 0 前言0 1 腾讯云证书下载0 2 华为云证书下载 1 Nginx的SSL模块安装2 SSL证书上传3 Nginx的配置3 1
  • 【大论文中注意事项】2022年11月3日记录

    大论文中注意事项 1 时间安排2 论文标题3 摘要4 自己的内容 重要 5 第一章的全文研究内容6 关于正文中的序号7 第一章的课题来源8 文章9 文献10 第一章的本文主要研究内容11 实验的对比12 每一章的小节13 章节正文开始14
  • 【文件上传】前端html上传 + 后端SpringBoot接收并保存

    1 前端页面 lt form gt 记得设置一下enctype 61 34 multipart form data 34 span class token doctype span class token punctuation lt sp
  • linux系统下,11款常见远程桌面控制软件

    远程控制能够给人们带来很多便利 xff0c 本文介绍了11款常见的Linux系统下的远程桌面控制工具 xff0c 总有一款能适合您 一 Grdc 它是一个用GTK 43 编写的 xff0c 适用于gnome桌面环境的远程桌面访问软件 看图
  • ubuntu远程桌面到Windows

    我知道的有两种方法 xff1a 1 xff09 使用Terminal Server Client 打开Applications gt Internet gt Terminal Server Client xff0c 在 General 选项
  • 交叉编译 WPA_Supplicant

    本文记录这个wifi配置工具的编译过程 xff0c 步骤不少 xff0c 涉及的开源代码包也比较多 xff0c 以后很容易忘 WPA Supplicant简介 首先 xff0c 稍稍介绍下wpa supplicant xff0c 这是一个控
  • UltraEdit 最新安装教程

    1 下载完成UltraEdit 之后 xff0c 双击应用程序 xff0c 选择安装位置 xff0c 点击安装 2 点击下一步 3 安装完成 4 首次登录 xff0c 提示输入许可证秘钥 5 输入激活码页面 xff0c 输入后点击激活
  • Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)

    继上一篇文章创建了项目后 xff0c 本章我们进行项目的打包工作 本项目的所有演示代码 xff1a github可在这里下载 打包只用的工具为PyInstaller 打包步骤 1 准备环境1 1 安装 96 PyInstaller 96 2
  • JSP中的四种范围属性

    JSP中的对象 xff0c 包括用户创建的对象 如JavaBean对象 和JSP的隐含对象 xff0c 都有一个范围属性 范围属性规定了这些对象的作用域 xff0c 定义了在什么时间内 xff0c 在哪一个JSP页面中可以被访问 在JSP中
  • 【xml】[Qt] 生成xml格式对象或xml字符串(速成 QT处理xml)

    本文为什么称为速成呢 xff0c 因为本人就是速成的 xff0c 接手的项目里有个关于xml的bug xff0c 对xml一无所知到解决bug xff0c 自己硬着头皮上 xff0c 速成成功了 xff0c 也就觉得有写点什么东西的必要了
  • Mysql8.0如何重置密码

    环境 xff1a mysql8 0以上版本 无密码登录 修改配置文件 xff1a etc my cnf xff0c 在 mysqld 后面任意一行添加 skip grant tables xff0c 这样登录时就可以跳过密码验证的过程 重启
  • 华为交换机配置SNMP

    SNMP参数详情 Quidway snmp agent community 为SNMPv1 amp SNMPv2c访问设置团体名group 设置基于用户安全模型的组local engineid 设置本地SNMP实体的引擎IDmib view
  • VMware设置虚拟机的网络为桥接模式,虚拟机使用主机的网段,虚拟机设置和主机一样的网关(网段)

    VMware设置虚拟机的网络为桥接模式 KeyValue电脑版本win 10 1909虚拟机版本 VMware 17 点击编辑虚拟机设置 这样虚拟机即可在和主机在同一个网段 验证 虚拟机的地址 xff1a 192 168 2 144 ip
  • Rust权威指南 读书笔记

    Rust权威指南 本书由 Rust 核心开发团队编写而成 xff0c 由浅入深地探讨了 Rust 语言的方方面面 从学习函数 选择数据结构及绑定变量入手 xff0c 逐步介绍所有权 trait 生命周期 安全保证等高级概念 xff0c 模式
  • Rust:使用libloader调用动态链接库 (DLL)

    掘金为同人创作 xff1a 掘金 最近需要使用Rust动态调用动态链接库 xff0c 本来打算是使用libloading的 xff0c 但是libloading在调用dll中的函数的时 xff0c 是必须要在编译时确定参数和return的类

随机推荐

  • 用flatpak安装程序(比如GIMP)的方法

    linux世界真的是无奇不有 xff0c 什么安装程序的方法都有 比如gimp xff0c 如果必要安装官网的最新版安装包 xff0c 你会发现他是flatpakref后缀的 xff0c 我刚开始懵了 xff0c 这是什么安装包 xff0c
  • 怎样查看本机打开的端口?

    怎样查看本机打开的端口 xff1f https zhidao baidu com question 203087246 html Netstat xff0c 显示协议统计和当前的 TCP IP 网络连接 a xff0c 显示所有连接和侦听端
  • webpack4基本使用

    基本使用 初始化一个package json文件 npm init yes 安装webpack以及webpack cli cnpm i webpack webpack cli save dev package json 34 scripts
  • C++中enum与字符串或CString互相转换的方法

    C 43 43 中没有专门为enum与字符串或CString互相转换的直接方法 xff0c 但是工作中会常遇到相互转换的场景 下面介绍一种自己实现的方法 xff0c 首先得定义一个enum类型 xff0c 同时 xff0c 定义一个与之对应
  • VC++标准化路径PathCanonicalize

    外部输入的参数不能直接作为文件路径 xff0c 防止被恶意攻击 xff0c 比如构造一个跨目录限制的文件路径 etc passwd或 boot ini xff0c 或构造一个指向系统关键文件的链接文件symlink 34 etc shado
  • 解决时间机器无法识别硬盘问题

    T7 SSD分区后做时光机器 xff0c 但无法识别 xff08 如图 xff09 xff0c 问题解决 一 问题描述 xff1a 当时没保存照片 xff0c 图片来自网络 问题详情 xff1a 硬盘没分区且是苹果可识别的格式 xff08
  • vscode stm32cubemx 优雅开发stm32,最简单步骤教程

    配置安装环境 下载STM32cubeMX xff0c 这个大家可以自己在stm的官网下载到下载VSCode下载arm none eabi gcc下载MinGW w64 xff0c 为了实现里面的makefile 等功能下载OpenOCD这里
  • Epoll两种模式浅析(ET or LT)

    linux异步IO浅析 http hi baidu com kouu blog item e225f67b337841f42f73b341 html epoll有两种模式 Edge Triggered 简称ET 和 Level Trigge
  • 5GC自学-5G接入网组成

    5GC接入网 如图所示 xff1a EPC xff08 就是4G核心网 xff09 被分为New Core xff08 5GC xff0c 5G核心网 xff09 和MEC xff08 移动网络边界计算平台 xff09 两部分 MEC移动到
  • 《C++程序设计实验3》

    描述 晶晶的朋友贝贝约晶晶下周一起去看展览 xff0c 但晶晶每周的1 3 5必须上课 xff0c 请帮晶晶判断她能否接受贝贝的邀请 xff0c 如果能输出YES xff1b 如果不能则输出NO 输入 输入贝贝邀请晶晶去看展览的日期 xff
  • webpack--PWA(网站离线访问技术)

    webpack config js const WorkboxWebpackPlugin 61 require 39 workbox webpack plugin 39 终端下载npm i workbox webpack plugin D
  • Ubuntu安装wine的方法(Linux Ubuntu安装Windows软件)

    我打算完全从头开始 xff0c 写一个专门用于桌面办公的纯国产操作系统 xff0c 规避主流操作系统上影响用户体验的问题 xff0c 系统力求简洁 前言 xff1a wine可以让你在linux上运行一些常用的windows xff0c 如
  • 冒泡排序,并输出每一趟的排序结果

    span class token keyword public span span class token keyword static span span class token keyword void span span class
  • [Linux]基于select的Socket编程实现客户端群聊[非阻塞]

    先看效果 xff1a 客户端的代码 xff1a span class hljs comment Create by Gpwner 2017年1月5日21 30 16 span span class hljs preprocessor inc
  • 深入理解Nginx~用于调试进程和定位问题

    1 是否以守护进程方式运行Nginx 语法 xff1a daemon on off 默认 xff1a daemon on 守护进程 xff08 daemon xff09 是脱离终端并且在后台运行的进程 它脱离终端是为了避免进程执行过程中的信
  • 笔记本电脑坏了,那些零件可以再利用

    1 买个硬盘盒 xff0c 把笔记本硬盘改装成移动硬盘 2 把笔记本的屏幕拆下来 xff0c 上淘宝买改装用的套装 xff0c 可以把笔记本的屏幕改装成扩展显示器和电视 xff08 重点推荐 xff09 3 内存条拆下来 xff0c 留着以
  • 天气预报API接口大全

    国家气象局提供的天气预报接口 接口地址 xff1a http www weather com cn data sk 101010100 html http www weather com cn data cityinfo 101010100
  • VMware安装Debian完成,启动出现黑屏现象,仅有一个光标,以及给出解决办法

    VMware安装Debian完成 xff0c 启动出现黑屏现象 xff0c 仅有一个光标 xff0c 以及给出解决办法 一 启动黑屏问题二 解决办法 一 启动黑屏问题 VMware安装Debian过程中 xff0c 一路选择默认选项 xff
  • C语言对栈的操作

    span class hljs preprocessor include lt stdio h gt span span class hljs preprocessor include lt stdlib h gt span span cl
  • Godot实用代码1000例

    关于 这是 Godot实用代码1000例 的CSDN博客版本 xff08 之前是PPT版本 xff09 xff0c 将收录笔者自己探索和学习的一些简单Godot编程案例 文章目录 关于原版开篇的废话适合哪些人群建议前置知识 基础的移动 旋转