diff --git a/3d/platformer/bullet.gd b/3d/platformer/bullet.gd new file mode 100644 index 00000000..29219403 --- /dev/null +++ b/3d/platformer/bullet.gd @@ -0,0 +1,5 @@ + +extends RigidBody + +# Member variables +var disabled = false diff --git a/3d/platformer/bullet.scn b/3d/platformer/bullet.scn new file mode 100644 index 00000000..20a9e1ee Binary files /dev/null and b/3d/platformer/bullet.scn differ diff --git a/3d/platformer/coin.gd b/3d/platformer/coin.gd new file mode 100644 index 00000000..4d888799 --- /dev/null +++ b/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 diff --git a/3d/platformer/coin.scn b/3d/platformer/coin.scn new file mode 100644 index 00000000..d629ab12 Binary files /dev/null and b/3d/platformer/coin.scn differ diff --git a/3d/platformer/cutout.png b/3d/platformer/cutout.png new file mode 100644 index 00000000..f88a25cb Binary files /dev/null and b/3d/platformer/cutout.png differ diff --git a/3d/platformer/cutout.png.import b/3d/platformer/cutout.png.import new file mode 100644 index 00000000..85c44e9b --- /dev/null +++ b/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 diff --git a/3d/platformer/default_bus_layout.tres b/3d/platformer/default_bus_layout.tres new file mode 100644 index 00000000..55caf45c --- /dev/null +++ b/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 + diff --git a/3d/platformer/enemy.gd b/3d/platformer/enemy.gd new file mode 100644 index 00000000..a67b40b6 --- /dev/null +++ b/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() diff --git a/3d/platformer/enemy.scn b/3d/platformer/enemy.scn new file mode 100644 index 00000000..501f18f9 Binary files /dev/null and b/3d/platformer/enemy.scn differ diff --git a/3d/platformer/export_presets.cfg b/3d/platformer/export_presets.cfg new file mode 100644 index 00000000..30f3f1ec --- /dev/null +++ b/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" diff --git a/3d/platformer/follow_camera.gd b/3d/platformer/follow_camera.gd new file mode 100644 index 00000000..aa99a263 --- /dev/null +++ b/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) diff --git a/3d/platformer/icon.png b/3d/platformer/icon.png new file mode 100644 index 00000000..b2206e45 Binary files /dev/null and b/3d/platformer/icon.png differ diff --git a/3d/platformer/icon.png.import b/3d/platformer/icon.png.import new file mode 100644 index 00000000..2dab34bb --- /dev/null +++ b/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 diff --git a/3d/platformer/osb_down.png b/3d/platformer/osb_down.png new file mode 100644 index 00000000..96668328 Binary files /dev/null and b/3d/platformer/osb_down.png differ diff --git a/3d/platformer/osb_down.png.import b/3d/platformer/osb_down.png.import new file mode 100644 index 00000000..7839dcca --- /dev/null +++ b/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 diff --git a/3d/platformer/osb_fire.png b/3d/platformer/osb_fire.png new file mode 100644 index 00000000..6f914cfe Binary files /dev/null and b/3d/platformer/osb_fire.png differ diff --git a/3d/platformer/osb_fire.png.import b/3d/platformer/osb_fire.png.import new file mode 100644 index 00000000..a1ce074c --- /dev/null +++ b/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 diff --git a/3d/platformer/osb_jump.png b/3d/platformer/osb_jump.png new file mode 100644 index 00000000..72ba032d Binary files /dev/null and b/3d/platformer/osb_jump.png differ diff --git a/3d/platformer/osb_jump.png.import b/3d/platformer/osb_jump.png.import new file mode 100644 index 00000000..deb390ce --- /dev/null +++ b/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 diff --git a/3d/platformer/osb_left.png b/3d/platformer/osb_left.png new file mode 100644 index 00000000..b8e08c2c Binary files /dev/null and b/3d/platformer/osb_left.png differ diff --git a/3d/platformer/osb_left.png.import b/3d/platformer/osb_left.png.import new file mode 100644 index 00000000..4c27dee9 --- /dev/null +++ b/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 diff --git a/3d/platformer/osb_right.png b/3d/platformer/osb_right.png new file mode 100644 index 00000000..0e5cbb0d Binary files /dev/null and b/3d/platformer/osb_right.png differ diff --git a/3d/platformer/osb_right.png.import b/3d/platformer/osb_right.png.import new file mode 100644 index 00000000..0e24e0f6 --- /dev/null +++ b/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 diff --git a/3d/platformer/osb_up.png b/3d/platformer/osb_up.png new file mode 100644 index 00000000..5c229d30 Binary files /dev/null and b/3d/platformer/osb_up.png differ diff --git a/3d/platformer/osb_up.png.import b/3d/platformer/osb_up.png.import new file mode 100644 index 00000000..85b2e338 --- /dev/null +++ b/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 diff --git a/3d/platformer/panorama.png b/3d/platformer/panorama.png new file mode 100644 index 00000000..c53ebee4 Binary files /dev/null and b/3d/platformer/panorama.png differ diff --git a/3d/platformer/panorama.png.import b/3d/platformer/panorama.png.import new file mode 100644 index 00000000..58d953e6 --- /dev/null +++ b/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 diff --git a/3d/platformer/player.gd b/3d/platformer/player.gd new file mode 100644 index 00000000..d9967a7b --- /dev/null +++ b/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) diff --git a/3d/platformer/player.scn b/3d/platformer/player.scn new file mode 100644 index 00000000..ab5520b4 Binary files /dev/null and b/3d/platformer/player.scn differ diff --git a/3d/platformer/project.godot b/3d/platformer/project.godot new file mode 100644 index 00000000..b9778cc2 --- /dev/null +++ b/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 diff --git a/3d/platformer/robot_walk.wav b/3d/platformer/robot_walk.wav new file mode 100644 index 00000000..c31085e5 Binary files /dev/null and b/3d/platformer/robot_walk.wav differ diff --git a/3d/platformer/robot_walk.wav.import b/3d/platformer/robot_walk.wav.import new file mode 100644 index 00000000..22a32762 --- /dev/null +++ b/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 diff --git a/3d/platformer/robotrigged.scn b/3d/platformer/robotrigged.scn new file mode 100644 index 00000000..88868677 Binary files /dev/null and b/3d/platformer/robotrigged.scn differ diff --git a/3d/platformer/sb.cube b/3d/platformer/sb.cube new file mode 100644 index 00000000..c5e4acbc --- /dev/null +++ b/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 + diff --git a/3d/platformer/shine.png b/3d/platformer/shine.png new file mode 100644 index 00000000..5c722219 Binary files /dev/null and b/3d/platformer/shine.png differ diff --git a/3d/platformer/shine.png.import b/3d/platformer/shine.png.import new file mode 100644 index 00000000..1df8ac8d --- /dev/null +++ b/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 diff --git a/3d/platformer/sound_coin.wav b/3d/platformer/sound_coin.wav new file mode 100644 index 00000000..e78579f4 Binary files /dev/null and b/3d/platformer/sound_coin.wav differ diff --git a/3d/platformer/sound_coin.wav.import b/3d/platformer/sound_coin.wav.import new file mode 100644 index 00000000..519f6477 --- /dev/null +++ b/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 diff --git a/3d/platformer/sound_explode.wav b/3d/platformer/sound_explode.wav new file mode 100644 index 00000000..229c8539 Binary files /dev/null and b/3d/platformer/sound_explode.wav differ diff --git a/3d/platformer/sound_explode.wav.import b/3d/platformer/sound_explode.wav.import new file mode 100644 index 00000000..ebb5011d --- /dev/null +++ b/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 diff --git a/3d/platformer/sound_hit.wav b/3d/platformer/sound_hit.wav new file mode 100644 index 00000000..4fb3b138 Binary files /dev/null and b/3d/platformer/sound_hit.wav differ diff --git a/3d/platformer/sound_hit.wav.import b/3d/platformer/sound_hit.wav.import new file mode 100644 index 00000000..b0c43155 --- /dev/null +++ b/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 diff --git a/3d/platformer/sound_jump.wav b/3d/platformer/sound_jump.wav new file mode 100644 index 00000000..e9942e65 Binary files /dev/null and b/3d/platformer/sound_jump.wav differ diff --git a/3d/platformer/sound_jump.wav.import b/3d/platformer/sound_jump.wav.import new file mode 100644 index 00000000..620760ca --- /dev/null +++ b/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 diff --git a/3d/platformer/sound_shoot.wav b/3d/platformer/sound_shoot.wav new file mode 100644 index 00000000..ad74f328 Binary files /dev/null and b/3d/platformer/sound_shoot.wav differ diff --git a/3d/platformer/sound_shoot.wav.import b/3d/platformer/sound_shoot.wav.import new file mode 100644 index 00000000..2dd34178 --- /dev/null +++ b/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 diff --git a/3d/platformer/stage.scn b/3d/platformer/stage.scn new file mode 100644 index 00000000..853f30ee Binary files /dev/null and b/3d/platformer/stage.scn differ diff --git a/3d/platformer/texture.png b/3d/platformer/texture.png new file mode 100644 index 00000000..c8303733 Binary files /dev/null and b/3d/platformer/texture.png differ diff --git a/3d/platformer/texture.png.import b/3d/platformer/texture.png.import new file mode 100644 index 00000000..d6ac6152 --- /dev/null +++ b/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 diff --git a/3d/platformer/texturemr.png b/3d/platformer/texturemr.png new file mode 100644 index 00000000..77583711 Binary files /dev/null and b/3d/platformer/texturemr.png differ diff --git a/3d/platformer/texturemr.png.import b/3d/platformer/texturemr.png.import new file mode 100644 index 00000000..94a0d931 --- /dev/null +++ b/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 diff --git a/3d/platformer/tiles.res b/3d/platformer/tiles.res new file mode 100644 index 00000000..7937371a Binary files /dev/null and b/3d/platformer/tiles.res differ diff --git a/3d/platformer/tiles.scn b/3d/platformer/tiles.scn new file mode 100644 index 00000000..99ef0f87 Binary files /dev/null and b/3d/platformer/tiles.scn differ