godot 4 通过加载角色数据动态创建人物角色,并实现多个阵型的切换【素材来源网络,仅供学习参考】

  1. 简单对战人物和宠物数据,用来动态加载角色信息
# PK人物信息
var characters_info ={ 
	"我方":[{"is_leader":true,"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"杀破狼","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}}],
	"敌方":[{"is_leader":true,"model":"侠剑客","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"杀破狼","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"杀破狼","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"哪吒","level":110}}]
}
  1. 阵型坐标数据(包含我方和敌方坐标,坐标是大概演示,具体精准坐标需要自己微调)
# 阵型坐标数据
var tactical_troops_info = {
	"普通阵_我方":[Vector2(510,425),Vector2(449,461),Vector2(647,335),Vector2(706,285),Vector2(577,379),Vector2(402,393),Vector2(478,360),Vector2(544,320),Vector2(605,276),Vector2(665,231)],
	"普通阵_敌方":[Vector2(270,176),Vector2(403,111),Vector2(149,247),Vector2(336,142),Vector2(207,211),Vector2(444,152),Vector2(379,195),Vector2(317,235),Vector2(255,281),Vector2(188,322)],
	"鸟翔阵_我方":[Vector2(587,367),Vector2(703,359),Vector2(582,436),Vector2(689,287),Vector2(449,429),Vector2(521,327),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"鸟翔阵_敌方":[Vector2(175,170),Vector2(55,240),Vector2(295,110),Vector2(200,115),Vector2(60,180),Vector2(220,210),Vector2(160,140),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"天覆阵_我方":[Vector2(596,384),Vector2(500,383),Vector2(613,320),Vector2(429,412),Vector2(686,283),Vector2(522,324),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"天覆阵_敌方":[Vector2(138,145),Vector2(115,200),Vector2(235,140),Vector2(55,230),Vector2(295,110),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"云垂阵_我方":[Vector2(670,428),Vector2(500,383),Vector2(613,320),Vector2(429,412),Vector2(673,282),Vector2(526,326),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"云垂阵_敌方":[Vector2(118,125),Vector2(115,200),Vector2(235,140),Vector2(55,230),Vector2(295,110),Vector2(220,110),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"地载阵_我方":[Vector2(597,384),Vector2(552,345),Vector2(613,320),Vector2(490,390),Vector2(650,415),Vector2(518,320),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"地载阵_敌方":[Vector2(135,135),Vector2(215,85),Vector2(55,170),Vector2(175,170),Vector2(98,105),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"风扬阵_我方":[Vector2(637,400),Vector2(696,360),Vector2(573,432),Vector2(638,321),Vector2(512,394),Vector2(525,322),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"风扬阵_敌方":[Vector2(135,135),Vector2(215,85),Vector2(55,170),Vector2(240,140),Vector2(118,205),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"龙飞阵_我方":[Vector2(584,448),Vector2(639,467),Vector2(690,291),Vector2(451,440),Vector2(526,395),Vector2(525,323),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"龙飞阵_敌方":[Vector2(135,135),Vector2(175,160),Vector2(55,230),Vector2(240,140),Vector2(98,115),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"虎翼阵_我方":[Vector2(699,444),Vector2(703,359),Vector2(582,436),Vector2(689,287),Vector2(449,429),Vector2(521,327),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"虎翼阵_敌方":[Vector2(98,115),Vector2(55,240),Vector2(295,110),Vector2(200,115),Vector2(60,180),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"蛇蟠阵_我方":[Vector2(650,408),Vector2(577,441),Vector2(712,368),Vector2(519,403),Vector2(720,447),Vector2(521,327),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"蛇蟠阵_敌方":[Vector2(135,135),Vector2(215,85),Vector2(55,170),Vector2(260,115),Vector2(98,105),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
}
  1. 模型映射关系数据,用来取对应动画
# 模型映射数据
var model_map ={
	# 人物角色
	"侠剑客_站立":"res://素材/动画/人物/侠剑客_站立_8x9.tres",
	"巫蛮儿_站立":"res://素材/动画/人物/巫蛮儿_站立_8x10.tres",
	"杀破狼_站立":"res://素材/动画/人物/杀破狼_站立_8x12.tres",
	"羽零神_跑动":"res://素材/动画/人物/羽零神_跑动_8x8.tres",
	# 宠物
	"哪吒_站立":"res://素材/动画/宠物/哪吒_站立_4x8.tres",
	"女剑客_站立":"res://素材/动画/宠物/女剑客_站立_4x8.tres",
}
  1. 导出我方和敌方阵型选择参数,枚举字符类型
@export_enum("普通阵", "鸟翔阵", "天覆阵", "云垂阵", "地载阵", "风扬阵", "龙飞阵", "虎翼阵", "蛇蟠阵") var we_tactical_troops_name:String = "普通阵"
@export_enum("普通阵", "鸟翔阵", "天覆阵", "云垂阵", "地载阵", "风扬阵", "龙飞阵", "虎翼阵", "蛇蟠阵") var other_tactical_troops_name:String = "普通阵"

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

  1. 根据阵型坐标和人物角色动态创建人物并加入站立播放动画
# 初始化角色和宠物	
# tactical_name  阵型名称
# troops_name    队伍名称
# character_animation_number  人物默认8方向中某方向的动画
# pet_animation_number        宠物默认8方向中某方向的动画
func init_players_and_pets(tactical_name, troops_name, character_animation_number, pet_animation_number):
	var tactical_troops_name = tactical_name + "_" + troops_name
	var positions = tactical_troops_info[tactical_troops_name]
	var characters = characters_info[troops_name]
	
	for i in range(characters.size()):
		var character_info = characters[i]
		var pet_info = character_info["enter_pet"]
		var character =  s_player.instantiate()
		self.add_child(character)
		character.position.x = positions[i].x
		character.position.y = positions[i].y
		character.get_node("body").set_sprite_frames(load(model_map[character_info["model"] + "_站立"]))
		character.get_node("body").play("站立_" + String.num(character_animation_number))

		var pet = s_pet.instantiate()
		self.add_child(pet)
		pet.position.x = positions[i + 5].x
		pet.position.y = positions[i + 5].y
		pet.get_node("body").play("站立_" + String.num(pet_animation_number))
  1. 完整代码如下:
extends Node2D

@export_enum("普通阵", "鸟翔阵", "天覆阵", "云垂阵", "地载阵", "风扬阵", "龙飞阵", "虎翼阵", "蛇蟠阵") var we_tactical_troops_name:String = "普通阵"
@export_enum("普通阵", "鸟翔阵", "天覆阵", "云垂阵", "地载阵", "风扬阵", "龙飞阵", "虎翼阵", "蛇蟠阵") var other_tactical_troops_name:String = "普通阵"

# 阵型坐标数据
var tactical_troops_info = {
	"普通阵_我方":[Vector2(510,425),Vector2(449,461),Vector2(647,335),Vector2(706,285),Vector2(577,379),Vector2(402,393),Vector2(478,360),Vector2(544,320),Vector2(605,276),Vector2(665,231)],
	"普通阵_敌方":[Vector2(270,176),Vector2(403,111),Vector2(149,247),Vector2(336,142),Vector2(207,211),Vector2(444,152),Vector2(379,195),Vector2(317,235),Vector2(255,281),Vector2(188,322)],
	"鸟翔阵_我方":[Vector2(587,367),Vector2(703,359),Vector2(582,436),Vector2(689,287),Vector2(449,429),Vector2(521,327),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"鸟翔阵_敌方":[Vector2(175,170),Vector2(55,240),Vector2(295,110),Vector2(200,115),Vector2(60,180),Vector2(220,210),Vector2(160,140),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"天覆阵_我方":[Vector2(596,384),Vector2(500,383),Vector2(613,320),Vector2(429,412),Vector2(686,283),Vector2(522,324),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"天覆阵_敌方":[Vector2(138,145),Vector2(115,200),Vector2(235,140),Vector2(55,230),Vector2(295,110),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"云垂阵_我方":[Vector2(670,428),Vector2(500,383),Vector2(613,320),Vector2(429,412),Vector2(673,282),Vector2(526,326),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"云垂阵_敌方":[Vector2(118,125),Vector2(115,200),Vector2(235,140),Vector2(55,230),Vector2(295,110),Vector2(220,110),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"地载阵_我方":[Vector2(597,384),Vector2(552,345),Vector2(613,320),Vector2(490,390),Vector2(650,415),Vector2(518,320),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"地载阵_敌方":[Vector2(135,135),Vector2(215,85),Vector2(55,170),Vector2(175,170),Vector2(98,105),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"风扬阵_我方":[Vector2(637,400),Vector2(696,360),Vector2(573,432),Vector2(638,321),Vector2(512,394),Vector2(525,322),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"风扬阵_敌方":[Vector2(135,135),Vector2(215,85),Vector2(55,170),Vector2(240,140),Vector2(118,205),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"龙飞阵_我方":[Vector2(584,448),Vector2(639,467),Vector2(690,291),Vector2(451,440),Vector2(526,395),Vector2(525,323),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"龙飞阵_敌方":[Vector2(135,135),Vector2(175,160),Vector2(55,230),Vector2(240,140),Vector2(98,115),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"虎翼阵_我方":[Vector2(699,444),Vector2(703,359),Vector2(582,436),Vector2(689,287),Vector2(449,429),Vector2(521,327),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"虎翼阵_敌方":[Vector2(98,115),Vector2(55,240),Vector2(295,110),Vector2(200,115),Vector2(60,180),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
	"蛇蟠阵_我方":[Vector2(650,408),Vector2(577,441),Vector2(712,368),Vector2(519,403),Vector2(720,447),Vector2(521,327),Vector2(450,357),Vector2(575,274),Vector2(382,385),Vector2(636,243)],
	"蛇蟠阵_敌方":[Vector2(135,135),Vector2(215,85),Vector2(55,170),Vector2(260,115),Vector2(98,105),Vector2(220,210),Vector2(160,240),Vector2(280,180),Vector2(100,270),Vector2(340,150)],
}

# PK人物信息
var characters_info ={ 
	"我方":[{"is_leader":true,"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"杀破狼","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"女剑客","level":110}}],
	"敌方":[{"is_leader":true,"model":"侠剑客","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"杀破狼","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"杀破狼","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"哪吒","level":110}},{"model":"侠剑客","level":105,"enter_pet":{"model":"哪吒","level":110}}]
}

# 模型映射数据
var model_map ={
	# 人物角色
	"侠剑客_站立":"res://素材/动画/人物/侠剑客_站立_8x9.tres",
	"巫蛮儿_站立":"res://素材/动画/人物/巫蛮儿_站立_8x10.tres",
	"杀破狼_站立":"res://素材/动画/人物/杀破狼_站立_8x12.tres",
	"羽零神_跑动":"res://素材/动画/人物/羽零神_跑动_8x8.tres",
	# 宠物
	"哪吒_站立":"res://素材/动画/宠物/哪吒_站立_4x8.tres",
	"女剑客_站立":"res://素材/动画/宠物/女剑客_站立_4x8.tres",
}


var s_player = preload("res://scenes//player.tscn")
var s_pet = preload("res://scenes//pet.tscn")


func _ready():
	init_players_and_pets(we_tactical_troops_name,"我方",2,2)
	init_players_and_pets(other_tactical_troops_name,"敌方",0,0)
	


# 初始化角色和宠物	
# tactical_name  阵型名称
# troops_name    队伍名称
# character_animation_number  人物默认8方向中某方向的动画
# pet_animation_number        宠物默认8方向中某方向的动画
func init_players_and_pets(tactical_name, troops_name, character_animation_number, pet_animation_number):
	var tactical_troops_name = tactical_name + "_" + troops_name
	var positions = tactical_troops_info[tactical_troops_name]
	var characters = characters_info[troops_name]
	
	for i in range(characters.size()):
		var character_info = characters[i]
		var pet_info = character_info["enter_pet"]
		var character =  s_player.instantiate()
		self.add_child(character)
		character.position.x = positions[i].x
		character.position.y = positions[i].y
		character.get_node("body").set_sprite_frames(load(model_map[character_info["model"] + "_站立"]))
		character.get_node("body").play("站立_" + String.num(character_animation_number))

		var pet = s_pet.instantiate()
		self.add_child(pet)
		pet.position.x = positions[i + 5].x
		pet.position.y = positions[i + 5].y
		pet.get_node("body").play("站立_" + String.num(pet_animation_number))
		
		


func _process(delta):
	pass

  1. 运行结果 (这里随机演示两个阵型选择):
    在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值