#+title: Section 03 - Lesson 07, 08 | Moving/ Removing the Gem
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../../_share/media/css/godot.css" />

* Links
- [[../../toc.org][TOC - Godot Notes]]
- [[https://www.udemy.com/course/jumpstart-to-2d-game-development-godot-4-for-beginners/learn/lecture/45070467#announcements][S03:L15.07 - Moving the Gem]]
- [[https://www.udemy.com/course/jumpstart-to-2d-game-development-godot-4-for-beginners/learn/lecture/45070471#announcements][S03:L15.08 - Removing the Gem]]

* Notes

** Moving the Gem

we use scripting to extend node functionality

*** get the gem to fall
- we need to get the Gem/Area2D node to fall
  - if we had the sprite fall, the collision2D node would stay where it was


**** add a script to the root node
  - click on the attach new script button in the scene pane
    -
        #+ATTR_HTML: :width 200px
       [[file:../../_share/media/img/albert/attach_new_script.png]]
  - one script per node is the limit
  - you get access to all the children nodes inside the scene.

**** attach node script dialogue
- Template is generally Node: Default
- some object types provide other templates with different boiler plate code

- the node we attached a script to will have a script icon next to the eye icon
    -
        #+ATTR_HTML: :width 200px
       [[file:../../_share/media/img/albert/script_icon.png]]

**** detaching script from node
- sometimes you don't want a certain script attached to a node
  - for testing purposes to prevent a script from doing something
  - you want a different script, etc.

- if a script is attached, then when you select the node the "script attach button" will change from a green plus to a red x
- press the button and detach it

*** life cycle of a node
**** functions
- _ready()
- _process(delta:float)

**** tree build by stages
1. initialization stage
   - creation
   - function: _init_()

2. attachment stage
   - added to tree
   - function: _enter_tree()

3. finalization stage
   - node and children ready
   - function: _read()

**** how it is built
- every node is given an id before it gets a name

- all init functions will be called before any other stage for any other node is invoked

- similarly the attachment stage, of adding nodes to other nodes takes place before any other function in any other node is activated
  - at this point we get a name for the node

- ready tells us that the node is up and ready to go, and so are its children
  - therefore the children of the node will be set up before the parent
  - ready will be called for the children first

**** process functions
- invoked on all nodes
- every frame

- used to update the node each frame

- delta refers to the time that elapsed since previous call on previous frame
  - use delta to normalize things

**** _process(delta)
- called in main loop
- as fast as possible

**** _physics_process(delta)
- called in main loop
- regular interval

*** adding code to move gem down
- increase the y position
- all node parameters can be found in inspector (including inherited)
- position.y = position.y + speed * delta
  - speed can be anything
  - we multiply by delta to normalize it compared to the time of the previous frame

** Removing the Gem
*** basic idea
- use the viewport rect
- find the height of the rect
- when the y position of the gem is outside the bounds remove it

*** implementation
- use get_viewport_rect to get the w,h
- check if position.y > rect.size.y
- use queue_free function to remove this from the queue
- set process to stop being called via set_process
