From 501cbd41d4f08835bc08f231f49be32debd8557c Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Wed, 24 Nov 2021 10:35:54 -0600 Subject: [PATCH] Backport rewrite of the getting started series for Godot 3 --- .../editor/img/editable-children.png | Bin 14724 -> 0 bytes .../editor/img/godot-gui-overlay.png | Bin 53718 -> 0 bytes .../editor/img/save-branch-as-scene.png | Bin 13126 -> 0 bytes .../editor/img/unity-gui-overlay.png | Bin 29405 -> 0 bytes .../unity-project-organization-example.png | Bin 12576 -> 0 bytes getting_started/editor/unity_to_godot.rst | 253 ---- .../editor/using_the_web_editor.rst | 124 -- .../first_2d_game/01.project_setup.rst | 77 + .../first_2d_game/02.player_scene.rst | 100 ++ .../first_2d_game/03.coding_the_player.rst | 515 +++++++ .../first_2d_game/04.creating_the_enemy.rst | 180 +++ .../first_2d_game/05.the_main_game_scene.rst | 446 ++++++ .../first_2d_game/06.heads_up_display.rst | 437 ++++++ .../first_2d_game/07.finishing-up.rst | 72 + .../files/dodge_assets.zip | Bin .../files/dodge_assets_with_gdnative.zip | Bin 0 -> 1821507 bytes .../img/add_node.png | Bin .../first_2d_game/img/add_script_button.png | Bin 0 -> 6412 bytes .../img/attach_node_window.png | Bin .../img/completed_main_scene.png | Bin 0 -> 5661 bytes .../first_2d_game/img/custom_font1.png | Bin 0 -> 20079 bytes .../first_2d_game/img/custom_font2.png | Bin 0 -> 15059 bytes .../first_2d_game/img/custom_font3.png | Bin 0 -> 11110 bytes .../img/dodge_preview.gif | Bin .../img/draw_path2d.gif | Bin .../first_2d_game/img/export_variable.png | Bin 0 -> 29159 bytes .../img/filesystem_dock.png | Bin .../first_2d_game/img/folder-content.png | Bin 0 -> 16999 bytes .../img/grid_snap_button.png | Bin .../img/group_tab.png | Bin .../first_2d_game/img/instance_scene.png | Bin 0 -> 2738 bytes .../img/lock_children.png | Bin .../img/main_scene_nodes.png | Bin .../img/mob_animations.gif | Bin .../first_2d_game/img/new-project-button.png | Bin 0 -> 35646 bytes .../first_2d_game/img/path2d_buttons.png | Bin 0 -> 1885 bytes .../first_2d_game/img/player_coll_shape.png | Bin 0 -> 34078 bytes .../first_2d_game/img/player_scale.png | Bin 0 -> 22522 bytes .../first_2d_game/img/player_scene_nodes.png | Bin 0 -> 6117 bytes .../img/player_signal_connection.png | Bin .../img/player_signals.png | Bin .../first_2d_game/img/set_collision_mask.png | Bin 0 -> 17438 bytes .../img/setting-project-width-and-height.png | Bin 0 -> 17911 bytes .../img/setting-stretch-mode.png | Bin 0 -> 19189 bytes .../img/spriteframes_panel.png | Bin .../img/spriteframes_panel2.png | Bin .../img/start_button_shortcut.png | Bin 0 -> 3798 bytes .../first_2d_game/img/ui_anchor.png | Bin 0 -> 44157 bytes getting_started/first_2d_game/index.rst | 8 +- .../first_3d_game/01.game_setup.rst | 164 +++ .../first_3d_game/02.player_input.rst | 177 +++ .../first_3d_game/03.player_movement_code.rst | 413 ++++++ .../first_3d_game/04.mob_scene.rst | 332 +++++ .../first_3d_game/05.spawning_mobs.rst | 360 +++++ .../first_3d_game/06.jump_and_squash.rst | 353 +++++ .../first_3d_game/07.killing_player.rst | 467 ++++++ .../first_3d_game/08.score_and_replay.rst | 475 ++++++ .../first_3d_game/09.adding_animations.rst | 565 +++++++ .../first_3d_game/going_further.rst | 42 + .../img/01.game_setup/01.import_button.png | Bin 0 -> 12791 bytes .../02.browse_to_project_folder.png | Bin 0 -> 6108 bytes .../img/01.game_setup/03.import_and_edit.png | Bin 0 -> 3737 bytes .../img/01.game_setup/04.start_assets.png | Bin 0 -> 7114 bytes .../img/01.game_setup/05.main_node.png | Bin 0 -> 1443 bytes .../img/01.game_setup/06.staticbody_node.png | Bin 0 -> 2698 bytes .../07.collision_shape_warning.png | Bin 0 -> 3383 bytes .../img/01.game_setup/08.create_box_shape.png | Bin 0 -> 8232 bytes .../img/01.game_setup/09.box_extents.png | Bin 0 -> 2948 bytes .../img/01.game_setup/10.mesh_instance.png | Bin 0 -> 3285 bytes .../img/01.game_setup/11.cube_mesh.png | Bin 0 -> 4873 bytes .../img/01.game_setup/12.cube_resized.png | Bin 0 -> 3572 bytes .../01.game_setup/13.move_gizmo_y_axis.png | Bin 0 -> 16409 bytes .../img/01.game_setup/14.select_mode_icon.png | Bin 0 -> 1016 bytes .../01.game_setup/15.translation_amount.png | Bin 0 -> 1450 bytes .../img/01.game_setup/16.turn_on_shadows.png | Bin 0 -> 3955 bytes .../01.game_setup/17.project_with_light.png | Bin 0 -> 43403 bytes .../img/02.player_input/01.new_scene.png | Bin 0 -> 3825 bytes .../02.instantiating_the_model.png | Bin 0 -> 2530 bytes .../02.player_input/03.scene_structure.png | Bin 0 -> 2473 bytes .../img/02.player_input/04.sphere_shape.png | Bin 0 -> 9184 bytes .../05.moving_the_sphere_up.png | Bin 0 -> 6249 bytes .../06.toggling_visibility.png | Bin 0 -> 3119 bytes .../img/02.player_input/07.adding_action.png | Bin 0 -> 3769 bytes .../img/02.player_input/07.input_map_tab.png | Bin 0 -> 15993 bytes .../02.player_input/07.project_settings.png | Bin 0 -> 5362 bytes .../02.player_input/08.actions_list_empty.png | Bin 0 -> 1851 bytes .../02.player_input/08.create_key_action.png | Bin 0 -> 1855 bytes .../02.player_input/09.keyboard_key_popup.png | Bin 0 -> 1362 bytes .../img/02.player_input/09.keyboard_keys.png | Bin 0 -> 1325 bytes .../02.player_input/10.joy_axis_option.png | Bin 0 -> 1858 bytes .../img/02.player_input/11.joy_axis_popup.png | Bin 0 -> 4344 bytes .../02.player_input/12.move_inputs_mapped.png | Bin 0 -> 9718 bytes .../02.player_input/13.joy_button_option.png | Bin 0 -> 2092 bytes .../02.player_input/14.add_jump_button.png | Bin 0 -> 3205 bytes .../02.player_input/14.jump_input_action.png | Bin 0 -> 2751 bytes .../01.attach_script_to_player.png | Bin 0 -> 7151 bytes .../02.clicking_main_tab.png | Bin 0 -> 1653 bytes .../03.instance_child_scene.png | Bin 0 -> 15042 bytes .../04.scene_tree_with_camera.png | Bin 0 -> 4915 bytes .../05.camera_preview_checkbox.png | Bin 0 -> 1329 bytes .../06.two_viewports.png | Bin 0 -> 4157 bytes .../07.camera_preview_checkbox.png | Bin 0 -> 1173 bytes .../08.camera_moved.png | Bin 0 -> 1777 bytes .../09.camera_rotated.png | Bin 0 -> 2839 bytes .../10.camera_perspective.png | Bin 0 -> 3110 bytes .../11.camera_orthographic.png | Bin 0 -> 2684 bytes .../04.mob_scene/01.initial_three_nodes.png | Bin 0 -> 2677 bytes .../img/04.mob_scene/02.add_child_node.png | Bin 0 -> 6789 bytes .../03.scene_with_collision_shape.png | Bin 0 -> 3471 bytes .../img/04.mob_scene/04.create_box_shape.png | Bin 0 -> 6959 bytes .../img/04.mob_scene/05.box_final_size.png | Bin 0 -> 21867 bytes .../04.mob_scene/06.visibility_notifier.png | Bin 0 -> 22448 bytes .../07.visibility_notifier_bbox_resized.png | Bin 0 -> 11168 bytes .../img/04.mob_scene/08.mob_attach_script.png | Bin 0 -> 7632 bytes .../09.switch_to_3d_workspace.png | Bin 0 -> 1299 bytes .../img/04.mob_scene/10.node_dock.png | Bin 0 -> 3659 bytes .../img/04.mob_scene/11.connect_signal.png | Bin 0 -> 8404 bytes .../01.monsters_path_preview.png | Bin 0 -> 9548 bytes .../05.spawning_mobs/02.project_settings.png | Bin 0 -> 7479 bytes .../05.spawning_mobs/03.window_settings.png | Bin 0 -> 19644 bytes .../05.spawning_mobs/04.camera_preview.png | Bin 0 -> 24289 bytes .../05.spawning_mobs/05.cylinders_node.png | Bin 0 -> 1381 bytes .../img/05.spawning_mobs/06.cylinder_mesh.png | Bin 0 -> 6335 bytes .../img/05.spawning_mobs/07.top_view.png | Bin 0 -> 2692 bytes .../05.spawning_mobs/08.toggle_view_grid.png | Bin 0 -> 4108 bytes .../05.spawning_mobs/09.toggle_grid_snap.png | Bin 0 -> 1502 bytes .../10.place_first_cylinder.png | Bin 0 -> 5817 bytes .../11.both_cylinders_selected.png | Bin 0 -> 3809 bytes .../05.spawning_mobs/12.four_cylinders.png | Bin 0 -> 3942 bytes .../13.selecting_all_cylinders.png | Bin 0 -> 1951 bytes .../05.spawning_mobs/14.spatial_material.png | Bin 0 -> 3364 bytes .../05.spawning_mobs/15.bright-cylinders.png | Bin 0 -> 23916 bytes .../05.spawning_mobs/16.cylinders_fold.png | Bin 0 -> 1802 bytes .../05.spawning_mobs/17.points_options.png | Bin 0 -> 977 bytes .../img/05.spawning_mobs/18.close_path.png | Bin 0 -> 982 bytes .../img/05.spawning_mobs/19.path_result.png | Bin 0 -> 3873 bytes .../20.mob_scene_property.png | Bin 0 -> 3940 bytes .../img/05.spawning_mobs/20.spawn_nodes.png | Bin 0 -> 1183 bytes .../img/05.spawning_mobs/21.mob_timer.png | Bin 0 -> 620 bytes .../22.mob_timer_properties.png | Bin 0 -> 3880 bytes .../05.spawning_mobs/23.timeout_signal.png | Bin 0 -> 2249 bytes .../24.connect_timer_to_main.png | Bin 0 -> 8379 bytes .../img/05.spawning_mobs/25.spawn_result.png | Bin 0 -> 9917 bytes .../02.project_settings.png | Bin 0 -> 7450 bytes .../06.jump_and_squash/03.physics_layers.png | Bin 0 -> 15432 bytes .../04.default_physics_properties.png | Bin 0 -> 1611 bytes .../05.toggle_layer_and_mask.png | Bin 0 -> 1836 bytes .../06.named_checkboxes.png | Bin 0 -> 3134 bytes .../07.player_physics_mask.png | Bin 0 -> 1178 bytes .../08.mob_physics_mask.png | Bin 0 -> 1116 bytes .../img/06.jump_and_squash/09.groups_tab.png | Bin 0 -> 2470 bytes .../10.group_scene_icon.png | Bin 0 -> 1783 bytes .../07.killing_player/01.adding_area_node.png | Bin 0 -> 2763 bytes .../07.killing_player/02.cylinder_shape.png | Bin 0 -> 6735 bytes .../03.cylinder_in_editor.png | Bin 0 -> 13009 bytes .../04.mob_detector_properties.png | Bin 0 -> 2233 bytes .../05.body_entered_signal.png | Bin 0 -> 4512 bytes .../06.player_hit_signal.png | Bin 0 -> 2291 bytes .../img/08.score_and_replay/01.label_node.png | Bin 0 -> 1260 bytes .../02.score_color_picker.png | Bin 0 -> 18740 bytes .../02.score_custom_color.png | Bin 0 -> 1467 bytes .../02.score_label_moved.png | Bin 0 -> 1513 bytes .../02.score_placeholder.png | Bin 0 -> 2200 bytes .../08.score_and_replay/03.creating_theme.png | Bin 0 -> 3045 bytes .../08.score_and_replay/04.theme_preview.png | Bin 0 -> 7354 bytes .../08.score_and_replay/05.dynamic_font.png | Bin 0 -> 4866 bytes .../img/08.score_and_replay/06.font_data.png | Bin 0 -> 2800 bytes .../img/08.score_and_replay/07.font_size.png | Bin 0 -> 5914 bytes .../08.open_main_script.png | Bin 0 -> 2376 bytes .../08.score_and_replay/09.score_in_game.png | Bin 0 -> 9110 bytes .../08.score_and_replay/10.layout_icon.png | Bin 0 -> 1067 bytes .../11.full_rect_option.png | Bin 0 -> 2126 bytes .../12.anchors_updated.png | Bin 0 -> 1053 bytes .../13.retry_color_picker.png | Bin 0 -> 18807 bytes .../img/08.score_and_replay/14.retry_node.png | Bin 0 -> 2617 bytes .../08.score_and_replay/15.layout_center.png | Bin 0 -> 1483 bytes .../img/08.score_and_replay/16.new_scene.png | Bin 0 -> 4051 bytes .../17.music_player_node.png | Bin 0 -> 1919 bytes .../18.music_node_properties.png | Bin 0 -> 4845 bytes .../19.register_autoload.png | Bin 0 -> 4566 bytes .../20.scene_dock_tabs.png | Bin 0 -> 2564 bytes .../21.remote_scene_tree.png | Bin 0 -> 7274 bytes .../01.animation_player_dock.png | Bin 0 -> 4077 bytes .../09.adding_animations/02.new_animation.png | Bin 0 -> 1072 bytes .../09.adding_animations/03.float_name.png | Bin 0 -> 2324 bytes .../img/09.adding_animations/03.timeline.png | Bin 0 -> 3028 bytes .../04.autoplay_and_loop.png | Bin 0 -> 5971 bytes .../img/09.adding_animations/05.pin_icon.png | Bin 0 -> 644 bytes .../06.animation_duration.png | Bin 0 -> 1057 bytes .../07.editable_timeline.png | Bin 0 -> 2126 bytes .../09.adding_animations/08.zoom_slider.png | Bin 0 -> 3187 bytes .../09.creating_first_keyframe.png | Bin 0 -> 2891 bytes .../09.adding_animations/10.initial_keys.png | Bin 0 -> 3709 bytes .../09.adding_animations/11.moving_keys.png | Bin 0 -> 2239 bytes .../12.second_keys_values.png | Bin 0 -> 2990 bytes .../09.adding_animations/13.second_keys.png | Bin 0 -> 4145 bytes .../09.adding_animations/14.play_button.png | Bin 0 -> 299 bytes .../09.adding_animations/15.box_select.png | Bin 0 -> 8534 bytes .../16.easing_property.png | Bin 0 -> 1670 bytes .../img/09.adding_animations/17.ease_out.png | Bin 0 -> 758 bytes .../18.ease_out_second_rotation_key.png | Bin 0 -> 2568 bytes .../19.ease_in_second_translation_key.png | Bin 0 -> 2753 bytes .../20.float_animation.gif | Bin 0 -> 228946 bytes .../09.adding_animations/21.script_icon.png | Bin 0 -> 2529 bytes .../22.merge_from_scene.png | Bin 0 -> 2361 bytes .../img/squash-the-creeps-final.gif | Bin 0 -> 1271009 bytes getting_started/first_3d_game/index.rst | 4 +- .../introduction/first_look_at_the_editor.rst | 155 ++ .../godot_design_philosophy.rst | 22 +- .../img/editor_intro_3d_viewport.png | Bin 0 -> 13747 bytes .../editor_intro_3d_viewport_perspective.png | Bin 0 -> 3735 bytes .../editor_intro_bottom_panel_animation.png | Bin 0 -> 5334 bytes .../img/editor_intro_bottom_panels.png | Bin 0 -> 1429 bytes .../img/editor_intro_editor_empty.png | Bin 0 -> 32005 bytes .../img/editor_intro_filesystem_dock.png | Bin 0 -> 3174 bytes ...ditor_intro_help_class_animated_sprite.png | Bin 0 -> 25986 bytes .../img/editor_intro_inspector_dock.png | Bin 0 -> 4212 bytes .../img/editor_intro_language.png | Bin 0 -> 1038 bytes .../img/editor_intro_project_manager.png | Bin 0 -> 34563 bytes .../img/editor_intro_project_templates.png | Bin 0 -> 18017 bytes .../img/editor_intro_scene_dock.png | Bin 0 -> 3627 bytes .../img/editor_intro_search_help.png | Bin 0 -> 11925 bytes .../img/editor_intro_search_help_button.png | Bin 0 -> 5360 bytes .../img/editor_intro_toolbar_2d.png | Bin 0 -> 1435 bytes .../img/editor_intro_toolbar_3d.png | Bin 0 -> 1543 bytes .../img/editor_intro_top_menus.png | Bin 0 -> 2629 bytes .../img/editor_intro_workspace_2d.png | Bin 0 -> 150204 bytes .../img/editor_intro_workspace_3d.png | Bin 0 -> 68341 bytes .../img/editor_intro_workspace_assetlib.png | Bin 0 -> 25875 bytes .../img/editor_intro_workspace_script.png | Bin 0 -> 41273 bytes .../img/editor_ui_intro_dock_filesystem.png | Bin 0 -> 4433 bytes .../img/editor_ui_intro_dock_inspector.png | Bin 0 -> 9593 bytes .../img/editor_ui_intro_editor_02_toolbar.png | Bin 0 -> 5788 bytes ...or_ui_intro_editor_03_animation_player.png | Bin 0 -> 6835 bytes ...editor_ui_intro_editor_04_2d_workspace.png | Bin 0 -> 75443 bytes ...editor_ui_intro_editor_05_3d_workspace.png | Bin 0 -> 232109 bytes ...editor_ui_intro_editor_06_3d_workspace.png | Bin 0 -> 173772 bytes ...ro_editor_06_script_workspace_expanded.png | Bin 0 -> 38325 bytes ...tor_ui_intro_editor_interface_overview.png | Bin 0 -> 52060 bytes ...or_ui_intro_script_class_documentation.png | Bin 0 -> 52185 bytes ...r_ui_intro_script_search_documentation.png | Bin 0 -> 16125 bytes ...tor_ui_intro_script_search_help_window.png | Bin 0 -> 30039 bytes .../introduction/img/engine_design_01.png | Bin 0 -> 17515 bytes .../introduction/img/engine_design_02.png | Bin 0 -> 6647 bytes .../introduction/img/engine_design_03.png | Bin 0 -> 52205 bytes .../img/engine_design_fsm_plugin.png | Bin 0 -> 31723 bytes .../img/engine_design_rpg_in_a_box.png | Bin 0 -> 90884 bytes .../img/engine_design_visual_script.png | Bin 0 -> 35143 bytes .../introduction/img/introduction_editor.png | Bin 0 -> 91255 bytes .../img/introduction_ex_zodiac.png | Bin 0 -> 30632 bytes .../img/introduction_helms_of_fury.jpg | Bin 0 -> 26376 bytes .../img/introduction_rpg_in_a_box.png | Bin 0 -> 98374 bytes .../introduction/img/introduction_vscode.png | Bin 0 -> 63243 bytes .../img/key_concepts_character_nodes.png | Bin 0 -> 4799 bytes .../img/key_concepts_main_menu.png | Bin 0 -> 42726 bytes .../img/key_concepts_node_menu.png | Bin 0 -> 8039 bytes .../img/key_concepts_scene_example.png | Bin 0 -> 23189 bytes .../img/key_concepts_scene_tree.png | Bin 0 -> 5914 bytes .../introduction/img/key_concepts_signals.png | Bin 0 -> 5887 bytes .../manual_class_reference_inheritance.png | Bin 0 -> 3901 bytes .../img/manual_class_reference_search.png | Bin 0 -> 8500 bytes .../introduction/img/manual_search.png | Bin 0 -> 1616 bytes .../introduction/key_concepts_overview.rst | 100 ++ .../introduction/learning_new_features.rst | 151 ++ .../scripting/c_sharp/c_sharp_exports.rst | 365 ----- getting_started/step_by_step/animations.rst | 86 -- .../step_by_step/files/robisplash.zip | Bin 99663 -> 0 bytes .../step_by_step/files/robisplash_assets.zip | Bin 90903 -> 0 bytes .../step_by_step/files/ui_code_life_bar.zip | Bin 373403 -> 0 bytes .../step_by_step/files/ui_gui_design.zip | Bin 286643 -> 0 bytes .../files/ui_main_menu_design.zip | Bin 91346 -> 0 bytes .../step_by_step/img/add_script.png | Bin 9566 -> 9129 bytes .../step_by_step/img/add_script_button.png | Bin 9825 -> 0 bytes .../step_by_step/img/anchor_property.png | Bin 3645 -> 3398 bytes getting_started/step_by_step/img/chef.png | Bin 38072 -> 33881 bytes .../step_by_step/img/completed_main_scene.png | Bin 5989 -> 0 bytes .../step_by_step/img/connect_dialogue.png | Bin 8451 -> 7785 bytes .../step_by_step/img/control_node_margin.png | Bin 8940 -> 8222 bytes .../step_by_step/img/custom_font1.png | Bin 96903 -> 0 bytes .../step_by_step/img/custom_font2.png | Bin 81693 -> 0 bytes .../step_by_step/img/custom_font3.png | Bin 0 -> 11110 bytes .../img/editor_ui_intro_dock_filesystem.png | Bin 4665 -> 0 bytes .../img/editor_ui_intro_dock_inspector.png | Bin 10215 -> 0 bytes .../img/editor_ui_intro_editor_02_toolbar.png | Bin 6297 -> 0 bytes ...or_ui_intro_editor_03_animation_player.png | Bin 7396 -> 0 bytes ...editor_ui_intro_editor_04_2d_workspace.png | Bin 82295 -> 0 bytes ...editor_ui_intro_editor_05_3d_workspace.png | Bin 256714 -> 0 bytes ...editor_ui_intro_editor_06_3d_workspace.png | Bin 191300 -> 0 bytes ...ro_editor_06_script_workspace_expanded.png | Bin 41978 -> 0 bytes .../img/editor_ui_intro_editor_07.png | Bin 826 -> 0 bytes .../img/editor_ui_intro_editor_08.png | Bin 4475 -> 0 bytes ...tor_ui_intro_editor_interface_overview.png | Bin 61136 -> 0 bytes .../editor_ui_intro_project_manager_01.png | Bin 7514 -> 0 bytes .../editor_ui_intro_project_manager_02.png | Bin 15162 -> 0 bytes .../editor_ui_intro_project_manager_03.png | Bin 29495 -> 0 bytes .../editor_ui_intro_project_manager_04.png | Bin 19792 -> 0 bytes .../editor_ui_intro_project_manager_05.png | Bin 11774 -> 0 bytes .../editor_ui_intro_project_manager_06.png | Bin 11099 -> 0 bytes .../editor_ui_intro_project_manager_08.png | Bin 12767 -> 0 bytes .../editor_ui_intro_project_manager_09.png | Bin 11858 -> 0 bytes ...or_ui_intro_script_class_documentation.png | Bin 63096 -> 0 bytes ...r_ui_intro_script_search_documentation.png | Bin 20409 -> 0 bytes ...tor_ui_intro_script_search_help_window.png | Bin 43964 -> 0 bytes .../step_by_step/img/editor_with_label.png | Bin 36088 -> 33634 bytes .../step_by_step/img/empty_editor.png | Bin 53425 -> 45367 bytes .../step_by_step/img/export_variable.png | Bin 34366 -> 0 bytes .../img/five_common_nodes_label.png | Bin 10571 -> 0 bytes .../img/five_common_nodes_ninepatchrect.png | Bin 8203 -> 0 bytes .../img/five_common_nodes_texturebutton.png | Bin 12193 -> 0 bytes .../img/five_common_nodes_textureframe.png | Bin 9210 -> 0 bytes .../img/five_common_nodes_textureprogress.png | Bin 7012 -> 0 bytes .../img/five_containers_boxcontainer.png | Bin 19508 -> 0 bytes .../img/five_containers_centercontainer.png | Bin 2107 -> 0 bytes .../img/five_containers_gridcontainer.png | Bin 22153 -> 0 bytes .../img/five_containers_margincontainer.png | Bin 11289 -> 0 bytes .../img/five_most_common_nodes.png | Bin 5958 -> 0 bytes .../step_by_step/img/godot_editor_ui.png | Bin 23790 -> 23109 bytes .../gui_step_tutorial_gui_scene_hierarchy.png | Bin 3557 -> 3326 bytes .../step_by_step/img/helloworld.png | Bin 1937 -> 1850 bytes getting_started/step_by_step/img/hw.png | Bin 6096 -> 5865 bytes .../step_by_step/img/instance_scene.png | Bin 2803 -> 0 bytes .../step_by_step/img/instancing.png | Bin 4743 -> 0 bytes .../img/instancing_ball_duplicated.png | Bin 0 -> 8152 bytes .../img/instancing_ball_instanced.png | Bin 0 -> 35300 bytes .../img/instancing_ball_instances_example.png | Bin 0 -> 20505 bytes .../img/instancing_ball_moved.png | Bin 0 -> 7339 bytes .../img/instancing_ball_scene.png | Bin 0 -> 4563 bytes .../step_by_step/img/instancing_ballscene.png | Bin 96213 -> 0 bytes .../img/instancing_diagram_open_world.png | Bin 0 -> 6745 bytes .../img/instancing_diagram_shooter.png | Bin 0 -> 8642 bytes .../step_by_step/img/instancing_import.png | Bin 21380 -> 0 bytes .../img/instancing_import_and_edit_button.png | Bin 0 -> 8758 bytes .../img/instancing_import_browse.png | Bin 0 -> 10056 bytes .../img/instancing_import_button.png | Bin 0 -> 5202 bytes .../img/instancing_import_project_file.png | Bin 0 -> 10071 bytes .../img/instancing_instance_child_window.png | Bin 0 -> 3670 bytes .../img/instancing_linkbutton.png | Bin 7484 -> 0 bytes .../img/instancing_main_scene.png | Bin 0 -> 27977 bytes .../img/instancing_main_scene_with_balls.png | Bin 0 -> 33697 bytes .../step_by_step/img/instancing_mainroot.png | Bin 11231 -> 0 bytes .../step_by_step/img/instancing_mainscene.png | Bin 100710 -> 0 bytes .../step_by_step/img/instancing_multiball.gif | Bin 1296911 -> 0 bytes .../step_by_step/img/instancing_multiball.png | Bin 106776 -> 0 bytes .../instancing_physics_material_expand.png | Bin 0 -> 6672 bytes .../img/instancing_physicsmat2.png | Bin 31663 -> 0 bytes .../step_by_step/img/instancing_placeball.png | Bin 29592 -> 0 bytes .../img/instancing_playbutton.png | Bin 4203 -> 0 bytes .../step_by_step/img/instancing_property.png | Bin 4362 -> 0 bytes .../instancing_property_bounce_updated.png | Bin 0 -> 587 bytes .../img/instancing_property_gravity_scale.png | Bin 0 -> 860 bytes .../img/instancing_property_revert_icon.png | Bin 0 -> 891 bytes .../img/instancing_scene_link_button.png | Bin 0 -> 2277 bytes .../img/instancing_scene_tabs.png | Bin 0 -> 2890 bytes .../step_by_step/img/instancingpre.png | Bin 4469 -> 0 bytes .../step_by_step/img/label_button_example.png | Bin 5411 -> 4789 bytes .../step_by_step/img/layout_menu.png | Bin 8312 -> 7569 bytes ...tutorial_LifeBar_health_update_no_anim.gif | Bin 60819 -> 0 bytes ...orial_Player_with_editable_children_on.png | Bin 4660 -> 0 bytes ...rial_TextureProgress_default_max_value.png | Bin 2869 -> 0 bytes ...l_connect_signal_window_health_changed.png | Bin 28711 -> 0 bytes .../img/lifebar_tutorial_final_result.gif | Bin 72702 -> 0 bytes ...torial_godot_generates_signal_callback.png | Bin 7798 -> 0 bytes ...lifebar_tutorial_health_changed_signal.png | Bin 20117 -> 0 bytes ...fe_bar_step_tut_LevelMockup_scene_tree.png | Bin 5763 -> 0 bytes ...ar_tutorial_number_animation_messed_up.gif | Bin 98548 -> 0 bytes ...ebar_tutorial_number_animation_working.gif | Bin 62677 -> 0 bytes ...l_player_died_connecting_signal_window.png | Bin 6059 -> 0 bytes ...ial_player_died_signal_enemy_connected.png | Bin 7974 -> 0 bytes ...al_player_gd_emits_health_changed_code.png | Bin 6578 -> 0 bytes .../step_by_step/img/main_scene.png | Bin 20428 -> 19072 bytes .../step_by_step/img/neversaved.png | Bin 3238 -> 3168 bytes .../step_by_step/img/newnode_button.png | Bin 11302 -> 6971 bytes .../step_by_step/img/node_classes.png | Bin 14791 -> 0 bytes .../step_by_step/img/node_search_label.png | Bin 11334 -> 0 bytes .../img/nodes_and_scenes_01_empty_editor.png | Bin 0 -> 32005 bytes .../img/nodes_and_scenes_02_scene_dock.png | Bin 0 -> 3560 bytes ...nodes_and_scenes_03_create_node_window.png | Bin 0 -> 9500 bytes ...odes_and_scenes_04_create_label_window.png | Bin 0 -> 9214 bytes .../nodes_and_scenes_05_editor_with_label.png | Bin 0 -> 23323 bytes .../img/nodes_and_scenes_06_label_text.png | Bin 0 -> 2962 bytes .../img/nodes_and_scenes_07_move_tool.png | Bin 0 -> 1455 bytes .../nodes_and_scenes_08_hello_world_text.png | Bin 0 -> 23075 bytes .../nodes_and_scenes_09_play_scene_button.png | Bin 0 -> 628 bytes .../nodes_and_scenes_10_save_scene_popup.png | Bin 0 -> 2453 bytes .../img/nodes_and_scenes_11_save_scene_as.png | Bin 0 -> 6105 bytes .../img/nodes_and_scenes_12_final_result.png | Bin 0 -> 619 bytes .../img/nodes_and_scenes_13_play_button.png | Bin 0 -> 643 bytes .../nodes_and_scenes_14_main_scene_popup.png | Bin 0 -> 4030 bytes .../nodes_and_scenes_15_select_main_scene.png | Bin 0 -> 22441 bytes .../img/nodes_and_scenes_3d_scene_example.png | Bin 0 -> 16327 bytes .../img/nodes_and_scenes_character_nodes.png | Bin 0 -> 4799 bytes .../img/nodes_and_scenes_nodes.png | Bin 0 -> 6660 bytes .../step_by_step/img/openworld_instancing.png | Bin 9575 -> 0 bytes getting_started/step_by_step/img/out.gif | Bin 149811 -> 0 bytes .../step_by_step/img/path2d_buttons.png | Bin 1979 -> 0 bytes .../step_by_step/img/player_coll_shape.png | Bin 39687 -> 0 bytes .../step_by_step/img/player_scale.png | Bin 27416 -> 0 bytes .../step_by_step/img/player_scene_nodes.png | Bin 9628 -> 0 bytes .../step_by_step/img/playscene.png | Bin 1387 -> 1343 bytes .../img/project_manager_first_open.png | Bin 12193 -> 10918 bytes .../img/robisplash_anim_button.png | Bin 1552 -> 0 bytes .../img/robisplash_anim_editor.png | Bin 3850 -> 0 bytes .../img/robisplash_anim_editor_autoplay.png | Bin 6965 -> 0 bytes .../img/robisplash_anim_editor_keyframe.png | Bin 6931 -> 0 bytes .../img/robisplash_anim_editor_keyframe_2.png | Bin 6946 -> 0 bytes .../img/robisplash_anim_editor_play_start.png | Bin 6992 -> 0 bytes .../robisplash_anim_editor_track_cursor.png | Bin 7985 -> 0 bytes .../img/robisplash_anim_inspector.png | Bin 4271 -> 0 bytes .../robisplash_anim_logo_inspector_key.png | Bin 6415 -> 0 bytes .../step_by_step/img/robisplash_anim_new.png | Bin 4349 -> 0 bytes .../img/robisplash_anim_property_keys.png | Bin 6112 -> 0 bytes .../img/robisplash_background_inspector.png | Bin 6568 -> 0 bytes .../img/robisplash_button_inspector.png | Bin 7119 -> 0 bytes .../step_by_step/img/robisplash_editor.png | Bin 101422 -> 0 bytes .../step_by_step/img/robisplash_result.png | Bin 86653 -> 0 bytes .../step_by_step/img/robisplash_scene.png | Bin 3945 -> 0 bytes .../step_by_step/img/save_scene.png | Bin 18597 -> 16111 bytes .../step_by_step/img/scene_tree_example.png | Bin 5177 -> 4955 bytes .../step_by_step/img/script_added.png | Bin 5714 -> 5664 bytes .../img/script_class_nativescript_example.png | Bin 14719 -> 13858 bytes .../step_by_step/img/script_create.png | Bin 7836 -> 7365 bytes .../step_by_step/img/script_template.png | Bin 17212 -> 15431 bytes .../img/scripting_camera_shake.gif | Bin 0 -> 249898 bytes .../step_by_step/img/scripting_cpp.png | Bin 0 -> 32456 bytes .../step_by_step/img/scripting_csharp.png | Bin 0 -> 16202 bytes ...scripting_first_script_add_sprite_node.png | Bin 0 -> 8759 bytes ...ipting_first_script_attach_node_script.png | Bin 0 -> 6795 bytes .../scripting_first_script_attach_script.png | Bin 0 -> 5355 bytes ...cripting_first_script_centering_sprite.png | Bin 0 -> 3149 bytes ...cripting_first_script_click_other_node.png | Bin 0 -> 3605 bytes ...scripting_first_script_dragging_sprite.png | Bin 0 -> 5532 bytes ...ng_first_script_godot_turning_in_place.gif | Bin 0 -> 70002 bytes ...ripting_first_script_moving_with_input.gif | Bin 0 -> 160709 bytes ...ripting_first_script_print_hello_world.png | Bin 0 -> 5956 bytes ...ripting_first_script_property_tooltips.png | Bin 0 -> 7421 bytes .../scripting_first_script_rotating_godot.gif | Bin 0 -> 160428 bytes .../img/scripting_first_script_scene_tree.png | Bin 0 -> 1695 bytes ...scripting_first_script_setting_texture.png | Bin 0 -> 4577 bytes .../step_by_step/img/scripting_gdscript.png | Bin 0 -> 36555 bytes .../step_by_step/img/scripting_hello.png | Bin 2058 -> 1984 bytes .../step_by_step/img/scripting_scene_tree.png | Bin 3328 -> 3199 bytes .../img/scripting_visualscript.png | Bin 0 -> 22727 bytes .../step_by_step/img/set_collision_mask.png | Bin 22102 -> 0 bytes .../step_by_step/img/shooter_instancing.png | Bin 10317 -> 0 bytes getting_started/step_by_step/img/signals.png | Bin 7292 -> 7242 bytes .../step_by_step/img/signals_01_new_scene.png | Bin 0 -> 4044 bytes .../step_by_step/img/signals_02_2d_scene.png | Bin 0 -> 3608 bytes .../img/signals_03_dragging_scene.png | Bin 0 -> 2109 bytes .../img/signals_04_add_child_node.png | Bin 0 -> 3834 bytes .../img/signals_05_add_button.png | Bin 0 -> 8231 bytes .../img/signals_06_drag_button.png | Bin 0 -> 1293 bytes .../img/signals_07_select_tool.png | Bin 0 -> 1452 bytes .../img/signals_08_toggle_motion_text.png | Bin 0 -> 3516 bytes .../img/signals_09_scene_setup.png | Bin 0 -> 20041 bytes .../step_by_step/img/signals_10_node_dock.png | Bin 0 -> 2096 bytes .../img/signals_11_pressed_signals.png | Bin 0 -> 3747 bytes .../img/signals_12_node_connection.png | Bin 0 -> 6896 bytes .../signals_13_signals_connection_icon.png | Bin 0 -> 3704 bytes .../signals_14_signals_connection_info.png | Bin 0 -> 3656 bytes .../img/signals_15_scene_tree.png | Bin 0 -> 2904 bytes .../img/signals_16_click_script.png | Bin 0 -> 3017 bytes .../img/signals_17_custom_signal.png | Bin 0 -> 3783 bytes .../img/signals_18_timer_autostart.png | Bin 0 -> 32993 bytes .../signals_advanced_connection_window.png | Bin 0 -> 10030 bytes .../img/signals_connect_dialog_timer.png | Bin 21465 -> 19893 bytes .../img/signals_disconnect_timer.png | Bin 7038 -> 6694 bytes .../step_by_step/img/signals_node_setup.png | Bin 3569 -> 3429 bytes .../img/signals_node_tab_timer.png | Bin 5770 -> 5453 bytes .../img/start_button_shortcut.png | Bin 7065 -> 0 bytes .../textureframe_in_box_container_expand.png | Bin 2606 -> 2381 bytes .../textureframe_in_box_container_fill.png | Bin 2713 -> 2415 bytes getting_started/step_by_step/img/tree.png | Bin 4131 -> 0 bytes .../step_by_step/img/ui_anchor.png | Bin 51418 -> 0 bytes .../img/ui_anchor_and_margins.png | Bin 20502 -> 17579 bytes .../ui_gui_containers_structure_in_godot.png | Bin 5414 -> 0 bytes .../img/ui_gui_design_final_result.png | Bin 14511 -> 0 bytes ...gui_step_tutorial_assemble_final_gui_1.png | Bin 5829 -> 0 bytes ...gui_step_tutorial_assemble_final_gui_2.png | Bin 7898 -> 0 bytes ...gui_step_tutorial_assemble_final_gui_3.png | Bin 16588 -> 0 bytes ...gui_step_tutorial_assemble_final_gui_4.png | Bin 5057 -> 0 bytes .../img/ui_gui_step_tutorial_bar_final.png | Bin 5587 -> 0 bytes ...ui_gui_step_tutorial_bar_label_stacked.png | Bin 4039 -> 0 bytes ...tutorial_bar_nesting_inside_background.png | Bin 4110 -> 0 bytes ...ep_tutorial_bar_placed_title_and_label.png | Bin 10969 -> 0 bytes .../ui_gui_step_tutorial_bar_template_1.png | Bin 10118 -> 0 bytes ...i_gui_step_tutorial_bar_template_scene.png | Bin 6161 -> 0 bytes ...gui_step_tutorial_containers_structure.png | Bin 15828 -> 0 bytes .../ui_gui_step_tutorial_counter_design_1.png | Bin 4006 -> 0 bytes .../ui_gui_step_tutorial_counter_design_2.png | Bin 12582 -> 0 bytes .../ui_gui_step_tutorial_counter_design_3.png | Bin 16130 -> 0 bytes .../ui_gui_step_tutorial_counter_design_4.png | Bin 14782 -> 0 bytes .../ui_gui_step_tutorial_counter_design_5.png | Bin 5059 -> 0 bytes ...i_gui_step_tutorial_design_EnergyBar_1.png | Bin 6838 -> 0 bytes ...i_gui_step_tutorial_design_EnergyBar_2.png | Bin 4286 -> 0 bytes ...i_gui_step_tutorial_design_EnergyBar_3.png | Bin 7704 -> 0 bytes ...i_gui_step_tutorial_design_EnergyBar_4.png | Bin 3555 -> 0 bytes ...ui_gui_step_tutorial_design_counters_1.png | Bin 8870 -> 0 bytes ...ui_gui_step_tutorial_design_counters_2.png | Bin 11736 -> 0 bytes ...i_step_tutorial_inherited_scene_parent.png | Bin 11896 -> 0 bytes .../ui_gui_step_tutorial_number_baseline.png | Bin 7733 -> 0 bytes ...ep_tutorial_textures_in_FileSystem_tab.png | Bin 50466 -> 0 bytes .../img/ui_main_menu_6_texturerect_nodes.png | Bin 14627 -> 0 bytes .../img/ui_main_menu_containers_step_1.png | Bin 10111 -> 0 bytes .../img/ui_main_menu_containers_step_2.png | Bin 20916 -> 0 bytes .../img/ui_main_menu_containers_step_3.png | Bin 21500 -> 0 bytes .../img/ui_main_menu_containers_step_4.png | Bin 24313 -> 0 bytes .../img/ui_main_menu_containers_step_5.png | Bin 23086 -> 0 bytes .../img/ui_main_menu_design_final_result.png | Bin 13686 -> 0 bytes .../img/ui_main_menu_placeholder_assets.png | Bin 9192 -> 0 bytes .../step_by_step/img/ui_mockup_break_down.png | Bin 14455 -> 0 bytes .../img/ui_texturerect_load_texture.png | Bin 20221 -> 0 bytes getting_started/step_by_step/index.rst | 8 +- getting_started/step_by_step/instancing.rst | 260 ++-- .../step_by_step/instancing_continued.rst | 81 - .../intro_to_the_editor_interface.rst | 184 --- .../step_by_step/nodes_and_scenes.rst | 196 +++ .../step_by_step/scenes_and_nodes.rst | 216 --- getting_started/step_by_step/scripting.rst | 342 ----- .../step_by_step/scripting_first_script.rst | 26 +- .../step_by_step/scripting_languages.rst | 181 +++ .../step_by_step/scripting_player_input.rst | 143 ++ getting_started/step_by_step/signals.rst | 446 +++--- .../step_by_step/splash_screen.rst | 45 - .../step_by_step/ui_code_a_life_bar.rst | 677 --------- .../step_by_step/ui_game_user_interface.rst | 633 -------- .../ui_introduction_to_the_ui_system.rst | 354 ----- getting_started/step_by_step/ui_main_menu.rst | 316 ---- .../step_by_step/your_first_game.rst | 1308 ----------------- 528 files changed, 6573 insertions(+), 5286 deletions(-) delete mode 100644 getting_started/editor/img/editable-children.png delete mode 100644 getting_started/editor/img/godot-gui-overlay.png delete mode 100644 getting_started/editor/img/save-branch-as-scene.png delete mode 100644 getting_started/editor/img/unity-gui-overlay.png delete mode 100644 getting_started/editor/img/unity-project-organization-example.png delete mode 100644 getting_started/editor/unity_to_godot.rst delete mode 100644 getting_started/editor/using_the_web_editor.rst create mode 100644 getting_started/first_2d_game/01.project_setup.rst create mode 100644 getting_started/first_2d_game/02.player_scene.rst create mode 100644 getting_started/first_2d_game/03.coding_the_player.rst create mode 100644 getting_started/first_2d_game/04.creating_the_enemy.rst create mode 100644 getting_started/first_2d_game/05.the_main_game_scene.rst create mode 100644 getting_started/first_2d_game/06.heads_up_display.rst create mode 100644 getting_started/first_2d_game/07.finishing-up.rst rename getting_started/{step_by_step => first_2d_game}/files/dodge_assets.zip (100%) create mode 100644 getting_started/first_2d_game/files/dodge_assets_with_gdnative.zip rename getting_started/{step_by_step => first_2d_game}/img/add_node.png (100%) create mode 100644 getting_started/first_2d_game/img/add_script_button.png rename getting_started/{step_by_step => first_2d_game}/img/attach_node_window.png (100%) create mode 100644 getting_started/first_2d_game/img/completed_main_scene.png create mode 100644 getting_started/first_2d_game/img/custom_font1.png create mode 100644 getting_started/first_2d_game/img/custom_font2.png create mode 100644 getting_started/first_2d_game/img/custom_font3.png rename getting_started/{step_by_step => first_2d_game}/img/dodge_preview.gif (100%) rename getting_started/{step_by_step => first_2d_game}/img/draw_path2d.gif (100%) create mode 100644 getting_started/first_2d_game/img/export_variable.png rename getting_started/{step_by_step => first_2d_game}/img/filesystem_dock.png (100%) create mode 100644 getting_started/first_2d_game/img/folder-content.png rename getting_started/{step_by_step => first_2d_game}/img/grid_snap_button.png (100%) rename getting_started/{step_by_step => first_2d_game}/img/group_tab.png (100%) create mode 100644 getting_started/first_2d_game/img/instance_scene.png rename getting_started/{step_by_step => first_2d_game}/img/lock_children.png (100%) rename getting_started/{step_by_step => first_2d_game}/img/main_scene_nodes.png (100%) rename getting_started/{step_by_step => first_2d_game}/img/mob_animations.gif (100%) create mode 100644 getting_started/first_2d_game/img/new-project-button.png create mode 100644 getting_started/first_2d_game/img/path2d_buttons.png create mode 100644 getting_started/first_2d_game/img/player_coll_shape.png create mode 100644 getting_started/first_2d_game/img/player_scale.png create mode 100644 getting_started/first_2d_game/img/player_scene_nodes.png rename getting_started/{step_by_step => first_2d_game}/img/player_signal_connection.png (100%) rename getting_started/{step_by_step => first_2d_game}/img/player_signals.png (100%) create mode 100644 getting_started/first_2d_game/img/set_collision_mask.png create mode 100644 getting_started/first_2d_game/img/setting-project-width-and-height.png create mode 100644 getting_started/first_2d_game/img/setting-stretch-mode.png rename getting_started/{step_by_step => first_2d_game}/img/spriteframes_panel.png (100%) rename getting_started/{step_by_step => first_2d_game}/img/spriteframes_panel2.png (100%) create mode 100644 getting_started/first_2d_game/img/start_button_shortcut.png create mode 100644 getting_started/first_2d_game/img/ui_anchor.png create mode 100644 getting_started/first_3d_game/01.game_setup.rst create mode 100644 getting_started/first_3d_game/02.player_input.rst create mode 100644 getting_started/first_3d_game/03.player_movement_code.rst create mode 100644 getting_started/first_3d_game/04.mob_scene.rst create mode 100644 getting_started/first_3d_game/05.spawning_mobs.rst create mode 100644 getting_started/first_3d_game/06.jump_and_squash.rst create mode 100644 getting_started/first_3d_game/07.killing_player.rst create mode 100644 getting_started/first_3d_game/08.score_and_replay.rst create mode 100644 getting_started/first_3d_game/09.adding_animations.rst create mode 100644 getting_started/first_3d_game/going_further.rst create mode 100644 getting_started/first_3d_game/img/01.game_setup/01.import_button.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/02.browse_to_project_folder.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/03.import_and_edit.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/04.start_assets.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/05.main_node.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/06.staticbody_node.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/07.collision_shape_warning.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/08.create_box_shape.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/09.box_extents.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/10.mesh_instance.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/11.cube_mesh.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/12.cube_resized.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/13.move_gizmo_y_axis.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/14.select_mode_icon.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/15.translation_amount.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/16.turn_on_shadows.png create mode 100644 getting_started/first_3d_game/img/01.game_setup/17.project_with_light.png create mode 100644 getting_started/first_3d_game/img/02.player_input/01.new_scene.png create mode 100644 getting_started/first_3d_game/img/02.player_input/02.instantiating_the_model.png create mode 100644 getting_started/first_3d_game/img/02.player_input/03.scene_structure.png create mode 100644 getting_started/first_3d_game/img/02.player_input/04.sphere_shape.png create mode 100644 getting_started/first_3d_game/img/02.player_input/05.moving_the_sphere_up.png create mode 100644 getting_started/first_3d_game/img/02.player_input/06.toggling_visibility.png create mode 100644 getting_started/first_3d_game/img/02.player_input/07.adding_action.png create mode 100644 getting_started/first_3d_game/img/02.player_input/07.input_map_tab.png create mode 100644 getting_started/first_3d_game/img/02.player_input/07.project_settings.png create mode 100644 getting_started/first_3d_game/img/02.player_input/08.actions_list_empty.png create mode 100644 getting_started/first_3d_game/img/02.player_input/08.create_key_action.png create mode 100644 getting_started/first_3d_game/img/02.player_input/09.keyboard_key_popup.png create mode 100644 getting_started/first_3d_game/img/02.player_input/09.keyboard_keys.png create mode 100644 getting_started/first_3d_game/img/02.player_input/10.joy_axis_option.png create mode 100644 getting_started/first_3d_game/img/02.player_input/11.joy_axis_popup.png create mode 100644 getting_started/first_3d_game/img/02.player_input/12.move_inputs_mapped.png create mode 100644 getting_started/first_3d_game/img/02.player_input/13.joy_button_option.png create mode 100644 getting_started/first_3d_game/img/02.player_input/14.add_jump_button.png create mode 100644 getting_started/first_3d_game/img/02.player_input/14.jump_input_action.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/01.attach_script_to_player.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/02.clicking_main_tab.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/03.instance_child_scene.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/04.scene_tree_with_camera.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/05.camera_preview_checkbox.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/06.two_viewports.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/07.camera_preview_checkbox.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/08.camera_moved.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/09.camera_rotated.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/10.camera_perspective.png create mode 100644 getting_started/first_3d_game/img/03.player_movement_code/11.camera_orthographic.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/01.initial_three_nodes.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/02.add_child_node.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/03.scene_with_collision_shape.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/04.create_box_shape.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/05.box_final_size.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/06.visibility_notifier.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/07.visibility_notifier_bbox_resized.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/08.mob_attach_script.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/09.switch_to_3d_workspace.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/10.node_dock.png create mode 100644 getting_started/first_3d_game/img/04.mob_scene/11.connect_signal.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/01.monsters_path_preview.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/02.project_settings.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/03.window_settings.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/04.camera_preview.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/05.cylinders_node.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/06.cylinder_mesh.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/07.top_view.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/08.toggle_view_grid.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/09.toggle_grid_snap.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/10.place_first_cylinder.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/11.both_cylinders_selected.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/12.four_cylinders.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/13.selecting_all_cylinders.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/14.spatial_material.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/15.bright-cylinders.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/16.cylinders_fold.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/17.points_options.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/18.close_path.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/19.path_result.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/20.mob_scene_property.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/20.spawn_nodes.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/21.mob_timer.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/22.mob_timer_properties.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/23.timeout_signal.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/24.connect_timer_to_main.png create mode 100644 getting_started/first_3d_game/img/05.spawning_mobs/25.spawn_result.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/02.project_settings.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/03.physics_layers.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/04.default_physics_properties.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/05.toggle_layer_and_mask.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/06.named_checkboxes.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/07.player_physics_mask.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/08.mob_physics_mask.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/09.groups_tab.png create mode 100644 getting_started/first_3d_game/img/06.jump_and_squash/10.group_scene_icon.png create mode 100644 getting_started/first_3d_game/img/07.killing_player/01.adding_area_node.png create mode 100644 getting_started/first_3d_game/img/07.killing_player/02.cylinder_shape.png create mode 100644 getting_started/first_3d_game/img/07.killing_player/03.cylinder_in_editor.png create mode 100644 getting_started/first_3d_game/img/07.killing_player/04.mob_detector_properties.png create mode 100644 getting_started/first_3d_game/img/07.killing_player/05.body_entered_signal.png create mode 100644 getting_started/first_3d_game/img/07.killing_player/06.player_hit_signal.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/01.label_node.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/02.score_color_picker.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/02.score_custom_color.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/02.score_label_moved.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/02.score_placeholder.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/03.creating_theme.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/04.theme_preview.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/05.dynamic_font.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/06.font_data.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/07.font_size.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/08.open_main_script.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/09.score_in_game.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/10.layout_icon.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/11.full_rect_option.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/12.anchors_updated.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/13.retry_color_picker.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/14.retry_node.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/15.layout_center.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/16.new_scene.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/17.music_player_node.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/18.music_node_properties.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/19.register_autoload.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/20.scene_dock_tabs.png create mode 100644 getting_started/first_3d_game/img/08.score_and_replay/21.remote_scene_tree.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/01.animation_player_dock.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/02.new_animation.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/03.float_name.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/03.timeline.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/04.autoplay_and_loop.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/05.pin_icon.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/06.animation_duration.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/07.editable_timeline.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/08.zoom_slider.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/09.creating_first_keyframe.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/10.initial_keys.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/11.moving_keys.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/12.second_keys_values.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/13.second_keys.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/14.play_button.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/15.box_select.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/16.easing_property.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/17.ease_out.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/18.ease_out_second_rotation_key.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/19.ease_in_second_translation_key.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/20.float_animation.gif create mode 100644 getting_started/first_3d_game/img/09.adding_animations/21.script_icon.png create mode 100644 getting_started/first_3d_game/img/09.adding_animations/22.merge_from_scene.png create mode 100644 getting_started/first_3d_game/img/squash-the-creeps-final.gif create mode 100644 getting_started/introduction/first_look_at_the_editor.rst rename getting_started/{step_by_step => introduction}/godot_design_philosophy.rst (90%) create mode 100644 getting_started/introduction/img/editor_intro_3d_viewport.png create mode 100644 getting_started/introduction/img/editor_intro_3d_viewport_perspective.png create mode 100644 getting_started/introduction/img/editor_intro_bottom_panel_animation.png create mode 100644 getting_started/introduction/img/editor_intro_bottom_panels.png create mode 100644 getting_started/introduction/img/editor_intro_editor_empty.png create mode 100644 getting_started/introduction/img/editor_intro_filesystem_dock.png create mode 100644 getting_started/introduction/img/editor_intro_help_class_animated_sprite.png create mode 100644 getting_started/introduction/img/editor_intro_inspector_dock.png create mode 100644 getting_started/introduction/img/editor_intro_language.png create mode 100644 getting_started/introduction/img/editor_intro_project_manager.png create mode 100644 getting_started/introduction/img/editor_intro_project_templates.png create mode 100644 getting_started/introduction/img/editor_intro_scene_dock.png create mode 100644 getting_started/introduction/img/editor_intro_search_help.png create mode 100644 getting_started/introduction/img/editor_intro_search_help_button.png create mode 100644 getting_started/introduction/img/editor_intro_toolbar_2d.png create mode 100644 getting_started/introduction/img/editor_intro_toolbar_3d.png create mode 100644 getting_started/introduction/img/editor_intro_top_menus.png create mode 100644 getting_started/introduction/img/editor_intro_workspace_2d.png create mode 100644 getting_started/introduction/img/editor_intro_workspace_3d.png create mode 100644 getting_started/introduction/img/editor_intro_workspace_assetlib.png create mode 100644 getting_started/introduction/img/editor_intro_workspace_script.png create mode 100644 getting_started/introduction/img/editor_ui_intro_dock_filesystem.png create mode 100644 getting_started/introduction/img/editor_ui_intro_dock_inspector.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_02_toolbar.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_03_animation_player.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_04_2d_workspace.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_05_3d_workspace.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_06_3d_workspace.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_06_script_workspace_expanded.png create mode 100644 getting_started/introduction/img/editor_ui_intro_editor_interface_overview.png create mode 100644 getting_started/introduction/img/editor_ui_intro_script_class_documentation.png create mode 100644 getting_started/introduction/img/editor_ui_intro_script_search_documentation.png create mode 100644 getting_started/introduction/img/editor_ui_intro_script_search_help_window.png create mode 100644 getting_started/introduction/img/engine_design_01.png create mode 100644 getting_started/introduction/img/engine_design_02.png create mode 100644 getting_started/introduction/img/engine_design_03.png create mode 100644 getting_started/introduction/img/engine_design_fsm_plugin.png create mode 100644 getting_started/introduction/img/engine_design_rpg_in_a_box.png create mode 100644 getting_started/introduction/img/engine_design_visual_script.png create mode 100644 getting_started/introduction/img/introduction_editor.png create mode 100644 getting_started/introduction/img/introduction_ex_zodiac.png create mode 100644 getting_started/introduction/img/introduction_helms_of_fury.jpg create mode 100644 getting_started/introduction/img/introduction_rpg_in_a_box.png create mode 100644 getting_started/introduction/img/introduction_vscode.png create mode 100644 getting_started/introduction/img/key_concepts_character_nodes.png create mode 100644 getting_started/introduction/img/key_concepts_main_menu.png create mode 100644 getting_started/introduction/img/key_concepts_node_menu.png create mode 100644 getting_started/introduction/img/key_concepts_scene_example.png create mode 100644 getting_started/introduction/img/key_concepts_scene_tree.png create mode 100644 getting_started/introduction/img/key_concepts_signals.png create mode 100644 getting_started/introduction/img/manual_class_reference_inheritance.png create mode 100644 getting_started/introduction/img/manual_class_reference_search.png create mode 100644 getting_started/introduction/img/manual_search.png create mode 100644 getting_started/introduction/key_concepts_overview.rst create mode 100644 getting_started/introduction/learning_new_features.rst delete mode 100644 getting_started/scripting/c_sharp/c_sharp_exports.rst delete mode 100644 getting_started/step_by_step/animations.rst delete mode 100644 getting_started/step_by_step/files/robisplash.zip delete mode 100644 getting_started/step_by_step/files/robisplash_assets.zip delete mode 100644 getting_started/step_by_step/files/ui_code_life_bar.zip delete mode 100644 getting_started/step_by_step/files/ui_gui_design.zip delete mode 100644 getting_started/step_by_step/files/ui_main_menu_design.zip delete mode 100644 getting_started/step_by_step/img/add_script_button.png delete mode 100644 getting_started/step_by_step/img/completed_main_scene.png delete mode 100644 getting_started/step_by_step/img/custom_font1.png delete mode 100644 getting_started/step_by_step/img/custom_font2.png create mode 100644 getting_started/step_by_step/img/custom_font3.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_dock_filesystem.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_dock_inspector.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_02_toolbar.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_03_animation_player.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_04_2d_workspace.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_05_3d_workspace.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_06_3d_workspace.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_06_script_workspace_expanded.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_07.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_08.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_editor_interface_overview.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_01.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_02.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_03.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_04.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_05.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_06.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_08.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_project_manager_09.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_script_class_documentation.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_script_search_documentation.png delete mode 100644 getting_started/step_by_step/img/editor_ui_intro_script_search_help_window.png delete mode 100644 getting_started/step_by_step/img/export_variable.png delete mode 100644 getting_started/step_by_step/img/five_common_nodes_label.png delete mode 100644 getting_started/step_by_step/img/five_common_nodes_ninepatchrect.png delete mode 100644 getting_started/step_by_step/img/five_common_nodes_texturebutton.png delete mode 100644 getting_started/step_by_step/img/five_common_nodes_textureframe.png delete mode 100644 getting_started/step_by_step/img/five_common_nodes_textureprogress.png delete mode 100644 getting_started/step_by_step/img/five_containers_boxcontainer.png delete mode 100644 getting_started/step_by_step/img/five_containers_centercontainer.png delete mode 100644 getting_started/step_by_step/img/five_containers_gridcontainer.png delete mode 100644 getting_started/step_by_step/img/five_containers_margincontainer.png delete mode 100644 getting_started/step_by_step/img/five_most_common_nodes.png delete mode 100644 getting_started/step_by_step/img/instance_scene.png delete mode 100644 getting_started/step_by_step/img/instancing.png create mode 100644 getting_started/step_by_step/img/instancing_ball_duplicated.png create mode 100644 getting_started/step_by_step/img/instancing_ball_instanced.png create mode 100644 getting_started/step_by_step/img/instancing_ball_instances_example.png create mode 100644 getting_started/step_by_step/img/instancing_ball_moved.png create mode 100644 getting_started/step_by_step/img/instancing_ball_scene.png delete mode 100644 getting_started/step_by_step/img/instancing_ballscene.png create mode 100644 getting_started/step_by_step/img/instancing_diagram_open_world.png create mode 100644 getting_started/step_by_step/img/instancing_diagram_shooter.png delete mode 100644 getting_started/step_by_step/img/instancing_import.png create mode 100644 getting_started/step_by_step/img/instancing_import_and_edit_button.png create mode 100644 getting_started/step_by_step/img/instancing_import_browse.png create mode 100644 getting_started/step_by_step/img/instancing_import_button.png create mode 100644 getting_started/step_by_step/img/instancing_import_project_file.png create mode 100644 getting_started/step_by_step/img/instancing_instance_child_window.png delete mode 100644 getting_started/step_by_step/img/instancing_linkbutton.png create mode 100644 getting_started/step_by_step/img/instancing_main_scene.png create mode 100644 getting_started/step_by_step/img/instancing_main_scene_with_balls.png delete mode 100644 getting_started/step_by_step/img/instancing_mainroot.png delete mode 100644 getting_started/step_by_step/img/instancing_mainscene.png delete mode 100644 getting_started/step_by_step/img/instancing_multiball.gif delete mode 100644 getting_started/step_by_step/img/instancing_multiball.png create mode 100644 getting_started/step_by_step/img/instancing_physics_material_expand.png delete mode 100644 getting_started/step_by_step/img/instancing_physicsmat2.png delete mode 100644 getting_started/step_by_step/img/instancing_placeball.png delete mode 100644 getting_started/step_by_step/img/instancing_playbutton.png delete mode 100644 getting_started/step_by_step/img/instancing_property.png create mode 100644 getting_started/step_by_step/img/instancing_property_bounce_updated.png create mode 100644 getting_started/step_by_step/img/instancing_property_gravity_scale.png create mode 100644 getting_started/step_by_step/img/instancing_property_revert_icon.png create mode 100644 getting_started/step_by_step/img/instancing_scene_link_button.png create mode 100644 getting_started/step_by_step/img/instancing_scene_tabs.png delete mode 100644 getting_started/step_by_step/img/instancingpre.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_LifeBar_health_update_no_anim.gif delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_Player_with_editable_children_on.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_TextureProgress_default_max_value.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_connect_signal_window_health_changed.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_final_result.gif delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_godot_generates_signal_callback.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_health_changed_signal.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_life_bar_step_tut_LevelMockup_scene_tree.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_number_animation_messed_up.gif delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_number_animation_working.gif delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_player_died_connecting_signal_window.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_player_died_signal_enemy_connected.png delete mode 100644 getting_started/step_by_step/img/lifebar_tutorial_player_gd_emits_health_changed_code.png delete mode 100644 getting_started/step_by_step/img/node_classes.png delete mode 100644 getting_started/step_by_step/img/node_search_label.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_01_empty_editor.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_02_scene_dock.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_03_create_node_window.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_04_create_label_window.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_05_editor_with_label.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_06_label_text.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_07_move_tool.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_08_hello_world_text.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_09_play_scene_button.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_10_save_scene_popup.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_11_save_scene_as.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_12_final_result.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_13_play_button.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_14_main_scene_popup.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_15_select_main_scene.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_3d_scene_example.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_character_nodes.png create mode 100644 getting_started/step_by_step/img/nodes_and_scenes_nodes.png delete mode 100644 getting_started/step_by_step/img/openworld_instancing.png delete mode 100644 getting_started/step_by_step/img/out.gif delete mode 100644 getting_started/step_by_step/img/path2d_buttons.png delete mode 100644 getting_started/step_by_step/img/player_coll_shape.png delete mode 100644 getting_started/step_by_step/img/player_scale.png delete mode 100644 getting_started/step_by_step/img/player_scene_nodes.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_button.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_editor.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_editor_autoplay.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_editor_keyframe.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_editor_keyframe_2.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_editor_play_start.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_editor_track_cursor.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_inspector.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_logo_inspector_key.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_new.png delete mode 100644 getting_started/step_by_step/img/robisplash_anim_property_keys.png delete mode 100644 getting_started/step_by_step/img/robisplash_background_inspector.png delete mode 100644 getting_started/step_by_step/img/robisplash_button_inspector.png delete mode 100644 getting_started/step_by_step/img/robisplash_editor.png delete mode 100644 getting_started/step_by_step/img/robisplash_result.png delete mode 100644 getting_started/step_by_step/img/robisplash_scene.png create mode 100644 getting_started/step_by_step/img/scripting_camera_shake.gif create mode 100644 getting_started/step_by_step/img/scripting_cpp.png create mode 100644 getting_started/step_by_step/img/scripting_csharp.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_add_sprite_node.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_attach_node_script.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_attach_script.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_centering_sprite.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_click_other_node.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_dragging_sprite.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_godot_turning_in_place.gif create mode 100644 getting_started/step_by_step/img/scripting_first_script_moving_with_input.gif create mode 100644 getting_started/step_by_step/img/scripting_first_script_print_hello_world.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_property_tooltips.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_rotating_godot.gif create mode 100644 getting_started/step_by_step/img/scripting_first_script_scene_tree.png create mode 100644 getting_started/step_by_step/img/scripting_first_script_setting_texture.png create mode 100644 getting_started/step_by_step/img/scripting_gdscript.png create mode 100644 getting_started/step_by_step/img/scripting_visualscript.png delete mode 100644 getting_started/step_by_step/img/set_collision_mask.png delete mode 100644 getting_started/step_by_step/img/shooter_instancing.png create mode 100644 getting_started/step_by_step/img/signals_01_new_scene.png create mode 100644 getting_started/step_by_step/img/signals_02_2d_scene.png create mode 100644 getting_started/step_by_step/img/signals_03_dragging_scene.png create mode 100644 getting_started/step_by_step/img/signals_04_add_child_node.png create mode 100644 getting_started/step_by_step/img/signals_05_add_button.png create mode 100644 getting_started/step_by_step/img/signals_06_drag_button.png create mode 100644 getting_started/step_by_step/img/signals_07_select_tool.png create mode 100644 getting_started/step_by_step/img/signals_08_toggle_motion_text.png create mode 100644 getting_started/step_by_step/img/signals_09_scene_setup.png create mode 100644 getting_started/step_by_step/img/signals_10_node_dock.png create mode 100644 getting_started/step_by_step/img/signals_11_pressed_signals.png create mode 100644 getting_started/step_by_step/img/signals_12_node_connection.png create mode 100644 getting_started/step_by_step/img/signals_13_signals_connection_icon.png create mode 100644 getting_started/step_by_step/img/signals_14_signals_connection_info.png create mode 100644 getting_started/step_by_step/img/signals_15_scene_tree.png create mode 100644 getting_started/step_by_step/img/signals_16_click_script.png create mode 100644 getting_started/step_by_step/img/signals_17_custom_signal.png create mode 100644 getting_started/step_by_step/img/signals_18_timer_autostart.png create mode 100644 getting_started/step_by_step/img/signals_advanced_connection_window.png delete mode 100644 getting_started/step_by_step/img/start_button_shortcut.png delete mode 100644 getting_started/step_by_step/img/tree.png delete mode 100644 getting_started/step_by_step/img/ui_anchor.png delete mode 100644 getting_started/step_by_step/img/ui_gui_containers_structure_in_godot.png delete mode 100644 getting_started/step_by_step/img/ui_gui_design_final_result.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_assemble_final_gui_1.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_assemble_final_gui_2.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_assemble_final_gui_3.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_assemble_final_gui_4.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_bar_final.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_bar_label_stacked.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_bar_nesting_inside_background.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_bar_placed_title_and_label.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_bar_template_1.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_bar_template_scene.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_containers_structure.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_counter_design_1.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_counter_design_2.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_counter_design_3.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_counter_design_4.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_counter_design_5.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_design_EnergyBar_1.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_design_EnergyBar_2.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_design_EnergyBar_3.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_design_EnergyBar_4.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_design_counters_1.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_design_counters_2.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_inherited_scene_parent.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_number_baseline.png delete mode 100644 getting_started/step_by_step/img/ui_gui_step_tutorial_textures_in_FileSystem_tab.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_6_texturerect_nodes.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_containers_step_1.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_containers_step_2.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_containers_step_3.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_containers_step_4.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_containers_step_5.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_design_final_result.png delete mode 100644 getting_started/step_by_step/img/ui_main_menu_placeholder_assets.png delete mode 100644 getting_started/step_by_step/img/ui_mockup_break_down.png delete mode 100644 getting_started/step_by_step/img/ui_texturerect_load_texture.png delete mode 100644 getting_started/step_by_step/instancing_continued.rst delete mode 100644 getting_started/step_by_step/intro_to_the_editor_interface.rst create mode 100644 getting_started/step_by_step/nodes_and_scenes.rst delete mode 100644 getting_started/step_by_step/scenes_and_nodes.rst delete mode 100644 getting_started/step_by_step/scripting.rst create mode 100644 getting_started/step_by_step/scripting_languages.rst create mode 100644 getting_started/step_by_step/scripting_player_input.rst delete mode 100644 getting_started/step_by_step/splash_screen.rst delete mode 100644 getting_started/step_by_step/ui_code_a_life_bar.rst delete mode 100644 getting_started/step_by_step/ui_game_user_interface.rst delete mode 100644 getting_started/step_by_step/ui_introduction_to_the_ui_system.rst delete mode 100644 getting_started/step_by_step/ui_main_menu.rst delete mode 100644 getting_started/step_by_step/your_first_game.rst diff --git a/getting_started/editor/img/editable-children.png b/getting_started/editor/img/editable-children.png deleted file mode 100644 index 6505ed4bcdf21d34d0cd6636ec6985b278fd99b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14724 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 G;Qs|^H{v1y diff --git a/getting_started/editor/img/unity-gui-overlay.png b/getting_started/editor/img/unity-gui-overlay.png deleted file mode 100644 index e035448bcaa67580dcd25aa16b9665a57e25284f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29405 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 z 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 UL0_aQ322vr?rEKTZBoep0~~1Z*8l(j diff --git a/getting_started/editor/unity_to_godot.rst b/getting_started/editor/unity_to_godot.rst deleted file mode 100644 index f0dc90ee7..000000000 --- a/getting_started/editor/unity_to_godot.rst +++ /dev/null @@ -1,253 +0,0 @@ -.. _unity_to_godot: - -.. references : -.. https://wiki.unrealengine.com/Unity3D_Developer's_Guide_to_Unreal_Engine_4 -.. https://docs.unrealengine.com/latest/INT/GettingStarted/FromUnity/ - -From Unity to Godot Engine -========================== - -This guide provides an overview of Godot Engine from the viewpoint of a Unity user, -and aims to help you migrate your existing Unity experience into the world of Godot. - -.. note:: - - This article talks about older versions of Unity. Nestable prefabs ('Nested prefabs') were added to Unity 2018.3. Nestable prefabs are analogous to Godot's scenes, and allow a more Godot-like approach to scene organization. - -Differences ------------ - -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ -| | Unity | Godot | -+===================+====================================================================================+================================================================================================================+ -| License | Proprietary, closed, free license with revenue caps and usage restrictions | MIT license, free and fully open source without any restriction | -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ -| OS (editor) | Windows, macOS, Linux | Windows, macOS, X11 (Linux, \*BSD) | -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ -| OS (export) | * **Desktop:** Windows, macOS, Linux | * **Desktop:** Windows, macOS, X11 | -| | * **Mobile:** Android, iOS, Windows Phone, Tizen | * **Mobile:** Android, iOS | -| | * **Web:** WebAssembly or asm.js | * **Web:** WebAssembly | -| | * **Consoles:** PS4, PS Vita, Xbox One, Xbox 360, Wii U, Nintendo 3DS | * **Console:** See :ref:`doc_consoles` | -| | * **VR:** Oculus Rift, SteamVR, Google Cardboard, PlayStation VR, Gear VR, HoloLens| * **VR:** Oculus Rift, SteamVR | -| | * **TV:** Android TV, Samsung SMART TV, tvOS | | -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ -| Scene system | * Component/Scene (GameObject > Component) | :ref:`Scene tree and nodes `, allowing scenes to be nested and/or inherit other scenes | -| | * Prefabs | | -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ -| Third-party tools | Visual Studio or VS Code | * :ref:`External editors are possible ` | -| | | * :ref:`Android SDK for Android export ` | -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ -| Notable advantages| * Huge community | * Scene System | -| | * Large assets store | * :ref:`Animation Pipeline ` | -| | | * :ref:`Easy to write Shaders ` | -| | | * Debug on Device | -| | | | -| | | | -+-------------------+------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------+ - - -The editor ----------- - -Godot Engine provides a rich-featured editor that allows you to build your games. -The pictures below display the default layouts of both editors with colored blocks to indicate common functionalities. - -.. image:: img/unity-gui-overlay.png -.. image:: img/godot-gui-overlay.png - -While both editors may seem similar, there are many differences below the surface. -Both let you organize the project using the filesystem, -but Godot's approach is simpler with a single configuration file, minimalist text format, -and no metadata. This makes Godot more friendly to VCS systems, such as Git, Subversion, or Mercurial. - -Godot's Scene panel is similar to Unity's Hierarchy panel but, as each node has a specific function, -the approach used by Godot is more visually descriptive. It's easier to understand -what a scene does at a glance. - -The Inspector in Godot is more minimal, it shows only properties. -Thanks to this, objects can expose more useful parameters to the user -without having to hide functionality in language APIs. As a plus, Godot allows animating any of those properties visually. -Changing colors, textures, enumerations, or even links to resources in real-time is possible without needing to write code. - -The Toolbar at the top of the screen is similar in both editors, offering control over project playback. -Projects in Godot run in a separate window, rather than inside the editor -(but the tree and objects can still be explored in the debugger window). - -This approach has several advantages: - -- Running the project and closing it is fast (Unity has to save, run the project, close the project, and then reload the previous state). -- Live editing is a lot more useful because changes done to the editor take effect immediately in the game and are not lost (nor have to be synced) when the game is closed. This allows fantastic workflows, like creating levels while you play them. -- The editor is more stable because the game runs in a separate process. -- The running game can be explored from different angles by toggling the "Camera Override" button in the editor viewport, which will switch between using the editor view and the game camera view. - -Finally, Godot's top toolbar includes a menu for remote debugging. -These options allow deployment to a device (connected phone, tablet, or browser via HTML5), -and debugging/live editing on it after the game is exported. - -The scene system ----------------- - -This is the most important difference between Unity and Godot and the favorite feature of most Godot users. - -Working on a 'level' in Unity usually means embedding all the required assets in a scene -and linking them together with components and scripts. - -Godot's scene system is superficially similar to Unity. A 'level' consists of a collection of nodes, each with its own purpose: Sprite, Mesh, Light, etc. However, in Godot the nodes are arranged in a tree. Each node can have multiple children, which makes each a subscene of the main scene. -This means you can compose a whole scene with different scenes stored in different files. - -For example, think of a platformer level. You would compose it with multiple elements: - -- Bricks -- Coins -- The player -- The enemies - -In Unity, you would put all the GameObjects in the scene: the player, multiple instances of enemies, -bricks everywhere to form the ground of the level and then multiple instances of coins all over the level. -You would then add various components to each element to link them and add logic in the level: For example, -you'd add a BoxCollider2D to all the elements of the scene so that they can collide. This principle is different in Godot. - -In Godot, you would split your whole scene into three separate, smaller scenes, and instance them in the main scene. - -1. **A scene for the Player alone.** - -Consider the player as an element we'd like to use in different parent scenes (for instance 'level' scenes). In our case, the player element needs at least an AnimatedSprite node. This node contains the sprite textures necessary for various animations (for example, a walking animation). - -2. **A scene for the Enemy.** - -An enemy is also an element we'd like to use in several scenes. It's almost the same -as the Player node. The only differences are the script (it needs 'AI' routines to generate the enemy's behavior) -and the sprite textures used by the AnimatedSprite node. - -3. **A Level scene.** - -A Level scene is composed of Bricks (for platforms), Coins (for the player to collect) and a -number of instances of the Enemy scene. Each instance is a node in the Level scene tree. These instances are separate enemies, -which initially have shared behavior and appearance as defined in the Enemy scene. You can set different properties for each Enemy node (to change its color, for example). - -4. **A Main scene.** -The Main scene would be composed of one root node with 2 children: a Player instance node, and a Level instance node. -The root node can be anything, generally a "root" type such as "Node" which is the most global type, -or "Node2D" (root type of all 2D-related nodes), "Spatial" (root type of all 3D-related nodes) or -"Control" (root type of all GUI-related nodes). - -As you can see, every scene is organized as a tree. The same goes for nodes' properties: you don't *add* a -collision component to a node to make it collidable like Unity does. Instead, you make this node a *child* of a -new specific node that has collision properties. Godot features various collision types nodes, depending on the usage -(see the :ref:`Physics introduction `). - -- What are the advantages of this system? Wouldn't this system potentially increase the depth of the scene tree? And doesn't Unity already allow you to organize GameObjects by putting them inside empty GameObjects? - - - Godot's system is closer to the well-known object-oriented paradigm: Godot provides a number of nodes which are not clearly "Game Objects", but they provide their children with their own capabilities: this is inheritance. - - Godot allows the extraction of a subtree of a scene to make it a scene of its own. So if a scene tree gets too deep, it can be split into smaller subtrees. This is better for reusability, as you can include any subtree as a child of any node. Putting multiple GameObjects in an empty GameObject in Unity does not provide the same functionality. - -Project organization --------------------- - -.. image:: img/unity-project-organization-example.png - -There is no perfect project architecture. -Any architecture can be made to work in either Unity and Godot. - -However, a common architecture for Unity projects is to have one Assets folder in the root directory -that contains various folders, one per type of asset: Audio, Graphics, Models, Materials, Scripts, Scenes, and so on. - -Since Godot allows splitting scenes into smaller scenes, each scene and subscene existing as a file in the project, we recommend organizing your project a bit differently. -This wiki provides a page for this: :ref:`doc_project_organization`. - - -Where are my prefabs? ---------------------- - -A prefab as provided by Unity is a 'template' element of the scene. -It is reusable, and each instance of the prefab that exists in the scene has an existence of its own, -but all of them have the same properties as defined by the prefab. - -Godot does not provide prefabs as such, but the same functionality is provided by its scene system: -The scene system is organized as a tree. Godot allows you to save any subtree of a scene as a scene file. This new scene can then be instanced as many times as you want, as a child of any node. -Any change you make to this new, separate scene will be applied to its instances. -However, any change you make to the instance will not have any impact on the 'template' scene. - -.. image:: img/save-branch-as-scene.png - -To be precise, you can modify the parameters of an instance in the Inspector panel. -The nodes that compose this instance are initially locked. You can unlock them if you need to by -right-clicking the instance in the Scene tree and selecting "Editable children" in the menu. -You don't need to do this to add *new* child nodes to this node. -Remember that any new children will belong to the instance, not to the 'template' scene on disk. -If you want to add new children to every instance of your 'template' scene, then you should add them in the 'template' scene. - -.. image:: img/editable-children.png - -Glossary correspondence ------------------------ - -- GameObject -> Node -- Add a component -> Inheriting -- Prefab -> Reusable Scene file - - -Scripting: GDScript, C# and Visual Script ------------------------------------------ - -Design -^^^^^^ - -Unity supports C#. C# benefits from its integration with Visual Studio and has desirable features such as static typing. - -Godot provides its own scripting language, :ref:`GDScript ` as well as support -for :ref:`Visual Script ` and :ref:`C# `. -GDScript borrows its syntax from Python, but is not related to it. If you wonder about the reasoning for a custom scripting language, -please read the :ref:`doc_gdscript` and :ref:`doc_faq` pages. GDScript is strongly attached to the Godot API -and doesn't take long to learn: Between one evening for an experienced programmer and a week for a complete beginner. - -Unity allows you to attach as many scripts as you want to a GameObject. -Each script adds a behavior to the GameObject: For example, you can attach a script so that it reacts to the player's controls, -and another that controls its specific game logic. - -In Godot, you can only attach one script per node. You can use either an external GDScript file -or include the script directly in the node. If you need to attach more scripts to one node, then you may consider two solutions, -depending on your scene and on what you want to achieve: - -- either add a new node between your target node and its current parent, then add a script to this new node. -- or, you can split your target node into multiple children and attach one script to each of them. - -As you can see, it can be easy to turn a scene tree to a mess. Consider splitting any complicated scene into multiple, smaller branches. - -Connections: groups and signals -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can control nodes by accessing them via script and calling built-in -or user-defined functions on them. You can also place nodes in a group -and call functions on all nodes in this group. See more in the -:ref:`scripting documentation `. - -Nodes can send a signal when a specified action occurs. A signal can -be set to call any function. You can define custom signals and specify -when they are triggered. See more in the :ref:`signals documentation `. - -Script serialization -^^^^^^^^^^^^^^^^^^^^ - -Unity can handle script serialization in two ways: - -- Implicit: All public fields in a class are automatically serialized if the type is a serializable type (``Dictionary`` is not serializable). -- Explicit: Non-public fields can be serialized using the ``[SerializeField]`` attribute. - -Godot also has a built-in script serialization system, but it works only explicitly. -You can serialize any serializable type (:ref:`built-in and various engine types `, -including :ref:`class_Array` and :ref:`class_Dictionary`) using the ``export`` keyword. -See the :ref:`exports documentation ` for details. - -Unity also has a data type called ``ScriptableObject`` used to serialize custom asset objects. -Its equivalent in Godot is the base class for all resources: :ref:`class_Resource`. -Creating a script that inherits :ref:`class_Resource` will allow you to create custom serializable objects. More information about resources can be found :ref:`here `. - -Using Godot in C++ ------------------- - -Godot allows you to develop your project directly in C++ by using its API, which is not possible with Unity at the moment. -As an example, you can consider Godot Engine's editor as a "game" written in C++ using the Godot API. - -If you are interested in using Godot in C++, you may want to start reading the :ref:`Developing in -C++ ` page. diff --git a/getting_started/editor/using_the_web_editor.rst b/getting_started/editor/using_the_web_editor.rst deleted file mode 100644 index dd690143a..000000000 --- a/getting_started/editor/using_the_web_editor.rst +++ /dev/null @@ -1,124 +0,0 @@ -.. _doc_using_the_web_editor: - -Using the Web editor -==================== - -Since Godot 3.3, there is a `Web editor `__ -you can use to work on new or existing projects. - -.. note:: - - The web editor is in a preliminary stage. While its feature set may be - sufficient for educational purposes, it is currently **not recommended for - production work**. See :ref:`doc_using_the_web_editor_limitations` below. - -Browser support ---------------- - -The Web editor requires support for WebAssembly's SharedArrayBuffer. This -is in turn required to support threading in the browser. The following desktop -browsers support WebAssembly threading and can therefore run the web editor: - -- Chrome 68 or later -- Firefox 79 or later -- Edge 79 or later - -Opera and Safari are not supported yet. Safari may work in the future once -proper threading support is added. - -**Mobile browsers are currently not supported.** - -The web editor supports both the GLES3 and GLES2 renderers, although GLES2 is -recommended for better performance and compatibility with old/low-end hardware. - -.. note:: - - If you use Linux, due to - `poor Firefox WebGL performance `__, - it's recommended to use a Chromium-based browser instead of Firefox. - -.. _doc_using_the_web_editor_limitations: - -Limitations ------------ - -Due to limitations on the Godot or Web platform side, the following features -are currently missing: - -- No C#/Mono support. -- No GDNative support. -- No debugging support. This means GDScript debugging/profiling, live scene - editing, the Remote Scene tree dock and other features that rely on the debugger - protocol will not work. -- No project exporting. As a workaround, you can download the project source - using **Project > Tools > Download Project Source** and export it using a - `native version of the Godot editor `__. -- The editor won't warn you when closing the tab with unsaved changes. -- No lightmap baking support. You can still use existing lightmaps if they were - baked with a native version of the Godot editor - (e.g. by importing an existing project). - -The following features are unlikely to be supported due to inherent limitations -of the Web platform: - -- No support for external script editors. -- No support for Android one-click deploy. - -.. seealso:: - - See the - `list of open issues on GitHub related to the web editor `__ for a list of known bugs. - -Importing a project -------------------- - -To import an existing project, the current process is as follows: - -- Specify a ZIP file to preload on the HTML5 filesystem using the - **Preload project ZIP** input. -- Run the editor by clicking **Start Godot editor**. - The Godot project manager should appear after 10-20 seconds. - On slower machines or connections, loading may take up to a minute. -- In the dialog that appears at the middle of the window, specify a name for - the folder to create then click the **Create Folder** button - (it doesn't have to match the ZIP archive's name). -- Click **Install & Edit** and the project will open in the editor. - -.. attention:: - - It's important to place the project folder somewhere in ``/home/web_user/``. - If your project folder is placed outside ``/home/web_user/``, you will - lose your project when closing the editor! - - When you follow the steps described above, the project folder will always be - located in ``/home/web_user/projects``, keeping it safe. - -Editing and running a project ------------------------------ - -Unlike the native version of Godot, the web editor is constrained to a single -window. Therefore, it cannot open a new window when running the project. -Instead, when you run the project by clicking the Run button or pressing -:kbd:`F5`, it will appear to "replace" the editor window. - -The web editor offers an alternative way to deal with the editor and game -windows (which are now "tabs"). You can switch between the **Editor** and -**Game** tabs using the buttons on the top. You can also close the running game -or editor by clicking the **×** button next to those tabs. - -Where are my project files? ---------------------------- - -Due to browser security limitations, the editor will save the project files to -the browser's IndexedDB storage. This storage isn't accessible as a regular folder -on your machine, but is abstracted away in a database. - -You can download the project files as a ZIP archive by using -**Project > Tools > Download Project Source**. This can be used to export the -project using a `native Godot editor `__, -since exporting from the web editor isn't supported yet. - -In the future, it may be possible to use the -`HTML5 FileSystem API `__ -to store the project files on the user's filesystem as the native editor would do. -However, this isn't implemented yet. diff --git a/getting_started/first_2d_game/01.project_setup.rst b/getting_started/first_2d_game/01.project_setup.rst new file mode 100644 index 000000000..84a88bf6c --- /dev/null +++ b/getting_started/first_2d_game/01.project_setup.rst @@ -0,0 +1,77 @@ +.. _doc_your_first_2d_game_project_setup: + +Setting up the project +====================== + +In this short first part, we'll set up and organize the project. + +Launch Godot and create a new project. + +.. image:: img/new-project-button.png + +.. tabs:: + .. tab:: GDScript + + Download :download:`dodge_assets.zip `. + The archive contains the images and sounds you'll be using + to make the game. Extract the archive and move the ``art/`` + and ``fonts/`` directories to your project's directory. + + .. tab:: C# + + Download :download:`dodge_assets.zip `. + The archive contains the images and sounds you'll be using + to make the game. Extract the archive and move the ``art/`` + and ``fonts/`` directories to your project's directory. + + Ensure that you have the required dependencies to use C# in Godot. + You need the .NET Core 3.1 SDK, and an editor such as VS Code. + See :ref:`doc_c_sharp_setup`. + + .. tab:: GDNative C++ + + Download :download:`dodge_assets_with_gdnative.zip + `. + The archive contains the images and sounds you'll be using + to make the game. It also contains a starter GDNative project + including a ``SConstruct`` file, a ``dodge_the_creeps.gdnlib`` + file, a ``player.gdns`` file, and an ``entry.cpp`` file. + + Ensure that you have the required dependencies to use GDNative C++. + You need a C++ compiler such as GCC or Clang or MSVC that supports C++14. + On Windows you can download Visual Studio 2019 and select the C++ workload. + You also need SCons to use the build system (the SConstruct file). + Then you need to `download the Godot C++ bindings `_ + and place them in your project. + +Your project folder should look like this. + +.. image:: img/folder-content.png + +This game is designed for portrait mode, so we need to adjust the size of the +game window. Click on *Project -> Project Settings* to open the project settings +window and in the left column, open the *Display -> Window* tab. There, set +"Width" to ``480`` and "Height" to ``720``. + +.. image:: img/setting-project-width-and-height.png + +Also, scroll down to the bottom of the section and, under the "Stretch" options, +set ``Mode`` to "2d" and ``Aspect`` to "keep". This ensures that the game scales +consistently on different sized screens. + +.. image:: img/setting-stretch-mode.png + +Organizing the project +~~~~~~~~~~~~~~~~~~~~~~ + +In this project, we will make 3 independent scenes: ``Player``, ``Mob``, and +``HUD``, which we will combine into the game's ``Main`` scene. + +In a larger project, it might be useful to create folders to hold the various +scenes and their scripts, but for this relatively small game, you can save your +scenes and scripts in the project's root folder, identified by ``res://``. You +can see your project folders in the FileSystem dock in the lower left corner: + +.. image:: img/filesystem_dock.png + +With the project in place, we're ready to design the player scene in the next lesson. diff --git a/getting_started/first_2d_game/02.player_scene.rst b/getting_started/first_2d_game/02.player_scene.rst new file mode 100644 index 000000000..d965bbb58 --- /dev/null +++ b/getting_started/first_2d_game/02.player_scene.rst @@ -0,0 +1,100 @@ +.. _doc_your_first_2d_game_player_scene: + +Creating the player scene +========================= + +With the project settings in place, we can start working on the +player-controlled character. + +The first scene will define the ``Player`` object. One of the benefits of +creating a separate Player scene is that we can test it separately, even before +we've created other parts of the game. + +Node structure +~~~~~~~~~~~~~~ + +To begin, we need to choose a root node for the player object. As a general +rule, a scene's root node should reflect the object's desired functionality - +what the object *is*. Click the "Other Node" button and add an :ref:`Area2D +` node to the scene. + +.. image:: img/add_node.png + +Godot will display a warning icon next to the node in the scene tree. You can +ignore it for now. We will address it later. + +With ``Area2D`` we can detect objects that overlap or run into the player. +Change the node's name to ``Player`` by double-clicking on it. Now that we've +set the scene's root node, we can add additional nodes to give it more +functionality. + +Before we add any children to the ``Player`` node, we want to make sure we don't +accidentally move or resize them by clicking on them. Select the node and click +the icon to the right of the lock; its tooltip says "Makes sure the object's +children are not selectable." + +.. image:: img/lock_children.png + +Save the scene. Click Scene -> Save, or press :kbd:`Ctrl + S` on Windows/Linux +or :kbd:`Cmd + S` on macOS. + +.. note:: For this project, we will be following the Godot naming conventions. + + - **GDScript**: Classes (nodes) use PascalCase, variables and + functions use snake_case, and constants use ALL_CAPS (See + :ref:`doc_gdscript_styleguide`). + + - **C#**: Classes, export variables and methods use PascalCase, + private fields use _camelCase, local variables and parameters use + camelCase (See :ref:`doc_c_sharp_styleguide`). Be careful to type + the method names precisely when connecting signals. + + +Sprite animation +~~~~~~~~~~~~~~~~ + +Click on the ``Player`` node and add an :ref:`AnimatedSprite2D +` node as a child. The ``AnimatedSprite2D`` will handle the +appearance and animations for our player. Notice that there is a warning symbol +next to the node. An ``AnimatedSprite2D`` requires a :ref:`SpriteFrames +` resource, which is a list of the animations it can +display. To create one, find the ``Frames`` property in the Inspector and click +"[empty]" -> "New SpriteFrames". Click again to open the "SpriteFrames" panel: + +.. image:: img/spriteframes_panel.png + + +On the left is a list of animations. Click the "default" one and rename it to +"walk". Then click the "New Animation" button to create a second animation named +"up". Find the player images in the "FileSystem" tab - they're in the ``art`` +folder you unzipped earlier. Drag the two images for each animation, named +``playerGrey_up[1/2]`` and ``playerGrey_walk[1/2]``, into the "Animation Frames" +side of the panel for the corresponding animation: + +.. image:: img/spriteframes_panel2.png + +The player images are a bit too large for the game window, so we need to scale +them down. Click on the ``AnimatedSprite2D`` node and set the ``Scale`` property +to ``(0.5, 0.5)``. You can find it in the Inspector under the ``Node2D`` +heading. + +.. image:: img/player_scale.png + +Finally, add a :ref:`CollisionShape2D ` as a child of +``Player``. This will determine the player's "hitbox", or the bounds of its +collision area. For this character, a ``CapsuleShape2D`` node gives the best +fit, so next to "Shape" in the Inspector, click "[empty]"" -> "New +CapsuleShape2D". Using the two size handles, resize the shape to cover the +sprite: + +.. image:: img/player_coll_shape.png + +When you're finished, your ``Player`` scene should look like this: + +.. image:: img/player_scene_nodes.png + +Make sure to save the scene again after these changes. + +In the next part, we'll add a script to the player node to move and animate it. +Then, we'll set up collision detection to know when the player got hit by +something. diff --git a/getting_started/first_2d_game/03.coding_the_player.rst b/getting_started/first_2d_game/03.coding_the_player.rst new file mode 100644 index 000000000..0d97de5a1 --- /dev/null +++ b/getting_started/first_2d_game/03.coding_the_player.rst @@ -0,0 +1,515 @@ +.. _doc_your_first_2d_game_coding_the_player: + +Coding the player +================= + +In this lesson, we'll add player movement, animation, and set it up to detect +collisions. + +To do so, we need to add some functionality that we can't get from a built-in +node, so we'll add a script. Click the ``Player`` node and click the "Attach +Script" button: + +.. image:: img/add_script_button.png + +In the script settings window, you can leave the default settings alone. Just +click "Create": + +.. note:: If you're creating a C# script or other languages, select the language + from the `language` drop down menu before hitting create. + +.. image:: img/attach_node_window.png + +.. note:: If this is your first time encountering GDScript, please read + :ref:`doc_scripting` before continuing. + +Start by declaring the member variables this object will need: + +.. tabs:: + .. code-tab:: gdscript GDScript + + extends Area2D + + export var speed = 400 # How fast the player will move (pixels/sec). + var screen_size # Size of the game window. + + .. code-tab:: csharp + + using Godot; + using System; + + public class Player : Area2D + { + [Export] + public int Speed = 400; // How fast the player will move (pixels/sec). + + public Vector2 ScreenSize; // Size of the game window. + } + + .. code-tab:: cpp + + // A `player.gdns` file has already been created for you. Attach it to the Player node. + + // Create two files `player.cpp` and `player.hpp` next to `entry.cpp` in `src`. + // This code goes in `player.hpp`. We also define the methods we'll be using here. + #ifndef PLAYER_H + #define PLAYER_H + + #include + #include + #include + #include + #include + + class Player : public godot::Area2D { + GODOT_CLASS(Player, godot::Area2D) + + godot::AnimatedSprite2D *_animated_sprite; + godot::CollisionShape2D *_collision_shape; + godot::Input *_input; + godot::Vector2 _screen_size; // Size of the game window. + + public: + real_t speed = 400; // How fast the player will move (pixels/sec). + + void _init() {} + void _ready(); + void _process(const double p_delta); + void start(const godot::Vector2 p_position); + void _on_Player_body_entered(godot::Node2D *_body); + + static void _register_methods(); + }; + + #endif // PLAYER_H + +Using the ``export`` keyword on the first variable ``speed`` allows us to set +its value in the Inspector. This can be handy for values that you want to be +able to adjust just like a node's built-in properties. Click on the ``Player`` +node and you'll see the property now appears in the "Script Variables" section +of the Inspector. Remember, if you change the value here, it will override the +value written in the script. + +.. warning:: If you're using C#, you need to (re)build the project assemblies + whenever you want to see new export variables or signals. This + build can be manually triggered by clicking the word "Mono" at the + bottom of the editor window to reveal the Mono Panel, then clicking + the "Build Project" button. + +.. image:: img/export_variable.png + +The ``_ready()`` function is called when a node enters the scene tree, which is +a good time to find the size of the game window: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _ready(): + screen_size = get_viewport_rect().size + + .. code-tab:: csharp + + public override void _Ready() + { + ScreenSize = GetViewportRect().Size; + } + + .. code-tab:: cpp + + // This code goes in `player.cpp`. + #include "player.hpp" + + void Player::_ready() { + _animated_sprite = get_node("AnimatedSprite2D"); + _collision_shape = get_node("CollisionShape2D"); + _input = godot::Input::get_singleton(); + _screen_size = get_viewport_rect().size; + } + +Now we can use the ``_process()`` function to define what the player will do. +``_process()`` is called every frame, so we'll use it to update elements of our +game, which we expect will change often. For the player, we need to do the +following: + +- Check for input. +- Move in the given direction. +- Play the appropriate animation. + +First, we need to check for input - is the player pressing a key? For this game, +we have 4 direction inputs to check. Input actions are defined in the Project +Settings under "Input Map". Here, you can define custom events and assign +different keys, mouse events, or other inputs to them. For this game, we will +just use the default events called "ui_right" etc that are assigned to the arrow +keys on the keyboard. + +You can detect whether a key is pressed using ``Input.is_action_pressed()``, +which returns ``true`` if it's pressed or ``false`` if it isn't. + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _process(delta): + var velocity = Vector2.ZERO # The player's movement vector. + if Input.is_action_pressed("ui_right"): + velocity.x += 1 + if Input.is_action_pressed("ui_left"): + velocity.x -= 1 + if Input.is_action_pressed("ui_down"): + velocity.y += 1 + if Input.is_action_pressed("ui_up"): + velocity.y -= 1 + + if velocity.length() > 0: + velocity = velocity.normalized() * speed + $AnimatedSprite2D.play() + else: + $AnimatedSprite2D.stop() + + .. code-tab:: csharp + + public override void _Process(float delta) + { + var velocity = Vector2.Zero; // The player's movement vector. + + if (Input.IsActionPressed("ui_right")) + { + velocity.x += 1; + } + + if (Input.IsActionPressed("ui_left")) + { + velocity.x -= 1; + } + + if (Input.IsActionPressed("ui_down")) + { + velocity.y += 1; + } + + if (Input.IsActionPressed("ui_up")) + { + velocity.y -= 1; + } + + var animatedSprite = GetNode("AnimatedSprite2D"); + + if (velocity.Length() > 0) + { + velocity = velocity.Normalized() * Speed; + animatedSprite.Play(); + } + else + { + animatedSprite.Stop(); + } + } + + .. code-tab:: cpp + + // This code goes in `player.cpp`. + void Player::_process(const double p_delta) { + godot::Vector2 velocity(0, 0); + + velocity.x = _input->get_action_strength("move_right") - _input->get_action_strength("move_left"); + velocity.y = _input->get_action_strength("move_down") - _input->get_action_strength("move_up"); + + if (velocity.length() > 0) { + velocity = velocity.normalized() * speed; + _animated_sprite->play(); + } else { + _animated_sprite->stop(); + } + } + +We start by setting the ``velocity`` to ``(0, 0)`` - by default, the player +should not be moving. Then we check each input and add/subtract from the +``velocity`` to obtain a total direction. For example, if you hold ``right`` and +``down`` at the same time, the resulting ``velocity`` vector will be ``(1, 1)``. +In this case, since we're adding a horizontal and a vertical movement, the +player would move *faster* diagonally than if it just moved horizontally. + +We can prevent that if we *normalize* the velocity, which means we set its +*length* to ``1``, then multiply by the desired speed. This means no more fast +diagonal movement. + +.. tip:: If you've never used vector math before, or need a refresher, you can + see an explanation of vector usage in Godot at :ref:`doc_vector_math`. + It's good to know but won't be necessary for the rest of this tutorial. + +We also check whether the player is moving so we can call ``play()`` or +``stop()`` on the AnimatedSprite2D. + + ``$`` is shorthand for ``get_node()``. So in the code above, + ``$AnimatedSprite2D.play()`` is the same as + ``get_node("AnimatedSprite2D").play()``. + +.. tip:: In GDScript, ``$`` returns the node at the relative path from the + current node, or returns ``null`` if the node is not found. Since + AnimatedSprite2D is a child of the current node, we can use + ``$AnimatedSprite2D``. + +Now that we have a movement direction, we can update the player's position. We +can also use ``clamp()`` to prevent it from leaving the screen. *Clamping* a +value means restricting it to a given range. Add the following to the bottom of +the ``_process`` function (make sure it's not indented under the `else`): + +.. tabs:: + .. code-tab:: gdscript GDScript + + position += velocity * delta + position.x = clamp(position.x, 0, screen_size.x) + position.y = clamp(position.y, 0, screen_size.y) + + .. code-tab:: csharp + + Position += velocity * delta; + Position = new Vector2( + x: Mathf.Clamp(Position.x, 0, ScreenSize.x), + y: Mathf.Clamp(Position.y, 0, ScreenSize.y) + ); + + .. code-tab:: cpp + + godot::Vector2 position = get_position(); + position += velocity * (real_t)p_delta; + position.x = godot::Math::clamp(position.x, (real_t)0.0, _screen_size.x); + position.y = godot::Math::clamp(position.y, (real_t)0.0, _screen_size.y); + set_position(position); + +.. tip:: The `delta` parameter in the `_process()` function refers to the *frame + length* - the amount of time that the previous frame took to complete. + Using this value ensures that your movement will remain consistent even + if the frame rate changes. + +Click "Play Scene" (:kbd:`F6`, :kbd:`Cmd + R` on macOS) and confirm you can move +the player around the screen in all directions. + +.. warning:: If you get an error in the "Debugger" panel that says + + ``Attempt to call function 'play' in base 'null instance' on a null + instance`` + + this likely means you spelled the name of the AnimatedSprite2D node + wrong. Node names are case-sensitive and ``$NodeName`` must match + the name you see in the scene tree. + +Choosing animations +~~~~~~~~~~~~~~~~~~~ + +Now that the player can move, we need to change which animation the +AnimatedSprite2D is playing based on its direction. We have the "walk" animation, +which shows the player walking to the right. This animation should be flipped +horizontally using the ``flip_h`` property for left movement. We also have the +"up" animation, which should be flipped vertically with ``flip_v`` for downward +movement. Let's place this code at the end of the ``_process()`` function: + +.. tabs:: + .. code-tab:: gdscript GDScript + + if velocity.x != 0: + $AnimatedSprite2D.animation = "walk" + $AnimatedSprite2D.flip_v = false + # See the note below about boolean assignment. + $AnimatedSprite2D.flip_h = velocity.x < 0 + elif velocity.y != 0: + $AnimatedSprite2D.animation = "up" + $AnimatedSprite2D.flip_v = velocity.y > 0 + + .. code-tab:: csharp + + if (velocity.x != 0) + { + animatedSprite2D.Animation = "walk"; + animatedSprite2D.FlipV = false; + // See the note below about boolean assignment. + animatedSprite2D.FlipH = velocity.x < 0; + } + else if (velocity.y != 0) + { + animatedSprite2D.Animation = "up"; + animatedSprite2D.FlipV = velocity.y > 0; + } + + .. code-tab:: cpp + + if (velocity.x != 0) { + _animated_sprite->set_animation("right"); + _animated_sprite->set_flip_v(false); + // See the note below about boolean assignment. + _animated_sprite->set_flip_h(velocity.x < 0); + } else if (velocity.y != 0) { + _animated_sprite->set_animation("up"); + _animated_sprite->set_flip_v(velocity.y > 0); + } + +.. Note:: The boolean assignments in the code above are a common shorthand for + programmers. Since we're doing a comparison test (boolean) and also + *assigning* a boolean value, we can do both at the same time. Consider + this code versus the one-line boolean assignment above: + + .. tabs:: + .. code-tab :: gdscript GDScript + + if velocity.x < 0: + $AnimatedSprite2D.flip_h = true + else: + $AnimatedSprite2D.flip_h = false + + .. code-tab:: csharp + + if (velocity.x < 0) + { + animatedSprite2D.FlipH = true; + } + else + { + animatedSprite2D.FlipH = false; + } + +Play the scene again and check that the animations are correct in each of the +directions. + +.. tip:: A common mistake here is to type the names of the animations wrong. The + animation names in the SpriteFrames panel must match what you type in + the code. If you named the animation ``"Walk"``, you must also use a + capital "W" in the code. + +When you're sure the movement is working correctly, add this line to +``_ready()``, so the player will be hidden when the game starts: + +.. tabs:: + .. code-tab:: gdscript GDScript + + hide() + + .. code-tab:: csharp + + Hide(); + + .. code-tab:: cpp + + hide(); + +Preparing for collisions +~~~~~~~~~~~~~~~~~~~~~~~~ + +We want ``Player`` to detect when it's hit by an enemy, but we haven't made any +enemies yet! That's OK, because we're going to use Godot's *signal* +functionality to make it work. + +Add the following at the top of the script, after ``extends Area2D``: + +.. tabs:: + .. code-tab:: gdscript GDScript + + signal hit + + .. code-tab:: csharp + + // Don't forget to rebuild the project so the editor knows about the new signal. + + [Signal] + public delegate void Hit(); + + .. code-tab:: cpp + + // This code goes in `player.cpp`. + // We need to register the signal here, and while we're here, we can also + // register the other methods and register the speed property. + void Player::_register_methods() { + godot::register_method("_ready", &Player::_ready); + godot::register_method("_process", &Player::_process); + godot::register_method("start", &Player::start); + godot::register_method("_on_Player_body_entered", &Player::_on_Player_body_entered); + godot::register_property("speed", &Player::speed, (real_t)400.0); + // This below line is the signal. + godot::register_signal("hit", godot::Dictionary()); + } + +This defines a custom signal called "hit" that we will have our player emit +(send out) when it collides with an enemy. We will use ``Area2D`` to detect the +collision. Select the ``Player`` node and click the "Node" tab next to the +Inspector tab to see the list of signals the player can emit: + +.. image:: img/player_signals.png + +Notice our custom "hit" signal is there as well! Since our enemies are going to +be ``RigidBody2D`` nodes, we want the ``body_entered(body: Node)`` signal. This +signal will be emitted when a body contacts the player. Click "Connect.." and +the "Connect a Signal" window appears. We don't need to change any of these +settings so click "Connect" again. Godot will automatically create a function in +your player's script. + +.. image:: img/player_signal_connection.png + +Note the green icon indicating that a signal is connected to this function. Add +this code to the function: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _on_Player_body_entered(body): + hide() # Player disappears after being hit. + emit_signal("hit") + # Must be deferred as we can't change physics properties on a physics callback. + $CollisionShape2D.set_deferred("disabled", true) + + .. code-tab:: csharp + + public void OnPlayerBodyEntered(PhysicsBody2D body) + { + Hide(); // Player disappears after being hit. + EmitSignal(nameof(Hit)); + // Must be deferred as we can't change physics properties on a physics callback. + GetNode("CollisionShape2D").SetDeferred("disabled", true); + } + + .. code-tab:: cpp + + // This code goes in `player.cpp`. + void Player::_on_Player_body_entered(godot::Node2D *_body) { + hide(); // Player disappears after being hit. + emit_signal("hit"); + // Must be deferred as we can't change physics properties on a physics callback. + _collision_shape->set_deferred("disabled", true); + } + +Each time an enemy hits the player, the signal is going to be emitted. We need +to disable the player's collision so that we don't trigger the ``hit`` signal +more than once. + +.. Note:: Disabling the area's collision shape can cause an error if it happens + in the middle of the engine's collision processing. Using + ``set_deferred()`` tells Godot to wait to disable the shape until it's + safe to do so. + +The last piece is to add a function we can call to reset the player when +starting a new game. + +.. tabs:: + .. code-tab:: gdscript GDScript + + func start(pos): + position = pos + show() + $CollisionShape2D.disabled = false + + .. code-tab:: csharp + + public void Start(Vector2 pos) + { + Position = pos; + Show(); + GetNode("CollisionShape2D").Disabled = false; + } + + .. code-tab:: cpp + + // This code goes in `player.cpp`. + void Player::start(const godot::Vector2 p_position) { + set_position(p_position); + show(); + _collision_shape->set_disabled(false); + } + +With the player working, we'll work on the enemy in the next lesson. diff --git a/getting_started/first_2d_game/04.creating_the_enemy.rst b/getting_started/first_2d_game/04.creating_the_enemy.rst new file mode 100644 index 000000000..21e13279c --- /dev/null +++ b/getting_started/first_2d_game/04.creating_the_enemy.rst @@ -0,0 +1,180 @@ +.. _doc_your_first_2d_game_creating_the_enemy: + +Creating the enemy +================== + +Now it's time to make the enemies our player will have to dodge. Their behavior +will not be very complex: mobs will spawn randomly at the edges of the screen, +choose a random direction, and move in a straight line. + +We'll create a ``Mob`` scene, which we can then *instance* to create any number +of independent mobs in the game. + +Node setup +~~~~~~~~~~ + +Click Scene -> New Scene and add the following nodes: + +- :ref:`RigidBody2D ` (named ``Mob``) + + - :ref:`AnimatedSprite2D ` + - :ref:`CollisionShape2D ` + - :ref:`VisibilityNotifier2D ` + +Don't forget to set the children so they can't be selected, like you did with +the Player scene. + +In the :ref:`RigidBody2D ` properties, set ``Gravity Scale`` +to ``0``, so the mob will not fall downward. In addition, under the +``PhysicsBody2D`` section, click the ``Mask`` property and uncheck the first +box. This will ensure the mobs do not collide with each other. + +.. image:: img/set_collision_mask.png + +Set up the :ref:`AnimatedSprite2D ` like you did for the +player. This time, we have 3 animations: ``fly``, ``swim``, and ``walk``. There +are two images for each animation in the art folder. + +Adjust the "Speed (FPS)" to ``3`` for all animations. + +.. image:: img/mob_animations.gif + +Set the ``Playing`` property in the Inspector to "On". + +We'll select one of these animations randomly so that the mobs will have some +variety. + +Like the player images, these mob images need to be scaled down. Set the +``AnimatedSprite2D``'s ``Scale`` property to ``(0.75, 0.75)``. + +As in the ``Player`` scene, add a ``CapsuleShape2D`` for the collision. To align +the shape with the image, you'll need to set the ``Rotation Degrees`` property +to ``90`` (under "Transform" in the Inspector). + +Save the scene. + +Enemy script +~~~~~~~~~~~~ + +Add a script to the ``Mob`` like this: + +.. tabs:: + .. code-tab:: gdscript GDScript + + extends RigidBody2D + + .. code-tab:: csharp + + public class Mob : RigidBody2D + { + // Don't forget to rebuild the project. + } + + .. code-tab:: cpp + + // Copy `player.gdns` to `mob.gdns` and replace `Player` with `Mob`. + // Attach the `mob.gdns` file to the Mob node. + + // Create two files `mob.cpp` and `mob.hpp` next to `entry.cpp` in `src`. + // This code goes in `mob.hpp`. We also define the methods we'll be using here. + #ifndef MOB_H + #define MOB_H + + #include + #include + #include + + class Mob : public godot::RigidBody2D { + GODOT_CLASS(Mob, godot::RigidBody2D) + + godot::AnimatedSprite2D *_animated_sprite; + + public: + void _init() {} + void _ready(); + void _on_VisibilityNotifier2D_screen_exited(); + + static void _register_methods(); + }; + + #endif // MOB_H + +Now let's look at the rest of the script. In ``_ready()`` we play the animation +and randomly choose one of the three animation types: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _ready(): + $AnimatedSprite2D.playing = true + var mob_types = $AnimatedSprite2D.frames.get_animation_names() + $AnimatedSprite2D.animation = mob_types[randi() % mob_types.size()] + + .. code-tab:: csharp + + public override void _Ready() + { + var animSprite2D = GetNode("AnimatedSprite2D"); + animSprite2D.Playing = true; + string[] mobTypes = animSprite2D.Frames.GetAnimationNames(); + animSprite2D.Animation = mobTypes[GD.Randi() % mobTypes.Length]; + } + + .. code-tab:: cpp + + // This code goes in `mob.cpp`. + #include "mob.hpp" + + #include + #include + + void Mob::_ready() { + godot::Ref random = godot::RandomNumberGenerator::_new(); + random->randomize(); + _animated_sprite = get_node("AnimatedSprite2D"); + _animated_sprite->_set_playing(true); + godot::PoolStringArray mob_types = _animated_sprite->get_sprite_frames()->get_animation_names(); + _animated_sprite->set_animation(mob_types[random->randi() % mob_types.size()]); + } + +First, we get the list of animation names from the AnimatedSprite2D's ``frames`` +property. This returns an Array containing all three animation names: ``["walk", +"swim", "fly"]``. + +We then need to pick a random number between ``0`` and ``2`` to select one of +these names from the list (array indices start at ``0``). ``randi() % n`` +selects a random integer between ``0`` and ``n-1``. + +.. note:: You must use ``randomize()`` if you want your sequence of "random" + numbers to be different every time you run the scene. We're going to + use ``randomize()`` in our ``Main`` scene, so we won't need it here. + +The last piece is to make the mobs delete themselves when they leave the screen. +Connect the ``screen_exited()`` signal of the ``VisibilityNotifier2D`` node and +add this code: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _on_VisibilityNotifier2D_screen_exited(): + queue_free() + + .. code-tab:: csharp + + public void OnVisibilityNotifier2DScreenExited() + { + QueueFree(); + } + + .. code-tab:: cpp + + // This code goes in `mob.cpp`. + void Mob::_on_VisibilityNotifier2D_screen_exited() { + queue_free(); + } + +This completes the `Mob` scene. + +With the player and enemies ready, in the next part, we'll bring them together +in a new scene. We'll make enemies spawn randomly around the game board and move +forward, turning our project into a playable game. diff --git a/getting_started/first_2d_game/05.the_main_game_scene.rst b/getting_started/first_2d_game/05.the_main_game_scene.rst new file mode 100644 index 000000000..605b40425 --- /dev/null +++ b/getting_started/first_2d_game/05.the_main_game_scene.rst @@ -0,0 +1,446 @@ +.. _doc_your_first_2d_game_the_main_game_scene: + +The main game scene +=================== + +Now it's time to bring everything we did together into a playable game scene. + +Create a new scene and add a :ref:`Node ` named ``Main``. Ensure you +create a Node, **not** a Node2D. Click the "Instance" button and select your +saved ``Player.tscn``. + +.. image:: img/instance_scene.png + +Now, add the following nodes as children of ``Main``, and name them as shown +(values are in seconds): + +- :ref:`Timer ` (named ``MobTimer``) - to control how often mobs + spawn +- :ref:`Timer ` (named ``ScoreTimer``) - to increment the score + every second +- :ref:`Timer ` (named ``StartTimer``) - to give a delay before + starting +- :ref:`Position2D ` (named ``StartPosition``) - to indicate + the player's start position + +Set the ``Wait Time`` property of each of the ``Timer`` nodes as follows: + +- ``MobTimer``: ``0.5`` +- ``ScoreTimer``: ``1`` +- ``StartTimer``: ``2`` + +In addition, set the ``One Shot`` property of ``StartTimer`` to "On" and set +``Position`` of the ``StartPosition`` node to ``(240, 450)``. + +Spawning mobs +~~~~~~~~~~~~~ + +The Main node will be spawning new mobs, and we want them to appear at a random +location on the edge of the screen. Add a :ref:`Path2D ` node +named ``MobPath`` as a child of ``Main``. When you select ``Path2D``, you will +see some new buttons at the top of the editor: + +.. image:: img/path2d_buttons.png + +Select the middle one ("Add Point") and draw the path by clicking to add the +points at the corners shown. To have the points snap to the grid, make sure "Use +Grid Snap" and "Use Snap" are both selected. These options can be found to the +left of the "Lock" button, appearing as a magnet next to some dots and +intersecting lines, respectively. + +.. image:: img/grid_snap_button.png + +.. important:: Draw the path in *clockwise* order, or your mobs will spawn + pointing *outwards* instead of *inwards*! + +.. image:: img/draw_path2d.gif + +After placing point ``4`` in the image, click the "Close Curve" button and your +curve will be complete. + +Now that the path is defined, add a :ref:`PathFollow2D ` +node as a child of ``MobPath`` and name it ``MobSpawnLocation``. This node will +automatically rotate and follow the path as it moves, so we can use it to select +a random position and direction along the path. + +Your scene should look like this: + +.. image:: img/main_scene_nodes.png + +Main script +~~~~~~~~~~~ + +Add a script to ``Main``. At the top of the script, we use ``export +(PackedScene)`` to allow us to choose the Mob scene we want to instance. + +.. tabs:: + .. code-tab:: gdscript GDScript + + extends Node + + export(PackedScene) var mob_scene + var score + + .. code-tab:: csharp + + public class Main : Node + { + // Don't forget to rebuild the project so the editor knows about the new export variable. + + #pragma warning disable 649 + // We assign this in the editor, so we don't need the warning about not being assigned. + [Export] + public PackedScene MobScene; + #pragma warning restore 649 + + public int Score; + } + + .. code-tab:: cpp + + // Copy `player.gdns` to `main.gdns` and replace `Player` with `Main`. + // Attach the `main.gdns` file to the Main node. + + // Create two files `main.cpp` and `main.hpp` next to `entry.cpp` in `src`. + // This code goes in `main.hpp`. We also define the methods we'll be using here. + #ifndef MAIN_H + #define MAIN_H + + #include + #include + #include + #include + #include + #include + #include + #include + + #include "hud.hpp" + #include "player.hpp" + + class Main : public godot::Node { + GODOT_CLASS(Main, godot::Node) + + int score; + HUD *_hud; + Player *_player; + godot::Node2D *_start_position; + godot::PathFollow2D *_mob_spawn_location; + godot::Timer *_mob_timer; + godot::Timer *_score_timer; + godot::Timer *_start_timer; + godot::AudioStreamPlayer *_music; + godot::AudioStreamPlayer *_death_sound; + godot::Ref _random; + + public: + godot::Ref mob_scene; + + void _init() {} + void _ready(); + void game_over(); + void new_game(); + void _on_MobTimer_timeout(); + void _on_ScoreTimer_timeout(); + void _on_StartTimer_timeout(); + + static void _register_methods(); + }; + + #endif // MAIN_H + +We also add a call to ``randomize()`` here so that the random number +generator generates different random numbers each time the game is run: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _ready(): + randomize() + + .. code-tab:: csharp + + public override void _Ready() + { + GD.Randomize(); + } + + .. code-tab:: cpp + + // This code goes in `main.cpp`. + #include "main.hpp" + + #include + + #include "mob.hpp" + + void Main::_ready() { + _hud = get_node("HUD"); + _player = get_node("Player"); + _start_position = get_node("StartPosition"); + _mob_spawn_location = get_node("MobPath/MobSpawnLocation"); + _mob_timer = get_node("MobTimer"); + _score_timer = get_node("ScoreTimer"); + _start_timer = get_node("StartTimer"); + // Uncomment these after adding the nodes in the "Sound effects" section of "Finishing up". + //_music = get_node("Music"); + //_death_sound = get_node("DeathSound"); + _random = (godot::Ref)godot::RandomNumberGenerator::_new(); + _random->randomize(); + } + +Click the ``Main`` node and you will see the ``Mob Scene`` property in the Inspector +under "Script Variables". + +You can assign this property's value in two ways: + +- Drag ``Mob.tscn`` from the "FileSystem" panel and drop it in the ``Mob`` + property . +- Click the down arrow next to "[empty]" and choose "Load". Select ``Mob.tscn``. + +Next, select the ``Player`` node in the Scene dock, and access the Node dock on +the sidebar. Make sure to have the Signals tab selected in the Node dock. + +You should see a list of the signals for the ``Player`` node. Find and +double-click the ``hit`` signal in the list (or right-click it and select +"Connect..."). This will open the signal connection dialog. We want to make a +new function named ``game_over``, which will handle what needs to happen when a +game ends. Type "game_over" in the "Receiver Method" box at the bottom of the +signal connection dialog and click "Connect". Add the following code to the new +function, as well as a ``new_game`` function that will set everything up for a +new game: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func game_over(): + $ScoreTimer.stop() + $MobTimer.stop() + + func new_game(): + score = 0 + $Player.start($StartPosition.position) + $StartTimer.start() + + .. code-tab:: csharp + + public void GameOver() + { + GetNode("MobTimer").Stop(); + GetNode("ScoreTimer").Stop(); + } + + public void NewGame() + { + Score = 0; + + var player = GetNode("Player"); + var startPosition = GetNode("StartPosition"); + player.Start(startPosition.Position); + + GetNode("StartTimer").Start(); + } + + .. code-tab:: cpp + + // This code goes in `main.cpp`. + void Main::game_over() { + _score_timer->stop(); + _mob_timer->stop(); + } + + void Main::new_game() { + score = 0; + _player->start(_start_position->get_position()); + _start_timer->start(); + } + +Now connect the ``timeout()`` signal of each of the Timer nodes (``StartTimer``, +``ScoreTimer`` , and ``MobTimer``) to the main script. ``StartTimer`` will start +the other two timers. ``ScoreTimer`` will increment the score by 1. + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _on_ScoreTimer_timeout(): + score += 1 + + func _on_StartTimer_timeout(): + $MobTimer.start() + $ScoreTimer.start() + + .. code-tab:: csharp + + public void OnScoreTimerTimeout() + { + Score++; + } + + public void OnStartTimerTimeout() + { + GetNode("MobTimer").Start(); + GetNode("ScoreTimer").Start(); + } + + .. code-tab:: cpp + + // This code goes in `main.cpp`. + void Main::_on_ScoreTimer_timeout() { + score += 1; + } + + void Main::_on_StartTimer_timeout() { + _mob_timer->start(); + _score_timer->start(); + } + + // Also add this to register all methods and the mob scene property. + void Main::_register_methods() { + godot::register_method("_ready", &Main::_ready); + godot::register_method("game_over", &Main::game_over); + godot::register_method("new_game", &Main::new_game); + godot::register_method("_on_MobTimer_timeout", &Main::_on_MobTimer_timeout); + godot::register_method("_on_ScoreTimer_timeout", &Main::_on_ScoreTimer_timeout); + godot::register_method("_on_StartTimer_timeout", &Main::_on_StartTimer_timeout); + godot::register_property("mob_scene", &Main::mob_scene, (godot::Ref)nullptr); + } + +In ``_on_MobTimer_timeout()``, we will create a mob instance, pick a random +starting location along the ``Path2D``, and set the mob in motion. The +``PathFollow2D`` node will automatically rotate as it follows the path, so we +will use that to select the mob's direction as well as its position. +When we spawn a mob, we'll pick a random value between ``150.0`` and +``250.0`` for how fast each mob will move (it would be boring if they were +all moving at the same speed). + +Note that a new instance must be added to the scene using ``add_child()``. + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _on_MobTimer_timeout(): + # Choose a random location on Path2D. + var mob_spawn_location = get_node("MobPath/MobSpawnLocation"); + mob_spawn_location.offset = randi() + + # Create a Mob instance and add it to the scene. + var mob = mob_scene.instance() + add_child(mob) + + # Set the mob's direction perpendicular to the path direction. + var direction = mob_spawn_location.rotation + PI / 2 + + # Set the mob's position to a random location. + mob.position = mob_spawn_location.position + + # Add some randomness to the direction. + direction += rand_range(-PI / 4, PI / 4) + mob.rotation = direction + + # Choose the velocity. + var velocity = Vector2(rand_range(150.0, 250.0), 0.0) + mob.linear_velocity = velocity.rotated(direction) + + .. code-tab:: csharp + + public void OnMobTimerTimeout() + { + // Note: Normally it is best to use explicit types rather than the `var` + // keyword. However, var is acceptable to use here because the types are + // obviously PathFollow2D and Mob, since they appear later on the line. + + // Choose a random location on Path2D. + var mobSpawnLocation = GetNode("MobPath/MobSpawnLocation"); + mobSpawnLocation.Offset = GD.Randi(); + + // Create a Mob instance and add it to the scene. + var mob = (Mob)MobScene.Instance(); + AddChild(mob); + + // Set the mob's direction perpendicular to the path direction. + float direction = mobSpawnLocation.Rotation + Mathf.Pi / 2; + + // Set the mob's position to a random location. + mob.Position = mobSpawnLocation.Position; + + // Add some randomness to the direction. + direction += (float)GD.RandRange(-Mathf.Pi / 4, Mathf.Pi / 4); + mob.Rotation = direction; + + // Choose the velocity. + var velocity = new Vector2((float)GD.RandRange(150.0, 250.0), 0); + mob.LinearVelocity = velocity.Rotated(direction); + } + + .. code-tab:: cpp + + // This code goes in `main.cpp`. + void Main::_on_MobTimer_timeout() { + // Choose a random location on Path2D. + _mob_spawn_location->set_offset((real_t)_random->randi()); + + // Create a Mob instance and add it to the scene. + godot::Node *mob = mob_scene->instance(); + add_child(mob); + + // Set the mob's direction perpendicular to the path direction. + real_t direction = _mob_spawn_location->get_rotation() + (real_t)Math_PI / 2; + + // Set the mob's position to a random location. + mob->set("position", _mob_spawn_location->get_position()); + + // Add some randomness to the direction. + direction += _random->randf_range((real_t)-Math_PI / 4, (real_t)Math_PI / 4); + mob->set("rotation", direction); + + // Choose the velocity for the mob. + godot::Vector2 velocity = godot::Vector2(_random->randf_range(150.0, 250.0), 0.0); + mob->set("linear_velocity", velocity.rotated(direction)); + } + +.. important:: Why ``PI``? In functions requiring angles, Godot uses *radians*, + not degrees. Pi represents a half turn in radians, about + ``3.1415`` (there is also ``TAU`` which is equal to ``2 * PI``). + If you're more comfortable working with degrees, you'll need to + use the ``deg2rad()`` and ``rad2deg()`` functions to convert + between the two. + +Testing the scene +~~~~~~~~~~~~~~~~~ + +Let's test the scene to make sure everything is working. Add this ``new_game`` +call to ``_ready()``: + +.. tabs:: + .. code-tab:: gdscript GDScript + + func _ready(): + randomize() + new_game() + + .. code-tab:: csharp + + public override void _Ready() + { + NewGame(); + } + + .. code-tab:: cpp + + // This code goes in `main.cpp`. + void Main::_ready() { + new_game(); + } + +Let's also assign ``Main`` as our "Main Scene" - the one that runs automatically +when the game launches. Press the "Play" button and select ``Main.tscn`` when +prompted. + +You should be able to move the player around, see mobs spawning, and see the +player disappear when hit by a mob. + +When you're sure everything is working, remove the call to ``new_game()`` from +``_ready()``. + +What's our game lacking? Some user interface. In the next lesson, we'll add a +title screen and display the player's score. diff --git a/getting_started/first_2d_game/06.heads_up_display.rst b/getting_started/first_2d_game/06.heads_up_display.rst new file mode 100644 index 000000000..87f850320 --- /dev/null +++ b/getting_started/first_2d_game/06.heads_up_display.rst @@ -0,0 +1,437 @@ +.. _doc_your_first_2d_game_heads_up_display: + +Heads up display +================ + +The final piece our game needs is a User Interface (UI) to display things like +score, a "game over" message, and a restart button. + +Create a new scene, and add a :ref:`CanvasLayer ` node named +``HUD``. "HUD" stands for "heads-up display", an informational display that +appears as an overlay on top of the game view. + +The :ref:`CanvasLayer ` node lets us draw our UI elements on +a layer above the rest of the game, so that the information it displays isn't +covered up by any game elements like the player or mobs. + +The HUD needs to display the following information: + +- Score, changed by ``ScoreTimer``. +- A message, such as "Game Over" or "Get Ready!" +- A "Start" button to begin the game. + +The basic node for UI elements is :ref:`Control `. To create our +UI, we'll use two types of :ref:`Control ` nodes: :ref:`Label +` and :ref:`Button `. + +Create the following as children of the ``HUD`` node: + +- :ref:`Label ` named ``ScoreLabel``. +- :ref:`Label ` named ``Message``. +- :ref:`Button ` named ``StartButton``. +- :ref:`Timer ` named ``MessageTimer``. + +Click on the ``ScoreLabel`` and type a number into the ``Text`` field in the +Inspector. The default font for ``Control`` nodes is small and doesn't scale +well. There is a font file included in the game assets called +"Xolonium-Regular.ttf". To use this font, do the following: + +1. Under "Custom Fonts", choose "New Font" + +.. image:: img/custom_font1.png + +2. Click on the "Font" you added, and under "Font/Data/0", + choose "Load" and select the "Xolonium-Regular.ttf" file. + +.. image:: img/custom_font2.png + +Once you've done this on the ``ScoreLabel``, you can click the down arrow next +to the Font property and choose "Copy", then "Paste" it in the same place +on the other two Control nodes. +Set "Custom Font Size" property of the ``ScoreLabel``. A setting of ``64`` works well. + +.. image:: img/custom_font3.png + +.. note:: **Anchors and Margins:** ``Control`` nodes have a position and size, + but they also have anchors and margins. Anchors define the origin - + the reference point for the edges of the node. Margins update + automatically when you move or resize a control node. They represent + the distance from the control node's edges to its anchor. + +Arrange the nodes as shown below. Click the "Layout" button to set a Control +node's layout: + +.. image:: img/ui_anchor.png + +You can drag the nodes to place them manually, or for more precise placement, +use the following settings: + +ScoreLabel +~~~~~~~~~~ + +- *Layout* : "Top Wide" +- *Text* : ``0`` +- *Align* : "Center" + +Message +~~~~~~~~~~~~ + +- *Layout* : "HCenter Wide" +- *Text* : ``Dodge the Creeps!`` +- *Align* : "Center" +- *Autowrap* : "On" + +StartButton +~~~~~~~~~~~ + +- *Text* : ``Start`` +- *Layout* : "Center Bottom" +- *Margin* : + + - Top: ``-200`` + - Bottom: ``-100`` + +On the ``MessageTimer``, set the ``Wait Time`` to ``2`` and set the ``One Shot`` +property to "On". + +Now add this script to ``HUD``: + +.. tabs:: + .. code-tab:: gdscript GDScript + + extends CanvasLayer + + signal start_game + + .. code-tab:: csharp + + public class HUD : CanvasLayer + { + // Don't forget to rebuild the project so the editor knows about the new signal. + + [Signal] + public delegate void StartGame(); + } + + .. code-tab:: cpp + + // Copy `player.gdns` to `hud.gdns` and replace `Player` with `HUD`. + // Attach the `hud.gdns` file to the HUD node. + + // Create two files `hud.cpp` and `hud.hpp` next to `entry.cpp` in `src`. + // This code goes in `hud.hpp`. We also define the methods we'll be using here. + #ifndef HUD_H + #define HUD_H + + #include + #include + #include + #include + #include + + class HUD : public godot::CanvasLayer { + GODOT_CLASS(HUD, godot::CanvasLayer) + + godot::Label *_score_label; + godot::Label *_message_label; + godot::Timer *_start_message_timer; + godot::Timer *_get_ready_message_timer; + godot::Button *_start_button; + godot::Timer *_start_button_timer; + + public: + void _init() {} + void _ready(); + void show_get_ready(); + void show_game_over(); + void update_score(const int score); + void _on_StartButton_pressed(); + void _on_StartMessageTimer_timeout(); + void _on_GetReadyMessageTimer_timeout(); + + static void _register_methods(); + }; + + #endif // HUD_H + +The ``start_game`` signal tells the ``Main`` node that the button +has been pressed. + +.. tabs:: + .. code-tab:: gdscript GDScript + + func show_message(text): + $Message.text = text + $Message.show() + $MessageTimer.start() + + .. code-tab:: csharp + + public void ShowMessage(string text) + { + var message = GetNode