فهرست منبع

Ported platformer demo

Juan Linietsky 8 سال پیش
والد
کامیت
194655c805
53فایلهای تغییر یافته به همراه1079 افزوده شده و 0 حذف شده
  1. 5 0
      3d/platformer/bullet.gd
  2. BIN
      3d/platformer/bullet.scn
  3. 11 0
      3d/platformer/coin.gd
  4. BIN
      3d/platformer/coin.scn
  5. BIN
      3d/platformer/cutout.png
  6. 23 0
      3d/platformer/cutout.png.import
  7. 58 0
      3d/platformer/default_bus_layout.tres
  8. 78 0
      3d/platformer/enemy.gd
  9. BIN
      3d/platformer/enemy.scn
  10. 221 0
      3d/platformer/export_presets.cfg
  11. 80 0
      3d/platformer/follow_camera.gd
  12. BIN
      3d/platformer/icon.png
  13. 23 0
      3d/platformer/icon.png.import
  14. BIN
      3d/platformer/osb_down.png
  15. 23 0
      3d/platformer/osb_down.png.import
  16. BIN
      3d/platformer/osb_fire.png
  17. 23 0
      3d/platformer/osb_fire.png.import
  18. BIN
      3d/platformer/osb_jump.png
  19. 23 0
      3d/platformer/osb_jump.png.import
  20. BIN
      3d/platformer/osb_left.png
  21. 23 0
      3d/platformer/osb_left.png.import
  22. BIN
      3d/platformer/osb_right.png
  23. 23 0
      3d/platformer/osb_right.png.import
  24. BIN
      3d/platformer/osb_up.png
  25. 23 0
      3d/platformer/osb_up.png.import
  26. BIN
      3d/platformer/panorama.png
  27. 23 0
      3d/platformer/panorama.png.import
  28. 186 0
      3d/platformer/player.gd
  29. BIN
      3d/platformer/player.scn
  30. 59 0
      3d/platformer/project.godot
  31. BIN
      3d/platformer/robot_walk.wav
  32. 16 0
      3d/platformer/robot_walk.wav.import
  33. BIN
      3d/platformer/robotrigged.scn
  34. 7 0
      3d/platformer/sb.cube
  35. BIN
      3d/platformer/shine.png
  36. 24 0
      3d/platformer/shine.png.import
  37. BIN
      3d/platformer/sound_coin.wav
  38. 16 0
      3d/platformer/sound_coin.wav.import
  39. BIN
      3d/platformer/sound_explode.wav
  40. 16 0
      3d/platformer/sound_explode.wav.import
  41. BIN
      3d/platformer/sound_hit.wav
  42. 16 0
      3d/platformer/sound_hit.wav.import
  43. BIN
      3d/platformer/sound_jump.wav
  44. 16 0
      3d/platformer/sound_jump.wav.import
  45. BIN
      3d/platformer/sound_shoot.wav
  46. 16 0
      3d/platformer/sound_shoot.wav.import
  47. BIN
      3d/platformer/stage.scn
  48. BIN
      3d/platformer/texture.png
  49. 23 0
      3d/platformer/texture.png.import
  50. BIN
      3d/platformer/texturemr.png
  51. 24 0
      3d/platformer/texturemr.png.import
  52. BIN
      3d/platformer/tiles.res
  53. BIN
      3d/platformer/tiles.scn

+ 5 - 0
3d/platformer/bullet.gd

@@ -0,0 +1,5 @@
+
+extends RigidBody
+
+# Member variables
+var disabled = false

BIN
3d/platformer/bullet.scn


+ 11 - 0
3d/platformer/coin.gd

@@ -0,0 +1,11 @@
+
+extends Area
+
+# Member variables
+var taken = false
+
+
+func _on_coin_body_enter(body):
+	if (not taken and body is preload("res://player.gd")):
+		get_node("anim").play("take")
+		taken = true

BIN
3d/platformer/coin.scn


BIN
3d/platformer/cutout.png


+ 23 - 0
3d/platformer/cutout.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/cutout.png-8aacc6c936bf12e889c8e11f6c4eb91c.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

+ 58 - 0
3d/platformer/default_bus_layout.tres

@@ -0,0 +1,58 @@
+[gd_resource type="AudioBusLayout" load_steps=4 format=2]
+
+[sub_resource type="AudioEffectReverb" id=1]
+
+resource_name = "Reverb"
+predelay_msec = 150.0
+predelay_feedback = 150.0
+room_size = 0.33
+damping = 0.32
+spread = 1.0
+hipass = 0.9
+dry = 0.0
+wet = 1.0
+
+[sub_resource type="AudioEffectAmplify" id=2]
+
+resource_name = "Amplify"
+volume_db = 0.0
+
+[sub_resource type="AudioEffectReverb" id=3]
+
+resource_name = "Reverb"
+predelay_msec = 150.0
+predelay_feedback = 150.0
+room_size = 0.89
+damping = 0.17
+spread = 1.0
+hipass = 0.08
+dry = 0.0
+wet = 0.36
+
+[resource]
+
+bus/0/name = "Master"
+bus/0/solo = false
+bus/0/mute = false
+bus/0/bypass_fx = false
+bus/0/volume_db = 0.0
+bus/0/send = ""
+bus/1/name = "Reverb Small"
+bus/1/solo = false
+bus/1/mute = false
+bus/1/bypass_fx = false
+bus/1/volume_db = 0.0
+bus/1/send = "Master"
+bus/1/effect/0/effect = SubResource( 1 )
+bus/1/effect/0/enabled = true
+bus/1/effect/1/effect = SubResource( 2 )
+bus/1/effect/1/enabled = true
+bus/2/name = "Reverb Large"
+bus/2/solo = false
+bus/2/mute = false
+bus/2/bypass_fx = false
+bus/2/volume_db = 0.0
+bus/2/send = "Master"
+bus/2/effect/0/effect = SubResource( 3 )
+bus/2/effect/0/enabled = true
+

+ 78 - 0
3d/platformer/enemy.gd

@@ -0,0 +1,78 @@
+
+extends RigidBody
+
+# Member variables
+const STATE_WALKING = 0
+const STATE_DYING = 1
+
+var prev_advance = false
+var deaccel = 20.0
+var accel = 5
+var max_speed = 2
+var rot_dir = 4
+var rot_speed = 1
+
+var dying = false
+
+
+func _integrate_forces(state):
+	var delta = state.get_step()
+	var lv = state.get_linear_velocity()
+	var g = state.get_total_gravity()
+
+	lv += g*delta # Apply gravity
+	var up = -g.normalized()
+	
+	if (dying):
+		state.set_linear_velocity(lv)
+		return
+	
+	for i in range(state.get_contact_count()):
+		var cc = state.get_contact_collider_object(i)
+		var dp = state.get_contact_local_normal(i)
+		
+		if (cc):
+			if (cc is preload("res://bullet.gd") and not cc.disabled):
+				set_mode(MODE_RIGID)
+				dying = true
+				#lv = s.get_contact_local_normal(i)*400
+				state.set_angular_velocity(-dp.cross(up).normalized()*33.0)
+				get_node("AnimationPlayer").play("impact")
+				get_node("AnimationPlayer").queue("explode")
+				set_friction(1)
+				cc.disabled = true
+				get_node("sound_hit").play()
+				return
+	
+	var col_floor = get_node("Armature/ray_floor").is_colliding()
+	var col_wall = get_node("Armature/ray_wall").is_colliding()
+	
+	var advance = not col_wall and col_floor
+	
+	var dir = get_node("Armature").get_transform().basis[2].normalized()
+	var deaccel_dir = dir
+	
+	if (advance):
+		if (dir.dot(lv) < max_speed):
+			lv += dir*accel*delta
+		deaccel_dir = dir.cross(g).normalized()
+	else:
+		if (prev_advance):
+			rot_dir = 1 # randf()*2.0 - 1.0
+		
+		dir = Basis(up, rot_dir*rot_speed*delta).xform(dir)
+		get_node("Armature").set_transform(Transform().looking_at(-dir, up))
+	
+	var dspeed = deaccel_dir.dot(lv)
+	dspeed -= deaccel*delta
+	if (dspeed < 0):
+		dspeed = 0
+	
+	lv = lv - deaccel_dir*deaccel_dir.dot(lv) + deaccel_dir*dspeed
+	
+	state.set_linear_velocity(lv)
+	prev_advance = advance
+
+
+func _die():
+	queue_free()

BIN
3d/platformer/enemy.scn


+ 221 - 0
3d/platformer/export_presets.cfg

@@ -0,0 +1,221 @@
+[preset.0]
+
+exclude_filter=""
+export_filter="all_resources"
+include_filter=""
+name="Linux/X11"
+patch_list=PoolStringArray(  )
+platform="Linux/X11"
+runnable=true
+
+[preset.0.options]
+
+binary_format/64_bits=true
+custom_template/debug=""
+custom_template/release=""
+texture_format/etc=false
+texture_format/etc2=false
+texture_format/s3tc=true
+
+[preset.1]
+
+exclude_filter=""
+export_filter="all_resources"
+include_filter=""
+name="Android"
+patch_list=PoolStringArray(  )
+platform="Android"
+runnable=true
+
+[preset.1.options]
+
+apk_expansion/SALT=""
+apk_expansion/enable=false
+apk_expansion/public_key=""
+architecture/arm=true
+architecture/x86=false
+command_line/extra_args=""
+custom_package/debug=""
+custom_package/release=""
+keystore/release=""
+keystore/release_password=""
+keystore/release_user=""
+one_click_deploy/clear_previous_install=true
+package/icon=""
+package/name=""
+package/signed=true
+package/unique_name="org.godotengine.$genname"
+permissions/access_checkin_properties=false
+permissions/access_coarse_location=false
+permissions/access_fine_location=false
+permissions/access_location_extra_commands=false
+permissions/access_mock_location=false
+permissions/access_network_state=false
+permissions/access_surface_flinger=false
+permissions/access_wifi_state=false
+permissions/account_manager=false
+permissions/add_voicemail=false
+permissions/authenticate_accounts=false
+permissions/battery_stats=false
+permissions/bind_accessibility_service=false
+permissions/bind_appwidget=false
+permissions/bind_device_admin=false
+permissions/bind_input_method=false
+permissions/bind_nfc_service=false
+permissions/bind_notification_listener_service=false
+permissions/bind_print_service=false
+permissions/bind_remoteviews=false
+permissions/bind_text_service=false
+permissions/bind_vpn_service=false
+permissions/bind_wallpaper=false
+permissions/bluetooth=false
+permissions/bluetooth_admin=false
+permissions/bluetooth_privileged=false
+permissions/brick=false
+permissions/broadcast_package_removed=false
+permissions/broadcast_sms=false
+permissions/broadcast_sticky=false
+permissions/broadcast_wap_push=false
+permissions/call_phone=false
+permissions/call_privileged=false
+permissions/camera=false
+permissions/capture_audio_output=false
+permissions/capture_secure_video_output=false
+permissions/capture_video_output=false
+permissions/change_component_enabled_state=false
+permissions/change_configuration=false
+permissions/change_network_state=false
+permissions/change_wifi_multicast_state=false
+permissions/change_wifi_state=false
+permissions/clear_app_cache=false
+permissions/clear_app_user_data=false
+permissions/control_location_updates=false
+permissions/delete_cache_files=false
+permissions/delete_packages=false
+permissions/device_power=false
+permissions/diagnostic=false
+permissions/disable_keyguard=false
+permissions/dump=false
+permissions/expand_status_bar=false
+permissions/factory_test=false
+permissions/flashlight=false
+permissions/force_back=false
+permissions/get_accounts=false
+permissions/get_package_size=false
+permissions/get_tasks=false
+permissions/get_top_activity_info=false
+permissions/global_search=false
+permissions/hardware_test=false
+permissions/inject_events=false
+permissions/install_location_provider=false
+permissions/install_packages=false
+permissions/install_shortcut=false
+permissions/internal_system_window=false
+permissions/internet=false
+permissions/kill_background_processes=false
+permissions/location_hardware=false
+permissions/manage_accounts=false
+permissions/manage_app_tokens=false
+permissions/manage_documents=false
+permissions/master_clear=false
+permissions/media_content_control=false
+permissions/modify_audio_settings=false
+permissions/modify_phone_state=false
+permissions/mount_format_filesystems=false
+permissions/mount_unmount_filesystems=false
+permissions/nfc=false
+permissions/persistent_activity=false
+permissions/process_outgoing_calls=false
+permissions/read_calendar=false
+permissions/read_call_log=false
+permissions/read_contacts=false
+permissions/read_external_storage=false
+permissions/read_frame_buffer=false
+permissions/read_history_bookmarks=false
+permissions/read_input_state=false
+permissions/read_logs=false
+permissions/read_phone_state=false
+permissions/read_profile=false
+permissions/read_sms=false
+permissions/read_social_stream=false
+permissions/read_sync_settings=false
+permissions/read_sync_stats=false
+permissions/read_user_dictionary=false
+permissions/reboot=false
+permissions/receive_boot_completed=false
+permissions/receive_mms=false
+permissions/receive_sms=false
+permissions/receive_wap_push=false
+permissions/record_audio=false
+permissions/reorder_tasks=false
+permissions/restart_packages=false
+permissions/send_respond_via_message=false
+permissions/send_sms=false
+permissions/set_activity_watcher=false
+permissions/set_alarm=false
+permissions/set_always_finish=false
+permissions/set_animation_scale=false
+permissions/set_debug_app=false
+permissions/set_orientation=false
+permissions/set_pointer_speed=false
+permissions/set_preferred_applications=false
+permissions/set_process_limit=false
+permissions/set_time=false
+permissions/set_time_zone=false
+permissions/set_wallpaper=false
+permissions/set_wallpaper_hints=false
+permissions/signal_persistent_processes=false
+permissions/status_bar=false
+permissions/subscribed_feeds_read=false
+permissions/subscribed_feeds_write=false
+permissions/system_alert_window=false
+permissions/transmit_ir=false
+permissions/uninstall_shortcut=false
+permissions/update_device_stats=false
+permissions/use_credentials=false
+permissions/use_sip=false
+permissions/vibrate=false
+permissions/wake_lock=false
+permissions/write_apn_settings=false
+permissions/write_calendar=false
+permissions/write_call_log=false
+permissions/write_contacts=false
+permissions/write_external_storage=false
+permissions/write_gservices=false
+permissions/write_history_bookmarks=false
+permissions/write_profile=false
+permissions/write_secure_settings=false
+permissions/write_settings=false
+permissions/write_sms=false
+permissions/write_social_stream=false
+permissions/write_sync_settings=false
+permissions/write_user_dictionary=false
+screen/immersive_mode=true
+screen/orientation=0
+screen/support_large=true
+screen/support_normal=true
+screen/support_small=true
+screen/support_xlarge=true
+screen/use_32_bits_view=true
+user_permissions/0=false
+user_permissions/1=false
+user_permissions/10=false
+user_permissions/11=false
+user_permissions/12=false
+user_permissions/13=false
+user_permissions/14=false
+user_permissions/15=false
+user_permissions/16=false
+user_permissions/17=false
+user_permissions/18=false
+user_permissions/19=false
+user_permissions/2=false
+user_permissions/3=false
+user_permissions/4=false
+user_permissions/5=false
+user_permissions/6=false
+user_permissions/7=false
+user_permissions/8=false
+user_permissions/9=false
+version/code=1
+version/name="1.0"

+ 80 - 0
3d/platformer/follow_camera.gd

@@ -0,0 +1,80 @@
+
+extends Camera
+
+# Member variables
+var collision_exception = []
+export var min_distance = 0.5
+export var max_distance = 4.0
+export var angle_v_adjust = 0.0
+export var autoturn_ray_aperture = 25
+export var autoturn_speed = 50
+var max_height = 2.0
+var min_height = 0
+
+func _fixed_process(dt):
+	var target = get_parent().get_global_transform().origin
+	var pos = get_global_transform().origin
+	var up = Vector3(0, 1, 0)
+	
+	var delta = pos - target
+	
+	# Regular delta follow
+	
+	# Check ranges
+	if (delta.length() < min_distance):
+		delta = delta.normalized()*min_distance
+	elif (delta.length() > max_distance):
+		delta = delta.normalized()*max_distance
+	
+	# Check upper and lower height
+	if (delta.y > max_height):
+		delta.y = max_height
+	if (delta.y < min_height):
+		delta.y = min_height
+		
+	# Check autoturn
+	var ds = PhysicsServer.space_get_direct_state(get_world().get_space())
+	
+	var col_left = ds.intersect_ray(target, target + Basis(up, deg2rad(autoturn_ray_aperture)).xform(delta), collision_exception)
+	var col = ds.intersect_ray(target, target + delta, collision_exception)
+	var col_right = ds.intersect_ray(target, target + Basis(up, deg2rad(-autoturn_ray_aperture)).xform(delta), collision_exception)
+	
+	if (!col.empty()):
+		# If main ray was occluded, get camera closer, this is the worst case scenario
+		delta = col.position - target	
+	elif (!col_left.empty() and col_right.empty()):
+		# If only left ray is occluded, turn the camera around to the right
+		delta = Basis(up, deg2rad(-dt*autoturn_speed)).xform(delta)
+	elif (col_left.empty() and !col_right.empty()):
+		# If only right ray is occluded, turn the camera around to the left
+		delta = Basis(up, deg2rad(dt*autoturn_speed)).xform(delta)
+	else:
+		# Do nothing otherwise, left and right are occluded but center is not, so do not autoturn
+		pass
+	
+	# Apply lookat
+	if (delta == Vector3()):
+		delta = (pos - target).normalized()*0.0001
+
+	pos = target + delta
+	
+	look_at_from_pos(pos, target, up)
+	
+	# Turn a little up or down
+	var t = get_transform()
+	t.basis = Basis(t.basis[0], deg2rad(angle_v_adjust))*t.basis
+	set_transform(t)
+
+
+func _ready():
+	# Find collision exceptions for ray
+	var node = self
+	while(node):
+		if (node is RigidBody):
+			collision_exception.append(node.get_rid())
+			break
+		else:
+			node = node.get_parent()
+	set_fixed_process(true)
+	# This detaches the camera transform from the parent spatial node
+	set_as_toplevel(true)

BIN
3d/platformer/icon.png


+ 23 - 0
3d/platformer/icon.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/osb_down.png


+ 23 - 0
3d/platformer/osb_down.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/osb_down.png-4a1ab934f787719766862b499528d054.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/osb_fire.png


+ 23 - 0
3d/platformer/osb_fire.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/osb_fire.png-e657a73546eb75918e9d9a3fea15cf70.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/osb_jump.png


+ 23 - 0
3d/platformer/osb_jump.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/osb_jump.png-dbbef3b47abbb562ce6c81a9701121c6.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/osb_left.png


+ 23 - 0
3d/platformer/osb_left.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/osb_left.png-fc7230aeb0eec74933ed08f89b893288.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/osb_right.png


+ 23 - 0
3d/platformer/osb_right.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/osb_right.png-5cf5add2dbc1c8dde17173ac56f3a004.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/osb_up.png


+ 23 - 0
3d/platformer/osb_up.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/osb_up.png-6a05b6a7bf0ede3756308a5cffdd2b9a.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

BIN
3d/platformer/panorama.png


+ 23 - 0
3d/platformer/panorama.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/panorama.png-e05131d3dca9fd5b03101f18fbe08995.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=true

+ 186 - 0
3d/platformer/player.gd

@@ -0,0 +1,186 @@
+
+extends KinematicBody
+
+# Member variables
+const ANIM_FLOOR = 0
+const ANIM_AIR_UP = 1
+const ANIM_AIR_DOWN = 2
+
+const SHOOT_TIME = 1.5
+const SHOOT_SCALE = 2
+
+const CHAR_SCALE = Vector3(0.3, 0.3, 0.3)
+
+var facing_dir = Vector3(1, 0, 0)
+var movement_dir = Vector3()
+
+var jumping = false
+
+var turn_speed = 40
+var keep_jump_inertia = true
+var air_idle_deaccel = false
+var accel = 19.0
+var deaccel = 14.0
+var sharp_turn_threshold = 140
+
+var max_speed = 3.1
+
+var prev_shoot = false
+
+var linear_velocity=Vector3()
+
+var shoot_blend = 0
+
+func adjust_facing(p_facing, p_target, p_step, p_adjust_rate, current_gn):
+	var n = p_target # Normal
+	var t = n.cross(current_gn).normalized()
+	 
+	var x = n.dot(p_facing)
+	var y = t.dot(p_facing)
+	
+	var ang = atan2(y,x)
+	
+	if (abs(ang) < 0.001): # Too small
+		return p_facing
+	
+	var s = sign(ang)
+	ang = ang*s
+	var turn = ang*p_adjust_rate*p_step
+	var a
+	if (ang < turn):
+		a = ang
+	else:
+		a = turn
+	ang = (ang - a)*s
+	
+	return (n*cos(ang) + t*sin(ang))*p_facing.length()
+
+
+func _fixed_process(delta):
+	
+	var lv = linear_velocity
+	var g = Vector3(0,-9.8,0)
+
+#	var d = 1.0 - delta*state.get_total_density()
+#	if (d < 0):
+#		d = 0
+	lv += g*delta # Apply gravity
+	
+	var anim = ANIM_FLOOR
+	
+	var up = -g.normalized() # (up is against gravity)
+	var vv = up.dot(lv) # Vertical velocity
+	var hv = lv - up*vv # Horizontal velocity
+	
+	var hdir = hv.normalized() # Horizontal direction
+	var hspeed = hv.length() # Horizontal speed
+	
+
+	
+	var dir = Vector3() # Where does the player intend to walk to
+	var cam_xform = get_node("target/camera").get_global_transform()
+	
+	if (Input.is_action_pressed("move_forward")):
+		dir += -cam_xform.basis[2]
+	if (Input.is_action_pressed("move_backwards")):
+		dir += cam_xform.basis[2]
+	if (Input.is_action_pressed("move_left")):
+		dir += -cam_xform.basis[0]
+	if (Input.is_action_pressed("move_right")):
+		dir += cam_xform.basis[0]
+	
+	var jump_attempt = Input.is_action_pressed("jump")
+	var shoot_attempt = Input.is_action_pressed("shoot")
+	
+	var target_dir = (dir - up*dir.dot(up)).normalized()
+	
+	if (is_on_floor()):
+		var sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshold
+		
+		if (dir.length() > 0.1 and !sharp_turn):
+			if (hspeed > 0.001):
+				#linear_dir = linear_h_velocity/linear_vel
+				#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir) < -cos(Math::deg2rad(brake_angular_limit)))
+				#	brake = true
+				#else
+				hdir = adjust_facing(hdir, target_dir, delta, 1.0/hspeed*turn_speed, up)
+				facing_dir = hdir
+			else:
+				hdir = target_dir
+			
+			if (hspeed < max_speed):
+				hspeed += accel*delta
+		else:
+			hspeed -= deaccel*delta
+			if (hspeed < 0):
+				hspeed = 0
+		
+		hv = hdir*hspeed
+		
+		var mesh_xform = get_node("Armature").get_transform()
+		var facing_mesh = -mesh_xform.basis[0].normalized()
+		facing_mesh = (facing_mesh - up*facing_mesh.dot(up)).normalized()
+		facing_mesh = adjust_facing(facing_mesh, target_dir, delta, 1.0/hspeed*turn_speed, up)
+		var m3 = Basis(-facing_mesh, up, -facing_mesh.cross(up).normalized()).scaled(CHAR_SCALE)
+		
+		get_node("Armature").set_transform(Transform(m3, mesh_xform.origin))
+		
+		if (not jumping and jump_attempt):
+			vv = 7.0
+			jumping = true
+			get_node("sound_jump").play()
+	else:
+		if (vv > 0):
+			anim = ANIM_AIR_UP
+		else:
+			anim = ANIM_AIR_DOWN
+		
+		var hs
+		if (dir.length() > 0.1):
+			hv += target_dir*(accel*0.2)*delta
+			if (hv.length() > max_speed):
+				hv = hv.normalized()*max_speed
+		else:
+			if (air_idle_deaccel):
+				hspeed = hspeed - (deaccel*0.2)*delta
+				if (hspeed < 0):
+					hspeed = 0
+				
+				hv = hdir*hspeed
+	
+	if (jumping and vv < 0):
+		jumping = false
+	
+	lv = hv + up*vv
+	
+	if (is_on_floor()):
+		movement_dir = lv
+		
+	linear_velocity = move_and_slide(lv,-g.normalized())
+	
+	if (shoot_blend > 0):
+		shoot_blend -= delta*SHOOT_SCALE
+		if (shoot_blend < 0):
+			shoot_blend = 0
+	
+	if (shoot_attempt and not prev_shoot):
+		shoot_blend = SHOOT_TIME
+		var bullet = preload("res://bullet.scn").instance()
+		bullet.set_transform(get_node("Armature/bullet").get_global_transform().orthonormalized())
+		get_parent().add_child(bullet)
+		bullet.set_linear_velocity(get_node("Armature/bullet").get_global_transform().basis[2].normalized()*20)
+		bullet.add_collision_exception_with(self) # Add it to bullet
+		get_node("sound_shoot").play()
+	
+	prev_shoot = shoot_attempt
+	
+	if (is_on_floor()):
+		get_node("AnimationTreePlayer").blend2_node_set_amount("walk", hspeed/max_speed)
+	
+	get_node("AnimationTreePlayer").transition_node_set_current("state", anim)
+	get_node("AnimationTreePlayer").blend2_node_set_amount("gun", min(shoot_blend, 1.0))
+#	state.set_angular_velocity(Vector3())
+
+
+func _ready():
+	get_node("AnimationTreePlayer").set_active(true)

BIN
3d/platformer/player.scn


+ 59 - 0
3d/platformer/project.godot

@@ -0,0 +1,59 @@
+config_version=3
+[application]
+
+name="Platformer 3D"
+main_scene="res://stage.scn"
+
+[input]
+
+ui_accept=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_select=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_cancel=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_focus_next=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777218,"unicode":0,"echo":false,"script":null)
+ ]
+ui_focus_prev=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777218,"unicode":0,"echo":false,"script":null)
+ ]
+ui_left=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_right=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_up=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_down=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+ ]
+ui_page_up=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777235,"unicode":0,"echo":false,"script":null)
+ ]
+ui_page_down=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777236,"unicode":0,"echo":false,"script":null)
+ ]
+move_forward=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
+ ]
+move_backwards=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
+ ]
+move_left=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
+ ]
+move_right=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
+ ]
+jump=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+ ]
+shoot=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null)
+ ]
+
+[memory]
+
+multithread/thread_rid_pool_prealloc=60
+
+[rendering]
+
+quality/msaa=2

BIN
3d/platformer/robot_walk.wav


+ 16 - 0
3d/platformer/robot_walk.wav.import

@@ -0,0 +1,16 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/robot_walk.wav-4313e7d5f563e62e3923080b14a79c15.sample"
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=true
+edit/loop=true
+compress/mode=0

BIN
3d/platformer/robotrigged.scn


+ 7 - 0
3d/platformer/sb.cube

@@ -0,0 +1,7 @@
+sb_left.png
+sb_right.png
+sb_bottom.png
+sb_top.png
+sb_back.png
+sb_front.png
+

BIN
3d/platformer/shine.png


+ 24 - 0
3d/platformer/shine.png.import

@@ -0,0 +1,24 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/shine.png-a8253c1d2dc8acbf187823f695c13207.s3tc.stex"
+path.etc2="res://.import/shine.png-a8253c1d2dc8acbf187823f695c13207.etc2.stex"
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=false

BIN
3d/platformer/sound_coin.wav


+ 16 - 0
3d/platformer/sound_coin.wav.import

@@ -0,0 +1,16 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/sound_coin.wav-b4defacd1a1eab95585c7b5095506878.sample"
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=true
+edit/loop=false
+compress/mode=0

BIN
3d/platformer/sound_explode.wav


+ 16 - 0
3d/platformer/sound_explode.wav.import

@@ -0,0 +1,16 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/sound_explode.wav-23e94be75a4346bffb517c7e07035977.sample"
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=true
+edit/loop=false
+compress/mode=0

BIN
3d/platformer/sound_hit.wav


+ 16 - 0
3d/platformer/sound_hit.wav.import

@@ -0,0 +1,16 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/sound_hit.wav-d8455980ada2d4a9a73508948d7317cc.sample"
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=true
+edit/loop=false
+compress/mode=0

BIN
3d/platformer/sound_jump.wav


+ 16 - 0
3d/platformer/sound_jump.wav.import

@@ -0,0 +1,16 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/sound_jump.wav-4966d1f327e26a176b56ab335c03b5e1.sample"
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=true
+edit/loop=false
+compress/mode=0

BIN
3d/platformer/sound_shoot.wav


+ 16 - 0
3d/platformer/sound_shoot.wav.import

@@ -0,0 +1,16 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/sound_shoot.wav-f0f26619cba21d411b53ad23b8788116.sample"
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=true
+edit/loop=false
+compress/mode=0

BIN
3d/platformer/stage.scn


BIN
3d/platformer/texture.png


+ 23 - 0
3d/platformer/texture.png.import

@@ -0,0 +1,23 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/texture.png-77dc6ecaf884a35cd9dbaf886cacc46d.stex"
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=1
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=false
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=false

BIN
3d/platformer/texturemr.png


+ 24 - 0
3d/platformer/texturemr.png.import

@@ -0,0 +1,24 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/texturemr.png-0568a8b09834741143da53ce460e36f1.s3tc.stex"
+path.etc2="res://.import/texturemr.png-0568a8b09834741143da53ce460e36f1.etc2.stex"
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/HDR_as_SRGB=false
+stream=false
+size_limit=0
+detect_3d=false

BIN
3d/platformer/tiles.res


BIN
3d/platformer/tiles.scn