一个多小时整了个联机游戏,真香~~
代码漏洞百出,请各位有心人多多指教!
#start.gd
extends Control
onready var _name=$name
onready var ip=$ip
func _ready():
get_tree().connect("network_peer_connected",self,"_player_connected")
if "--server" in OS.get_cmdline_args():
var net=NetworkedMultiplayerENet.new()
net.create_server(20033,25)
print("[]已建立服务器,端口:20033")
get_tree().set_network_peer(net)
rpc_unreliable("_server",Auto.player1name)
pass
func _player_connected(id):
Auto.player2id=id
var game=preload("res://Game.tscn").instance()
print("[]游戏已启动!")
get_tree().get_root().add_child(game)
self.hide()
pass
func _on_Server_pressed():
Auto.player1name=_name.text
var net=NetworkedMultiplayerENet.new()
net.create_server(20033,2)
get_tree().set_network_peer(net)
rpc_unreliable("_server",Auto.player1name)
pass # Replace with function body.
func _on_Client_pressed():
Auto.player1name=_name.text
rpc_unreliable("_server",Auto.player1name)
var net=NetworkedMultiplayerENet.new()
net.create_client(ip.text,20033)
get_tree().set_network_peer(net)
pass # Replace with function body.
remote func _server(_text):
Auto.player2name=_text
pass
#Game.gd
extends Node2D
onready var player1Pos=$player1Pos
onready var player2Pos=$player2Pos
onready var richtext=$Control/richtext
onready var line=$Control/line
var i=false
func _ready():
if "--server" in OS.get_cmdline_args():
Auto.player1name="Server"
richtext.add_text("[]服务器已开启\n端口:20033\n")
var player1=preload("res://Player.tscn").instance()
player1.position=player1Pos.position
player1.set_name(str(get_tree().get_network_unique_id()))
player1.set_network_master(get_tree().get_network_unique_id())
add_child(player1)
printf(0,"[]玩家%s已进入游戏!\n"%str(Auto.player1name))
#richtext.push_mono("")
var player2=preload("res://Player.tscn").instance()
player2.position=player2Pos.position
player2.set_name(str(Auto.player2id))
player2.set_network_master(Auto.player2id)
add_child(player2)
#richtext.add_text("<System>玩家%s已进入游戏!\n"%str(Auto.player2name))
pass # Replace with function body.
func _on_Button_pressed():
if line.text[0]=="$":
if line.text=="$clear":
if i==true:
richtext.clear()
rpc_unreliable("_clear")
printf(0,"<%s>调用了清屏\n"%Auto.player1name)
else:
richtext.add_text("[]没有权利调用:%s:请使用$root-true指令申请管理员权限,详情请调用$help指令!\n"%Auto.player1name)
elif line.text=="$root-true":
i=true
printf(0,"[]%s:激活了管理员权限!\n"%Auto.player1name)
elif line.text=="$root-false":
i=false
printf(0,"[]$s:关闭了管理员权限!\n"%Auto.player1name)
elif line.text=="$root-false-all":
if i==true:
i=false
rpc_unreliable("_root",false)
printf(0,"[]%s:关闭了所有管理员权限!\n"%Auto.player1name)
else:
richtext.add_text("[]没有权利调用:%s:请使用$root-on指令申请管理员权限,详情请调用$help指令!\n"%Auto.player1name)
elif line.text=="$root-true-all":
if i==true:
i=true
rpc_unreliable("_root",true)
printf(0,"[]%s:打开了所有管理员权限!\n"%Auto.player1name)
else:
richtext.add_text("[]没有权利调用:%s:请使用$root-ture指令申请管理员权限,详情请调用$help指令!\n"%Auto.player1name)
elif line.text=="$help":
richtext.add_text("[]帮助文档:\n$clear:清屏,需要管理员权限\n$root-true:开启管理员权限,不需要管理员权限\n$root-false:关闭管理员权限,不需要管理员权限\n$clear:清屏,需要管理员权限\n$root-[bool]-all:关闭/开启所有成员的管理员权限,需要管理员权限\n$help:帮助文档,不需要管理员权限\n")
else:
printf(0,"[]调用了非法语句:%s:调用了%s,详情请调用$help指令!\n"%[Auto.player1name,line.text])
else:
printf(0,"<%s>%s\n"%[Auto.player1name,line.text])
line.text=""
pass # Replace with function body.
remote func _text(_text):
richtext.add_text(_text)
pass
remote func _clear():
richtext.clear()
remote func _print(_text):
printraw(_text)
remote func _root(flag:bool):
i=flag
pass
func printf(id,dir):
if id==0:
richtext.add_text(dir)
rpc_unreliable("_text",dir)
printraw(dir)
rpc_unreliable("_print",dir)
pass
func get_server(_player):
pass
func _process(_delta):
if get_tree().get_network_unique_id()==0:
printf(0,"[]%s已断开连接\n"%Auto.player1name)
get_tree().notification(MainLoop.NOTIFICATION_WM_QUIT_REQUEST)
pass
#player.gd
extends Sprite
#onready var richtext=$richtext
var speed=200
var dir=Vector2()
func _ready():
pass
remote func _set_position(pos):
position=pos
func _process(_delta):
dir=Vector2()
if Input.is_action_pressed("ui_left"):
dir.x-=1
if Input.is_action_pressed("ui_right"):
dir.x+=1
if Input.is_action_pressed("ui_up"):
dir.y-=1
if Input.is_action_pressed("ui_down"):
dir.y+=1
dir=dir.normalized()
if dir!=Vector2():
if is_network_master():
position+=speed*dir*_delta
rpc_unreliable("_set_position",position)
pass
#Auto.gd
extends Node
var player=[]
var player2id=0
var playernum=1
var player1name=""
var player2name=""
var serverplayer=true
func _ready():
pass
Godot 4.0 alpha 7 中新增的动画库:
AnimationPlayer 节点现在包含库,而不是包含单个动画。反过来,库包含动画。
如果库名是空的,那么它的行为就像到现在为止一样(只播放“动画名”)。如果您命名库,则必须将其播放为“库/动画名称”。这确保了向后兼容性并在不想使用多个库的情况下保持现有工作流程。
添加了向后兼容性(以以前的格式保存的场景将根据动画的需要创建一个库)。
这为实现将场景作为动画库导入的可能性铺平了道路,最终允许导入与 3D 模型分开的动画。
可以将场景 (dae/fbx/gltf) 作为动画库导入。
使 AnimationTree 可以自行导入动画库,因此它不依赖 AnimationPlayer 来处理所有事情。
新的 GodotEngine 4.0 alpha 7 中增加了许多很酷的新功能,例如 Label3D、动画库、场景独特节点、在 GDScript lambdas 中使用“self”、在 Visual Shaders 中使用 Vector4、改进的噪声、导航和网络等等~
发行十余年的格斗游戏 Overgrowth(中文名:复仇格斗兔2)正式宣布开源。
Overgrowth(中文名:复仇格斗兔2)是游戏公司 Wolfire 制作的一款动作冒险游戏,玩法有点类似于《刺客信条》,不过玩家控制的是一只肌肉壮硕的兔子与其他动物进行格斗,每种动物各有特点,比如猫(移速高)、狗(血厚,不能被暗杀)、鼠(攻速快但脆弱)、狼(血厚、不能被暗杀、攻击不可防御、伤害极高)。游戏的一大亮点是它有一个非常真实的物理引擎,格斗的效果都使用该物理引擎实时渲染,因此打击感极为真实。
除了代码开源,游戏还降价了三分之一,从 30 美金降到 20 美金。
【元宇宙编程】一个基于 Godot引擎 的 VR桌面 开源项目,Linux 的 虚拟现实窗口管理器,真*沉浸式编程!
如果想安装这个 VR 桌面,只需要运行下面的命令和准备其他设备:
# Clone
git clone --depth 1 --recursive https://github.com/SimulaVR/Simula
cd Simula
# Download (or build, if downloading fails)
source ./utils/Helpers.sh && installSimula
# Launch
./result/bin/simula # Needs SteamVR to be running