2
0
Эх сурвалжийг харах

Merge pull request #1331 from fry-/master

Add 2D fog of war demo
Juan Linietsky 10 жил өмнө
parent
commit
eefcf93e55

+ 11 - 0
demos/2d/fog_of_war/.fscache

@@ -0,0 +1,11 @@
+::res://::1422910453
+floor.png::ImageTexture::1422910453::
+fog.gd::GDScript::1422910025::
+fog.png::ImageTexture::1422908128::
+fog.scn::PackedScene::1422909435::
+fog.xml::TileSet::1422909324::
+icon.png::ImageTexture::1422811193::
+tile_edit.scn::PackedScene::1422909313::
+troll.gd::GDScript::1422909940::
+troll.png::ImageTexture::1418669358::
+troll.scn::PackedScene::1418669358::

+ 12 - 0
demos/2d/fog_of_war/engine.cfg

@@ -0,0 +1,12 @@
+[application]
+
+name="Fog of War"
+main_scene="res://fog.scn"
+icon="icon.png"
+
+[input]
+
+move_up=[key(Up)]
+move_bottom=[key(Down)]
+move_left=[key(Left)]
+move_right=[key(Right)]

BIN
demos/2d/fog_of_war/floor.png


+ 86 - 0
demos/2d/fog_of_war/fog.gd

@@ -0,0 +1,86 @@
+
+extends TileMap
+
+# member variables here, example:
+# var a=2
+# var b="textvar"
+
+# boundarys for the fog rectangle
+var x_min = -20 # left start tile
+var x_max = 20 # right end tile
+var y_min = -20 # top start tile
+var y_max = 20 # bottom end tile
+
+var position # players position
+
+# iteration variables
+var x
+var y
+
+# variable to check if player moved
+var x_old
+var y_old
+
+# array to build up the visible area like a square
+# first value determines the width/height of the tip
+# here it would be 2*2 + 1 = 5 tiles wide/high
+# second value determines the total squares size
+# here it would be 5*2 + 1 = 10 tiles wide/high
+var l = range(2,5)
+
+# process that runs in realtime
+func _fixed_process(delta):
+	position = get_node("../troll").get_pos()
+	
+	# calculate the corresponding tile
+	# from the players position
+	x = int(position.x/get_cell_size().x)
+	# switching from positive to negative tile positions
+	# causes problems because of rounding problems
+	if position.x < 0:
+		x -= 1 # correct negative values
+	
+	y = int(position.y/get_cell_size().y)
+	if position.y < 0:
+		y -= 1
+		
+	# check if the player moved one tile further
+	if (x_old != x) or (y_old != y):
+		
+		# create the transparent part (visited area)
+		var end = l.size()-1
+		var start = 0
+		for steps in range(l.size()):
+			for m in range(x-l[end]-1,x+l[end]+2):
+				for n in range(y-l[start]-1,y+l[start]+2):
+					if get_cell(m,n) != 0:
+						set_cell(m,n,1,0,0)
+			end -= 1
+			start += 1
+	
+		# create the actual and active visible part
+		var end = l.size()-1
+		var start = 0
+		for steps in range(l.size()):
+			for m in range(x-l[end],x+l[end]+1):
+				for n in range(y-l[start],y+l[start]+1):
+					set_cell(m,n,-1)
+			end -= 1
+			start += 1
+		
+	x_old = x
+	y_old = y
+	
+	pass
+
+func _ready():
+	# Initalization here
+	
+	# create a square filled with the 100% opaque fog
+	for x in range(x_min,x_max):
+		for y in range(y_min,y_max):
+			set_cell(x,y,0,0,0)
+	set_fixed_process(true)
+	pass
+
+

BIN
demos/2d/fog_of_war/fog.png


BIN
demos/2d/fog_of_war/fog.scn


+ 29 - 0
demos/2d/fog_of_war/fog.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<resource_file type="TileSet" subresource_count="3" version="1.0" version_name="Godot Engine v1.0.stable.custom_build">
+	<ext_resource path="res://floor.png" type="Texture"></ext_resource>
+	<ext_resource path="res://fog.png" type="Texture"></ext_resource>
+	<main_resource>
+		<string name="0/name"> "fog opaque" </string>
+		<resource name="0/texture" resource_type="Texture" path="res://fog.png">  </resource>
+		<vector2 name="0/tex_offset"> -48, -48 </vector2>
+		<vector2 name="0/shape_offset"> 0, 0 </vector2>
+		<rect2 name="0/region"> 0, 0, 144, 144 </rect2>
+		<array name="0/shapes" len="0" shared="false">
+		</array>
+		<string name="1/name"> "fog transparent" </string>
+		<resource name="1/texture" resource_type="Texture" path="res://fog.png">  </resource>
+		<vector2 name="1/tex_offset"> -48, -48 </vector2>
+		<vector2 name="1/shape_offset"> 0, 0 </vector2>
+		<rect2 name="1/region"> 144, 0, 144, 144 </rect2>
+		<array name="1/shapes" len="0" shared="false">
+		</array>
+		<string name="2/name"> "floor" </string>
+		<resource name="2/texture" resource_type="Texture" path="res://floor.png">  </resource>
+		<vector2 name="2/tex_offset"> 0, 0 </vector2>
+		<vector2 name="2/shape_offset"> 0, 0 </vector2>
+		<rect2 name="2/region"> 0, 0, 0, 0 </rect2>
+		<array name="2/shapes" len="0" shared="false">
+		</array>
+
+	</main_resource>
+</resource_file>

BIN
demos/2d/fog_of_war/icon.png


+ 1 - 0
demos/2d/fog_of_war/icon.png.flags

@@ -0,0 +1 @@
+gen_mipmaps=true

BIN
demos/2d/fog_of_war/tile_edit.scn


+ 43 - 0
demos/2d/fog_of_war/troll.gd

@@ -0,0 +1,43 @@
+
+extends KinematicBody2D
+
+# This is a simple collision demo showing how
+# the kinematic cotroller works.
+# move() will allow to move the node, and will
+# always move it to a non-colliding spot, 
+# as long as it starts from a non-colliding spot too.
+
+
+#pixels / second
+const MOTION_SPEED=160
+
+func _fixed_process(delta):
+
+	var motion = Vector2()
+	
+	if (Input.is_action_pressed("move_up")):
+		motion+=Vector2(0,-1)
+	if (Input.is_action_pressed("move_bottom")):
+		motion+=Vector2(0,1)
+	if (Input.is_action_pressed("move_left")):
+		motion+=Vector2(-1,0)
+	if (Input.is_action_pressed("move_right")):
+		motion+=Vector2(1,0)
+	
+	motion = motion.normalized() * MOTION_SPEED * delta
+	motion = move(motion)
+	
+	#make character slide nicely through the world	
+	var slide_attempts = 4
+	while(is_colliding() and slide_attempts>0):
+		motion = get_collision_normal().slide(motion)
+		motion=move(motion)
+		slide_attempts-=1
+	
+
+func _ready():
+	# Initalization here
+	set_fixed_process(true)
+	pass
+
+

BIN
demos/2d/fog_of_war/troll.png


BIN
demos/2d/fog_of_war/troll.scn