# Class cocos.cocosnode.CocosNode

Known Subclasses:
  particle.ParticleSystem, layer.base_layers.Layer, batch.BatchNode, batch.BatchableNode, text.TextElement, draw.Canvas, scene.Scene, menu.BaseMenuItem, skeleton.Skin

Cocosnode is the main element. Anything thats gets drawn or contains things that get drawn is a cocosnode. The most popular cocosnodes are scenes, layers and sprites.

The main features of a cocosnode are:
  - They can contain other cocos nodes (add, get, remove, etc)
  - They can schedule periodic callback (schedule, schedule_interval, etc)
  - They can execute actions (do, pause, stop, etc)

Some cocosnodes provide extra functionality for them or their children.

Subclassing a cocosnode usually means (one/all) of:
  - overriding __init__ to initialize resources and schedule calbacks
  - create callbacks to handle the advancement of time
  - overriding draw to render the node

## Methods

| __contains__(self, child)
| __init__(self)
CocosNode instance | add(self, child, z=0, name=None) Adds a child and if it becomes part of the active scene calls its on_enter method
| are_actions_running(self) Determine whether any actions are running.
Action instance | do(self, action, target=None) Executes an action.
| draw(self, *args, **kwargs) This is the function you will have to override if you want your subclassed to draw something on screen.
CocosNode | get(self, name) Gets a child given its name
CocosNode or None | get_ancestor(self, klass) Walks the nodes tree upwards until it finds a node of the class `klass` or returns None
list of CocosNode | get_children(self) Return a list with the node's childs, order is back to front
euclid.Matrix3 | get_local_inverse(self) returns an euclid.Matrix3 with the local inverse transformation matrix
euclid.Matrix3 | get_local_transform(self) returns an euclid.Matrix3 with the local transformation matrix
euclid.Matrix3 | get_world_inverse(self) returns an euclid.Matrix3 with the world inverse transformation matrix
euclid.Matrix3 | get_world_transform(self) returns an euclid.Matrix3 with the world transformation matrix
| kill(self) Remove this object from its parent, and thus most likely from everything.
| on_enter(self) Called every time just before the node enters the stage.
| on_exit(self) Called every time just before the node leaves the stage
| pause(self) Suspends the execution of actions.
| pause_scheduler(self) Time will stop passing for this node: scheduled callbacks will not be called, worker actions will not be called
euclid.Vector2 | point_to_local(self, p) returns an euclid.Vector2 converted to local space
euclid.Vector2 | point_to_world(self, p) returns an euclid.Vector2 converted to world space
| remove(self, obj) Removes a child given its name or object
| remove_action(self, action) Removes an action from the node actions container, potentially calling action.stop()
| resume(self) Resumes the execution of actions.
| resume_scheduler(self) Time will continue/start passing for this node and callbacks will be called, worker actions will be called
| schedule(self, callback, *args, **kwargs) Schedule a function to be called every frame.
| schedule_interval(self, callback, interval, *args, **kwargs) Schedule a function to be called every `interval` seconds.
| stop(self) Removes all actions from the running action list
| transform(self) Apply ModelView transformations
| unschedule(self, callback) Remove a function from the schedule.
| visit(self) This function visits it's children in a recursive way.
list | walk(self, callback, collect=None) Executes callback on all the subtree starting at self.

## Properties

(int,int) | anchor Anchor point of the object.
(int,int) | anchor_x Anchor x value for transformations and adding children
(int,int) | anchor_y Anchor y value for transformations and adding children
object | parent The parent of this object.
(int, int) | position The (x, y) coordinates of the object.
| rotation
| scale
(int,int) | transform_anchor Transformation anchor point.
| x The x coordinate of the object
| y The y coordinate of the object

## Instance Variables

| actions list of Action objects that are running
| camera eye, center and up vector for the Camera.
| children list of (int, child-reference) where int is the z-order, sorted by ascending z (back to front order)
| children_names dictionary that maps children names with children references
| grid the grid object for the grid actions.
| is_running whether of not the object is running
| scheduled_calls list of scheduled callbacks
| scheduled_interval_calls list of scheduled interval callbacks
| skip_frame whether or not the next frame will be skipped
| to_remove list of Action objects to be removed
| transform_anchor_x offset from (x,0) from where rotation and scale will be applied.
| transform_anchor_y offset from (0,y) from where rotation and scale will be applied.
| visible whether of not the object is visible.

## Method Details

### add

add(self, child, z=0, name=None)
Adds a child and if it becomes part of the active scene calls its on_enter method

Parameters:
  child : CocosNode
    object to be added
  z : float
    the z index of self
  name : str
    Name of the child
Returns:
  CocosNode instance: self

### do

do(self, action, target=None)

Executes an action. When the action finished, it will be removed from the node's actions container.

to remove an action you must use the .do return value to call .remove_action

Parameters:
  action : an Action instance
    Action that will be executed.
Returns:
  Action instance: A clone of action

### draw

draw(self, *args, **kwargs)

This is the function you will have to override if you want your subclassed to draw something on screen.

You must respect the position, scale, rotation and anchor attributes. If you want OpenGL to do the scaling for you, you can:

    def draw(self):
        glPushMatrix()
        self.transform()
        # ... draw ..
        glPopMatrix()

### get

get(self, name)

Gets a child given its name

Warning: if a node is added with name, then removed not by name, the name cannot be recycled: attempting to add other node with this name will produce an Exception.

Parameters:
  name : string
    name of the reference to be get
Returns:
  CocosNode: the child named 'name'. Will raise Exception if not present

### get_children

get_children(self)
Return a list with the node's childs, order is back to front

Returns:
  list of CocosNode: childs of this node, ordered back to front

### on_enter

on_enter(self)

Called every time just before the node enters the stage.

scheduled calls and worker actions begins or continues to perform

Good point to do .push_handlers if you have custom ones Rule: a handler pushed there is near certain to require a .pop_handlers in the .on_exit method (else it will be called even after removed from the active scene, or, if going on stage again will be called multiple times for each event ocurrence)

### on_exit

on_exit(self)

Called every time just before the node leaves the stage

scheduled calls and worker actions are suspended, that is, will not be called until an on_enter event happens.

Most of the time you will want to .pop_handlers for all explicit .push_handlers found in on_enter

Consider to release here openGL resources created by this node, like compiled vertex lists

### remove

remove(self, obj)

Removes a child given its name or object

If the node was added with name, it is better to remove by name, else the name will be unavailable for further adds ( and will raise Exception if add with this same name is attempted)

If the node was part of the active scene, its on_exit method will be called.

Parameters:
  obj : string or object
    name of the reference to be removed or object to be removed

### remove_action

remove_action(self, action)

Removes an action from the node actions container, potentially calling action.stop()

If action was running, action.stop is called Mandatory interfase to remove actions in the node actions container. When skipping this there is the posibility to double call the action.stop

Parameters:
  action : Action
    Action to be removed Must be the return value for a .do(...) call

### schedule

schedule(self, callback, *args, **kwargs)

Schedule a function to be called every frame.

The function should have a prototype that includes `dt` as the first argument, which gives the elapsed time, in seconds, since the last clock tick. Any additional arguments given to this function are passed on to the callback:

    def callback(dt, *args, **kwargs):
        pass

This function is a wrapper to pyglet.clock.schedule. It has the additional benefit that all calllbacks are paused and resumed when the node leaves or enters a scene.

You should not have to schedule things using pyglet by yourself.

Parameters:
  callback : function
    The function to call each frame.

### schedule_interval

schedule_interval(self, callback, interval, *args, **kwargs)

Schedule a function to be called every `interval` seconds.

Specifying an interval of 0 prevents the function from being called again (see schedule to call a function as often as possible).

The callback function prototype is the same as for schedule.

This function is a wrapper to pyglet.clock.schedule_interval. It has the additional benefit that all calllbacks are paused and resumed when the node leaves or enters a scene.

You should not have to schedule things using pyglet by yourself.

Parameters:
  callback : function
    The function to call when the timer lapses.
  interval : float
    The number of seconds to wait between each call.

### stop

stop(self)

Removes all actions from the running action list

For each action running the stop method will be called, and the action will be retired from the actions container.

### transform

transform(self)

Apply ModelView transformations

you will most likely want to wrap calls to this function with glPushMatrix/glPopMatrix

### unschedule

unschedule(self, callback)

Remove a function from the schedule.

If the function appears in the schedule more than once, all occurances are removed. If the function was not scheduled, no error is raised.

This function is a wrapper to pyglet.clock.unschedule. It has the additional benefit that all calllbacks are paused and resumed when the node leaves or enters a scene.

You should not unschedule things using pyglet that where scheduled by node.schedule/node.schedule_interface.

Parameters:
  callback : function
    The function to remove from the schedule.

### visit

visit(self)

This function visits it's children in a recursive way.

It will first visit the children that that have a z-order value less than 0.

Then it will call the draw method to draw itself.

And finally it will visit the rest of the children (the ones with a z-value bigger or equal than 0)

Before visiting any children it will call the transform method to apply any possible transformation.

### walk

walk(self, callback, collect=None)
Executes callback on all the subtree starting at self. returns a list of all return values that are not none

Parameters:
  callback : function
    callable, takes a cocosnode as argument
  collect : list
    list of visited nodes
Returns:
  list: the list of not-none return values

## Property Details

### anchor

Anchor point of the object. Children will be added at this point and transformations like scaling and rotation will use this point as the center

Type:
  (int,int)

### anchor_x

Anchor x value for transformations and adding children

Type:
  (int,int)

### anchor_y

Anchor y value for transformations and adding children

Type:
  (int,int)

### parent

The parent of this object.

Type:
  object

### position

The (x, y) coordinates of the object.

Type:
  (int, int)

### rotation

### scale

### transform_anchor

Transformation anchor point. Transformations like scaling and rotation will use this point as it's center

Type:
  (int,int)

### x

The x coordinate of the object

### y

The y coordinate of the object

## Instance Variable Details

### camera

eye, center and up vector for the Camera. gluLookAt() is used with these values. Default: FOV 60, center of the screen. IMPORTANT: The camera can perform exactly the same transformation as `scale`, `rotation` and the `x`, `y` attributes (with the exception that the camera can modify also the z-coordinate) In fact, they all transform the same matrix, so use either the camera or the other attributes, but not both since the camera will be overridden by the transformations done by the other attributes. You can change the camera manually or by using the Camera3DAction action.

### grid

the grid object for the grid actions. This can be a Grid3D or a TiledGrid3D object depending on the action.

### transform_anchor_x

offset from (x,0) from where rotation and scale will be applied. Default: 0

### transform_anchor_y

offset from (0,y) from where rotation and scale will be applied. Default: 0

### visible

whether of not the object is visible. Default: True