Initial commit
This commit is contained in:
+172
@@ -0,0 +1,172 @@
|
||||
extends MeshInstance3D
|
||||
|
||||
var isActive = false
|
||||
var inMenu = false
|
||||
|
||||
var randomMaterial : int
|
||||
var randomAxis : int
|
||||
var last : Node3D
|
||||
var vertices : Array
|
||||
var newVerts : Array
|
||||
var speed = 2.0
|
||||
var score = 1
|
||||
|
||||
const maxMoveDistance = 3.0
|
||||
var velocity : Vector3
|
||||
var cam : Camera3D
|
||||
|
||||
var labelScore : Label
|
||||
var rng = RandomNumberGenerator.new()
|
||||
|
||||
func calculate_randoms():
|
||||
randomMaterial = rng.randi_range(0, 2)
|
||||
randomAxis = rng.randi_range(0, 1)
|
||||
|
||||
if last != null:
|
||||
while randomMaterial == last.randomMaterial:
|
||||
randomMaterial = rng.randi_range(0, 2)
|
||||
while randomAxis == last.randomAxis:
|
||||
randomAxis = rng.randi_range(0, 1)
|
||||
if randomAxis == 0:
|
||||
velocity.z = 0
|
||||
velocity.x = speed
|
||||
else:
|
||||
velocity.z = speed
|
||||
velocity.x = 0
|
||||
|
||||
func rebuild_mesh(vertTemplate):
|
||||
var tempVertices = []
|
||||
|
||||
var st = SurfaceTool.new()
|
||||
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
||||
match randomMaterial:
|
||||
0:
|
||||
st.set_material(PlatformData.material1())
|
||||
1:
|
||||
st.set_material(PlatformData.material2())
|
||||
2:
|
||||
st.set_material(PlatformData.material3())
|
||||
|
||||
var index = 0
|
||||
for i in range(0, 6):
|
||||
st.set_uv(Vector2(0, 0))
|
||||
st.set_normal(PlatformData.normals[i])
|
||||
st.add_vertex(vertTemplate[PlatformData.triangles[i][0]])
|
||||
st.set_uv(Vector2(0, 1))
|
||||
st.set_normal(PlatformData.normals[i])
|
||||
st.add_vertex(vertTemplate[PlatformData.triangles[i][1]])
|
||||
st.set_uv(Vector2(1, 1))
|
||||
st.set_normal(PlatformData.normals[i])
|
||||
st.add_vertex(vertTemplate[PlatformData.triangles[i][2]])
|
||||
st.set_uv(Vector2(1, 0))
|
||||
st.set_normal(PlatformData.normals[i])
|
||||
st.add_vertex(vertTemplate[PlatformData.triangles[i][3]])
|
||||
|
||||
tempVertices.append(vertTemplate[PlatformData.triangles[i][0]])
|
||||
tempVertices.append(vertTemplate[PlatformData.triangles[i][1]])
|
||||
tempVertices.append(vertTemplate[PlatformData.triangles[i][2]])
|
||||
tempVertices.append(vertTemplate[PlatformData.triangles[i][3]])
|
||||
|
||||
st.add_index(index + 2)
|
||||
st.add_index(index + 3)
|
||||
st.add_index(index + 1)
|
||||
st.add_index(index + 2)
|
||||
st.add_index(index + 1)
|
||||
st.add_index(index + 0)
|
||||
|
||||
index += 4
|
||||
|
||||
mesh = st.commit()
|
||||
vertices = tempVertices
|
||||
|
||||
func _ready():
|
||||
if name == "Platform1":
|
||||
isActive = true
|
||||
if isActive:
|
||||
last = %Base
|
||||
if not inMenu and name == "Platform1":
|
||||
cam = %Camera3D
|
||||
labelScore = %Score
|
||||
|
||||
calculate_randoms()
|
||||
rebuild_mesh(PlatformData.vertices)
|
||||
|
||||
func _physics_process(delta):
|
||||
if not isActive:
|
||||
return
|
||||
|
||||
if abs(position.x) >= maxMoveDistance || abs(position.z) >= maxMoveDistance:
|
||||
velocity.x *= -1
|
||||
velocity.z *= -1
|
||||
|
||||
translate(velocity * delta)
|
||||
|
||||
if Input.is_action_just_pressed("Click") and not inMenu:
|
||||
isActive = false
|
||||
cam.translate(Vector3(0, 0.1, 0))
|
||||
|
||||
var otherVerts = last.vertices
|
||||
var _newVerts = []
|
||||
|
||||
if len(last.newVerts) == 0:
|
||||
_newVerts = PlatformData.vertices.duplicate()
|
||||
else:
|
||||
_newVerts = last.newVerts.duplicate()
|
||||
|
||||
if randomAxis == 0:
|
||||
var currentX = position.x
|
||||
var lastX = last.position.x
|
||||
|
||||
if vertices[0].x + currentX < otherVerts[0].x + lastX:
|
||||
_newVerts[0].x = otherVerts[0].x - currentX + lastX
|
||||
_newVerts[3].x = otherVerts[0].x - currentX + lastX
|
||||
_newVerts[7].x = otherVerts[0].x - currentX + lastX
|
||||
_newVerts[4].x = otherVerts[0].x - currentX + lastX
|
||||
|
||||
if vertices[3].x + currentX > otherVerts[3].x + lastX:
|
||||
_newVerts[1].x = otherVerts[3].x - currentX + lastX
|
||||
_newVerts[2].x = otherVerts[3].x - currentX + lastX
|
||||
_newVerts[5].x = otherVerts[3].x - currentX + lastX
|
||||
_newVerts[6].x = otherVerts[3].x - currentX + lastX
|
||||
|
||||
if vertices[3].x + currentX < otherVerts[0].x + lastX or vertices[0].x + currentX > otherVerts[3].x + lastX:
|
||||
get_tree().reload_current_scene()
|
||||
else:
|
||||
var currentZ = position.z
|
||||
var lastZ = last.position.z
|
||||
|
||||
if vertices[0].z + currentZ < otherVerts[0].z + lastZ:
|
||||
_newVerts[0].z = otherVerts[0].z - currentZ + lastZ
|
||||
_newVerts[1].z = otherVerts[0].z - currentZ + lastZ
|
||||
_newVerts[2].z = otherVerts[0].z - currentZ + lastZ
|
||||
_newVerts[3].z = otherVerts[0].z - currentZ + lastZ
|
||||
|
||||
if vertices[3].z + currentZ > otherVerts[3].z + lastZ:
|
||||
_newVerts[4].z = otherVerts[3].z - currentZ + lastZ
|
||||
_newVerts[5].z = otherVerts[3].z - currentZ + lastZ
|
||||
_newVerts[6].z = otherVerts[3].z - currentZ + lastZ
|
||||
_newVerts[7].z = otherVerts[3].z - currentZ + lastZ
|
||||
|
||||
if vertices[3].z + currentZ < otherVerts[0].z + lastZ or vertices[0].z + currentZ > otherVerts[3].z + lastZ:
|
||||
get_tree().reload_current_scene()
|
||||
|
||||
|
||||
newVerts = _newVerts
|
||||
rebuild_mesh(_newVerts)
|
||||
|
||||
var inst = load("res://platform.tscn").instantiate()
|
||||
inst.cam = cam
|
||||
inst.labelScore = labelScore
|
||||
get_parent().add_child(inst)
|
||||
|
||||
inst.isActive = false
|
||||
inst.translate(Vector3(0, 0.2, 0) + position)
|
||||
inst.last = self
|
||||
inst.speed = speed + 0.2
|
||||
|
||||
inst.calculate_randoms()
|
||||
inst.rebuild_mesh(newVerts)
|
||||
|
||||
labelScore.text = str(score)
|
||||
inst.score = score + 1
|
||||
inst.isActive = true
|
||||
Reference in New Issue
Block a user