hareqj   ♂  喵他  
 编程让人生更优雅

Godot游戏引擎使用GDScript脚本生成随机环状地图

[图文教程]作者:weixin_45038716
2D  脚本编程 

使用 GDScript 生成随机环状地图,及其算法思路讲解!

在这里插入图片描述

extends Node2D

export (PackedScene) var Ball

var 顶点x = []
var 顶点y = []
var 方向x = [1, 1, 0,-1,-1,-1, 0, 1]
var 方向y = [0, 1, 1, 1,0 ,-1,-1,-1]

var 路径 = {}

var 地图宽度 
var 地图高度


func _ready():
	生成地图大小()
	生成顶点()
	生成路径()
	var keys = 路径 .keys()
	for i in keys:
		画砖块(i)

func 生成地图大小():
	地图宽度 = 生成随机数(15,18)
	地图高度 = 生成随机数(15,18)
	print(地图宽度 , 地图高度 )

func 生成顶点():
	顶点x.resize(9)
	顶点y.resize(9)
	
	var 半宽 = (地图宽度/2) as int 
	var 半高 = (地图高度/2) as int 
	
	顶点x[0] = 生成随机数(3,半宽-1)
	顶点y[0] = 0
	顶点x[1] = 生成随机数(顶点x[0]+3,地图宽度-4)
	顶点y[1] = 0

	顶点x[2] = 地图宽度-1
	顶点y[2] = 生成随机数(4,半高)
	顶点x[3] = 地图宽度-1
	顶点y[3] = 生成随机数(顶点y[2]+3,地图高度-3)
	
	顶点x[5] = 生成随机数(3,半宽-1)
	顶点y[5] = 地图高度-1
	顶点x[4] = 生成随机数(顶点x[5]+3,地图宽度-4)
	顶点y[4] = 地图高度-1
	
	顶点x[7] = 0
	顶点y[7] = 生成随机数(4,半高)
	顶点x[6] = 0
	顶点y[6] = 生成随机数(顶点y[7]+3,地图高度-3)
	
	顶点x[8] = 顶点x[0]
	顶点y[8] = 顶点y[0] 
	
	for i in range(8):
			路径[Vector2(顶点x[i],顶点y[i])] = 1

func 生成路径():
	for i in range(8):
		连接线段(顶点x[i],顶点y[i],顶点x[i+1],顶点y[i+1],方向x[i],方向y[i])
		
func 连接线段(x1,y1,x2,y2,dx,dy):
	var r
	var 右增量 = 0
	var 下增量 = 0
	while x1 != x2 or y1 != y2:
		右增量 = 0
		下增量 = 0
		if x1 == x2:
			dx = 0
		if y1 == y2:
			dy = 0
		if dx == 0:
			下增量 = dy
		elif dy == 0:
			右增量 = dx 
		else:
			r = 生成随机数(0,1)
			if r == 0 :
				右增量 = dx
			else:
				下增量 = dy
		if 下增量 != 0 or 右增量 != 0:
			x1 += 右增量
			y1 += 下增量
			路径[Vector2(x1,y1)] = 1
		pass 
	pass
	


func 画砖块(位置):
	var new_ball = Ball.instance()
	new_ball.position = Vector2(位置.x*30+50,位置.y*30+50)
	add_child(new_ball)
	

func 生成随机数(左边界,右边界):
	randomize()
	var r = rand_range(左边界, 右边界+1) as int
	return r

算法思路:

在这里插入图片描述

在边缘任选8个点.然后依次把8个点连接起来.
假设从红色点出发.

出发后可以向右走,也可以向上走,具体方向由随机函数控制.

在这里插入图片描述

当绿色点的位置和目标点的横坐标相同后,此时绿色点的移动不再随机,而是只能向上移动.

以此类推,最终将所有点连接完毕

在这里插入图片描述

[举报]  赞↑ [0 踩↓ [0
暂无评论
[声明]

初衷和宗旨:共同努力,推动Godot游戏引擎在国内的普及和发展.
1.本站所有内容皆为用户发布,如有涉嫌侵权请联系hareqj#163.com,告知内容右上角所在编号以及侵权证据.
2.禁止发布色情/暴恐/时政/商广/带网址或二维码水印/涉嫌隐私或未经授权的私人图片.
3.举报和投稿:hareqj#163.com

Godot中文社区QQ群
Copyright Godot中文社区 Godott.com All Rights Reserved.
京ICP备13032831号