forked from geode-sdk/geode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCCNode.h
More file actions
1969 lines (1711 loc) · 64.6 KB
/
CCNode.h
File metadata and controls
1969 lines (1711 loc) · 64.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2008-2010 Ricardo Quesada
Copyright (c) 2009 Valentin Milea
Copyright (c) 2011 Zynga Inc.
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#ifndef __PLATFORM_CCNODE_H__
#define __PLATFORM_CCNODE_H__
#include "../include/ccMacros.h"
#include "../cocoa/CCAffineTransform.h"
#include "../cocoa/CCArray.h"
#include "../platform/CCGL.h"
#include "../shaders/ccGLStateCache.h"
#include "../shaders/CCGLProgram.h"
#include "../kazmath/include/kazmath/kazmath.h"
#include "../script_support/CCScriptSupport.h"
#include "../include/CCProtocols.h"
#include <Geode/loader/Event.hpp>
#include <Geode/utils/casts.hpp>
namespace geode {
class Layout;
class LayoutOptions;
enum class Anchor;
template <typename T, typename>
struct CCArrayExtCheck {
using type = void;
};
}
NS_CC_BEGIN
class CCCamera;
class CCGridBase;
class CCPoint;
class CCTouch;
class CCAction;
class CCRGBAProtocol;
class CCLabelProtocol;
class CCScheduler;
class CCActionManager;
class CCComponent;
class CCDictionary;
class CCComponentContainer;
class CCKeyboardDispatcher;
/**
* @addtogroup base_nodes
* @{
*/
enum {
kCCNodeTagInvalid = -1,
};
enum {
kCCNodeOnEnter,
kCCNodeOnExit,
kCCNodeOnEnterTransitionDidFinish,
kCCNodeOnExitTransitionDidStart,
kCCNodeOnCleanup
};
/** @brief CCNode is the main element. Anything that gets drawn or contains things that get drawn is a CCNode.
The most popular CCNodes are: CCScene, CCLayer, CCSprite, CCMenu.
The main features of a CCNode are:
- They can contain other CCNode nodes (addChild, getChildByTag, removeChild, etc)
- They can schedule periodic callback (schedule, unschedule, etc)
- They can execute actions (runAction, stopAction, etc)
Some CCNode nodes provide extra functionality for them or their children.
Subclassing a CCNode usually means (one/all) of:
- overriding init to initialize resources and schedule callbacks
- create callbacks to handle the advancement of time
- overriding draw to render the node
Features of CCNode:
- position
- scale (x, y)
- rotation (in degrees, clockwise)
- CCCamera (an interface to gluLookAt )
- CCGridBase (to do mesh transformations)
- anchor point
- size
- visible
- z-order
- openGL z position
Default values:
- rotation: 0
- position: (x=0,y=0)
- scale: (x=1,y=1)
- contentSize: (x=0,y=0)
- anchorPoint: (x=0,y=0)
Limitations:
- A CCNode is a "void" object. It doesn't have a texture
Order in transformations with grid disabled
-# The node will be translated (position)
-# The node will be rotated (rotation)
-# The node will be scaled (scale)
-# The node will be moved according to the camera values (camera)
Order in transformations with grid enabled
-# The node will be translated (position)
-# The node will be rotated (rotation)
-# The node will be scaled (scale)
-# The grid will capture the screen
-# The node will be moved according to the camera values (camera)
-# The grid will render the captured screen
Camera:
- Each node has a camera. By default it points to the center of the CCNode.
*/
class CC_DLL CCNode : public CCObject
{
GEODE_FRIEND_MODIFY
public:
/// @{
/// @name Constructor, Distructor and Initializers
/**
* Default constructor
* @js ctor
*/
CCNode(void);
GEODE_CUSTOM_CONSTRUCTOR_COCOS(CCNode, CCObject)
/**
* Default destructor
* @js NA
* @lua NA
*/
virtual ~CCNode(void);
/**
* Initializes the instance of CCNode
* @return Whether the initialization was successful.
*/
virtual bool init();
/**
* Allocates and initializes a node.
* @return A initialized node which is marked as "autorelease".
*/
static CCNode * create(void);
/**
* Gets the description string. It makes debugging easier.
* @return A string terminated with '\0'
* @js NA
*/
const char* description(void);
/// @} end of initializers
/// @{
/// @name Setters & Getters for Graphic Peroperties
/**
* Sets the Z order which stands for the drawing order, and reorder this node in its parent's children array.
*
* The Z order of node is relative to its "brothers": children of the same parent.
* It's nothing to do with OpenGL's z vertex. This one only affects the draw order of nodes in cocos2d.
* The larger number it is, the later this node will be drawn in each message loop.
* Please refer to setVertexZ(float) for the difference.
*
* @param nZOrder Z order of this node.
*/
virtual void setZOrder(int zOrder);
/**
* Sets the z order which stands for the drawing order
*
* This is an internal method. Don't call it outside the framework.
* The difference between setZOrder(int) and _setOrder(int) is:
* - _setZOrder(int) is a pure setter for m_nZOrder memeber variable
* - setZOrder(int) firstly changes m_nZOrder, then recorder this node in its parent's chilren array.
*/
virtual void _setZOrder(int z);
/**
* Gets the Z order of this node.
*
* @see setZOrder(int)
*
* @return The Z order.
*/
virtual int getZOrder();
/**
* Sets the real OpenGL Z vertex.
*
* Differences between openGL Z vertex and cocos2d Z order:
* - OpenGL Z modifies the Z vertex, and not the Z order in the relation between parent-children
* - OpenGL Z might require to set 2D projection
* - cocos2d Z order works OK if all the nodes uses the same openGL Z vertex. eg: vertexZ = 0
*
* @warning Use it at your own risk since it might break the cocos2d parent-children z order
*
* @param fVertexZ OpenGL Z vertex of this node.
*/
virtual void setVertexZ(float vertexZ);
/**
* Gets OpenGL Z vertex of this node.
*
* @see setVertexZ(float)
*
* @return OpenGL Z vertex of this node
*/
virtual float getVertexZ();
/**
* Changes the scale factor on X axis of this node
*
* The deafult value is 1.0 if you haven't changed it before
*
* @param fScaleX The scale factor on X axis.
*/
virtual void setScaleX(float fScaleX);
/**
* Returns the scale factor on X axis of this node
*
* @see setScaleX(float)
*
* @return The scale factor on X axis.
*/
virtual float getScaleX();
/**
* Changes the scale factor on Y axis of this node
*
* The Default value is 1.0 if you haven't changed it before.
*
* @param fScaleY The scale factor on Y axis.
*/
virtual void setScaleY(float fScaleY);
/**
* Returns the scale factor on Y axis of this node
*
* @see setScaleY(float)
*
* @return The scale factor on Y axis.
*/
virtual float getScaleY();
/**
* Changes both X and Y scale factor of the node.
*
* 1.0 is the default scale factor. It modifies the X and Y scale at the same time.
*
* @param scale The scale factor for both X and Y axis.
*/
virtual void setScale(float scale);
/**
* Gets the scale factor of the node, when X and Y have the same scale factor.
*
* @warning Assert when m_fScaleX != m_fScaleY.
* @see setScale(float)
*
* @return The scale factor of the node.
*/
virtual float getScale();
/**
* Changes both X and Y scale factor of the node.
*
* 1.0 is the default scale factor. It modifies the X and Y scale at the same time.
*
* @param fScaleX The scale factor on X axis.
* @param fScaleY The scale factor on Y axis.
*/
virtual void setScale(float fScaleX,float fScaleY);
/**
* Changes the position (x,y) of the node in OpenGL coordinates
*
* Usually we use ccp(x,y) to compose CCPoint object.
* The original point (0,0) is at the left-bottom corner of screen.
* For example, this codesnip sets the node in the center of screen.
* @code
* CCSize size = CCDirector::sharedDirector()->getWinSize();
* node->setPosition( ccp(size.width/2, size.height/2) )
* @endcode
*
* @param position The position (x,y) of the node in OpenGL coordinates
* @js NA
*/
virtual void setPosition(const CCPoint &position);
/**
* Gets the position (x,y) of the node in OpenGL coordinates
*
* @see setPosition(const CCPoint&)
*
* @return The position (x,y) of the node in OpenGL coordinates
*/
virtual const CCPoint& getPosition();
/**
* Sets position in a more efficient way.
*
* Passing two numbers (x,y) is much efficient than passing CCPoint object.
* This method is binded to lua and javascript.
* Passing a number is 10 times faster than passing a object from lua to c++
*
* @code
* // sample code in lua
* local pos = node::getPosition() -- returns CCPoint object from C++
* node:setPosition(x, y) -- pass x, y coordinate to C++
* @endcode
*
* @param x X coordinate for position
* @param y Y coordinate for position
* @js NA
*/
virtual void setPosition(float x, float y);
/**
* Gets position in a more efficient way, returns two number instead of a CCPoint object
*
* @see setPosition(float, float)
*/
virtual void getPosition(float* x, float* y);
/**
* Gets/Sets x or y coordinate individually for position.
* These methods are used in Lua and Javascript Bindings
*/
virtual void setPositionX(float x);
virtual float getPositionX(void);
virtual void setPositionY(float y);
virtual float getPositionY(void);
/**
* Changes the X skew angle of the node in degrees.
*
* This angle describes the shear distortion in the X direction.
* Thus, it is the angle between the Y axis and the left edge of the shape
* The default skewX angle is 0. Positive values distort the node in a CW direction.
*
* @param fSkewX The X skew angle of the node in degrees.
*/
virtual void setSkewX(float fSkewX);
/**
* Returns the X skew angle of the node in degrees.
*
* @see setSkewX(float)
*
* @return The X skew angle of the node in degrees.
*/
virtual float getSkewX();
/**
* Changes the Y skew angle of the node in degrees.
*
* This angle describes the shear distortion in the Y direction.
* Thus, it is the angle between the X axis and the bottom edge of the shape
* The default skewY angle is 0. Positive values distort the node in a CCW direction.
*
* @param fSkewY The Y skew angle of the node in degrees.
*/
virtual void setSkewY(float fSkewY);
/**
* Returns the Y skew angle of the node in degrees.
*
* @see setSkewY(float)
*
* @return The Y skew angle of the node in degrees.
*/
virtual float getSkewY();
/**
* Sets the anchor point in percent.
*
* anchorPoint is the point around which all transformations and positioning manipulations take place.
* It's like a pin in the node where it is "attached" to its parent.
* The anchorPoint is normalized, like a percentage. (0,0) means the bottom-left corner and (1,1) means the top-right corner.
* But you can use values higher than (1,1) and lower than (0,0) too.
* The default anchorPoint is (0.5,0.5), so it starts in the center of the node.
*
* @param anchorPoint The anchor point of node.
*/
virtual void setAnchorPoint(const CCPoint& anchorPoint);
/**
* Returns the anchor point in percent.
*
* @see setAnchorPoint(const CCPoint&)
*
* @return The anchor point of node.
*/
virtual const CCPoint& getAnchorPoint();
/**
* Returns the anchorPoint in absolute pixels.
*
* @warning You can only read it. If you wish to modify it, use anchorPoint instead.
* @see getAnchorPoint()
*
* @return The anchor point in absolute pixels.
*/
virtual const CCPoint& getAnchorPointInPoints();
/**
* Sets the untransformed size of the node.
*
* The contentSize remains the same no matter the node is scaled or rotated.
* All nodes has a size. Layer and Scene has the same size of the screen.
*
* @param contentSize The untransformed size of the node.
*/
virtual void setContentSize(const CCSize& contentSize);
/**
* Returns the untransformed size of the node.
*
* @see setContentSize(const CCSize&)
*
* @return The untransformed size of the node.
*/
virtual const CCSize& getContentSize() const;
// @note RobTop Addition
virtual CCSize getScaledContentSize(void);
/**
* Sets whether the node is visible
*
* The default value is true, a node is default to visible
*
* @param visible true if the node is visible, false if the node is hidden.
*/
virtual void setVisible(bool visible);
/**
* Determines if the node is visible
*
* @see setVisible(bool)
*
* @return true if the node is visible, false if the node is hidden.
*/
virtual bool isVisible();
/**
* Sets the rotation (angle) of the node in degrees.
*
* 0 is the default rotation angle.
* Positive values rotate node clockwise, and negative values for anti-clockwise.
*
* @param fRotation The roration of the node in degrees.
*/
virtual void setRotation(float fRotation);
/**
* Returns the rotation of the node in degrees.
*
* @see setRotation(float)
*
* @return The rotation of the node in degrees.
*/
virtual float getRotation();
/**
* Sets the X rotation (angle) of the node in degrees which performs a horizontal rotational skew.
*
* 0 is the default rotation angle.
* Positive values rotate node clockwise, and negative values for anti-clockwise.
*
* @param fRotationX The X rotation in degrees which performs a horizontal rotational skew.
*/
virtual void setRotationX(float fRotaionX);
/**
* Gets the X rotation (angle) of the node in degrees which performs a horizontal rotation skew.
*
* @see setRotationX(float)
*
* @return The X rotation in degrees.
*/
virtual float getRotationX();
/**
* Sets the Y rotation (angle) of the node in degrees which performs a vertical rotational skew.
*
* 0 is the default rotation angle.
* Positive values rotate node clockwise, and negative values for anti-clockwise.
*
* @param fRotationY The Y rotation in degrees.
*/
virtual void setRotationY(float fRotationY);
/**
* Gets the Y rotation (angle) of the node in degrees which performs a vertical rotational skew.
*
* @see setRotationY(float)
*
* @return The Y rotation in degrees.
*/
virtual float getRotationY();
/**
* Sets the arrival order when this node has a same ZOrder with other children.
*
* A node which called addChild subsequently will take a larger arrival order,
* If two children have the same Z order, the child with larger arrival order will be drawn later.
*
* @warning This method is used internally for zOrder sorting, don't change this manually
*
* @param uOrderOfArrival The arrival order.
*/
virtual void setOrderOfArrival(unsigned int uOrderOfArrival);
/**
* Returns the arrival order, indecates which children is added previously.
*
* @see setOrderOfArrival(unsigned int)
*
* @return The arrival order.
*/
virtual unsigned int getOrderOfArrival();
/**
* Sets the state of OpenGL server side.
*
* @param glServerState The state of OpenGL server side.
* @js NA
*/
virtual void setGLServerState(ccGLServerState glServerState);
/**
* Returns the state of OpenGL server side.
*
* @return The state of OpenGL server side.
* @js NA
*/
virtual ccGLServerState getGLServerState();
/**
* Sets whether the anchor point will be (0,0) when you position this node.
*
* This is an internal method, only used by CCLayer and CCScene. Don't call it outside framework.
* The default value is false, while in CCLayer and CCScene are true
*
* @param ignore true if anchor point will be (0,0) when you position this node
* @todo This method shoud be renamed as setIgnoreAnchorPointForPosition(bool) or something with "set"
*/
virtual void ignoreAnchorPointForPosition(bool ignore);
/**
* Gets whether the anchor point will be (0,0) when you position this node.
*
* @see ignoreAnchorPointForPosition(bool)
*
* @return true if the anchor point will be (0,0) when you position this node.
*/
virtual bool isIgnoreAnchorPointForPosition();
/// @} end of Setters & Getters for Graphic Peroperties
/// @{
/// @name Children and Parent
/**
* Adds a child to the container with z-order as 0.
*
* If the child is added to a 'running' node, then 'onEnter' and 'onEnterTransitionDidFinish' will be called immediately.
*
* @param child A child node
*/
virtual void addChild(CCNode * child);
/**
* Adds a child to the container with a z-order
*
* If the child is added to a 'running' node, then 'onEnter' and 'onEnterTransitionDidFinish' will be called immediately.
*
* @param child A child node
* @param zOrder Z order for drawing priority. Please refer to setZOrder(int)
*/
virtual void addChild(CCNode * child, int zOrder);
/**
* Adds a child to the container with z order and tag
*
* If the child is added to a 'running' node, then 'onEnter' and 'onEnterTransitionDidFinish' will be called immediately.
*
* @param child A child node
* @param zOrder Z order for drawing priority. Please refer to setZOrder(int)
* @param tag A interger to identify the node easily. Please refer to setTag(int)
*/
virtual void addChild(CCNode* child, int zOrder, int tag);
/**
* Gets a child from the container with its tag
*
* @param tag An identifier to find the child node.
*
* @return a CCNode object whose tag equals to the input parameter
*/
virtual CCNode * getChildByTag(int tag);
/**
* Return an array of children
*
* Composing a "tree" structure is a very important feature of CCNode
* @example
* // Here's a sample code of traversing children array:
* CCNode* node = NULL;
* CCARRAY_FOREACH(parent->getChildren(), node)
* {
* node->setPosition(0,0);
* }
* // This sample code traverses all children nodes, and set theie position to (0,0)
* @returns An array of children
*/
virtual CCArray* getChildren();
/*
* Like `getChildren()`, but returns a `CCArrayExt<CCNode>` instead.
* You must include `<Geode/utils/cocos.hpp>` to use this, otherwise it won't compile
*/
template <typename T = CCNode, typename PleaseDontChangeMe = void>
inline auto getChildrenExt() {
// CCArrayExt is defined in geode/utils/cocos.hpp, which we cannot include due to circular includes.
// This is an incredibly hacky way to still be able to use the type
using CCArrayExt = geode::CCArrayExtCheck<T, PleaseDontChangeMe>::type;
static_assert(!std::is_void_v<CCArrayExt>, "Please include <Geode/utils/cocos.hpp> to use getChildrenExt()");
return CCArrayExt(getChildren());
}
/**
* Get the amount of children.
*
* @return The amount of children.
*/
virtual unsigned int getChildrenCount(void) const;
/**
* Sets the parent node
*
* @param parent A pointer to the parnet node
*/
virtual void setParent(CCNode* parent);
/**
* Returns a pointer to the parent node
*
* @see setParent(CCNode*)
*
* @returns A pointer to the parnet node
*/
virtual CCNode* getParent();
////// REMOVES //////
/**
* Removes this node itself from its parent node with a cleanup.
* If the node orphan, then nothing happens.
* @see removeFromParentAndCleanup(bool)
*/
virtual void removeFromParent();
/**
* Removes this node itself from its parent node.
* If the node orphan, then nothing happens.
* @param cleanup true if all actions and callbacks on this node should be removed, false otherwise.
* @js removeFromParent
*/
virtual void removeFromParentAndCleanup(bool cleanup);
// @note RobTop Addition
virtual void removeMeAndCleanup(void);
/**
* Removes a child from the container with a cleanup
*
* @see removeChild(CCNode, bool)
*
* @param child The child node which will be removed.
*/
virtual void removeChild(CCNode* child);
/**
* Removes a child from the container. It will also cleanup all running actions depending on the cleanup parameter.
*
* @param child The child node which will be removed.
* @param cleanup true if all running actions and callbacks on the child node will be cleanup, false otherwise.
*/
virtual void removeChild(CCNode* child, bool cleanup);
/**
* Removes a child from the container by tag value with a cleanup.
*
* @see removeChildByTag(int, bool)
*
* @param tag An interger number that identifies a child node
*/
virtual void removeChildByTag(int tag);
/**
* Removes a child from the container by tag value. It will also cleanup all running actions depending on the cleanup parameter
*
* @param tag An interger number that identifies a child node
* @param cleanup true if all running actions and callbacks on the child node will be cleanup, false otherwise.
*/
virtual void removeChildByTag(int tag, bool cleanup);
/**
* Removes all children from the container with a cleanup.
*
* @see removeAllChildrenWithCleanup(bool)
*/
virtual void removeAllChildren();
/**
* Removes all children from the container, and do a cleanup to all running actions depending on the cleanup parameter.
*
* @param cleanup true if all running actions on all children nodes should be cleanup, false oterwise.
* @js removeAllChildren
*/
virtual void removeAllChildrenWithCleanup(bool cleanup);
/**
* Reorders a child according to a new z value.
*
* @param child An already added child node. It MUST be already added.
* @param zOrder Z order for drawing priority. Please refer to setZOrder(int)
*/
virtual void reorderChild(CCNode * child, int zOrder);
/**
* Sorts the children array once before drawing, instead of every time when a child is added or reordered.
* This appraoch can improves the performance massively.
* @note Don't call this manually unless a child added needs to be removed in the same frame
*/
virtual void sortAllChildren();
/// @} end of Children and Parent
/// @{
/// @name Grid object for effects
/**
* Returns a grid object that is used when applying effects
*
* @return A CCGrid object that is used when applying effects
* @js NA
*/
virtual CCGridBase* getGrid();
/**
* Changes a grid object that is used when applying effects
*
* @param A CCGrid object that is used when applying effects
*/
virtual void setGrid(CCGridBase *pGrid);
/// @} end of Grid
/// @{
/// @name Tag & User data
/**
* Returns a tag that is used to identify the node easily.
*
* You can set tags to node then identify them easily.
* @example
* #define TAG_PLAYER 1
* #define TAG_MONSTER 2
* #define TAG_BOSS 3
* // set tags
* node1->setTag(TAG_PLAYER);
* node2->setTag(TAG_MONSTER);
* node3->setTag(TAG_BOSS);
* parent->addChild(node1);
* parent->addChild(node2);
* parent->addChild(node3);
* // identify by tags
* CCNode* node = NULL;
* CCARRAY_FOREACH(parent->getChildren(), node)
* {
* switch(node->getTag())
* {
* case TAG_PLAYER:
* break;
* case TAG_MONSTER:
* break;
* case TAG_BOSS:
* break;
* }
* }
* @returns A interger that identifies the node.
*/
// Robtop Removal
// virtual int getTag() const;
/**
* Changes the tag that is used to identify the node easily.
*
* Please refer to getTag for the sample code.
*
* @param A interger that indentifies the node.
*/
// Robtop Removal
// virtual void setTag(int nTag);
/**
* Returns a custom user data pointer
*
* You can set everything in UserData pointer, a data block, a structure or an object.
*
* @return A custom user data pointer
* @js NA
*/
virtual void* getUserData();
/**
* Sets a custom user data pointer
*
* You can set everything in UserData pointer, a data block, a structure or an object, etc.
* @warning Don't forget to release the memroy manually,
* especially before you change this data pointer, and before this node is autoreleased.
*
* @return A custom user data pointer
* @js NA
*/
virtual void setUserData(void *pUserData);
/**
* Returns a user assigned CCObject
*
* Similar to userData, but instead of holding a void* it holds an object
*
* @return A user assigned CCObject
* @js NA
*/
virtual CCObject* getUserObject();
/**
* Returns a user assigned CCObject
*
* Similar to UserData, but instead of holding a void* it holds an object.
* The UserObject will be retained once in this method,
* and the previous UserObject (if existed) will be relese.
* The UserObject will be released in CCNode's destructure.
*
* @note In Geode, this actually sets the user object with the ID ""
* (empty string)
*
* @param A user assigned CCObject
*/
virtual void setUserObject(CCObject *pUserObject);
/**
* Set a user-assigned CCObject with a specific ID. This allows nodes to
* have multiple user objects. Objects should be prefixed with the mod ID.
* Assigning a null removes the user object with the ID
*
* @note Geode addition
*/
GEODE_DLL void setUserObject(std::string const& id, CCObject* object);
/**
* Get a user-assigned CCObject with the specific ID
*
* @note Geode addition
*/
GEODE_DLL CCObject* getUserObject(std::string const& id);
/// @} end of Tag & User Data
private:
friend class geode::modifier::FieldContainer;
GEODE_DLL geode::modifier::FieldContainer* getFieldContainer(char const* forClass);
GEODE_DLL void addEventListenerInternal(
std::string const& id,
geode::EventListenerProtocol* protocol
);
public:
/**
* Get the string ID of this node
* @returns The ID, or an empty string if the node has no ID.
* @note Geode addition
*/
GEODE_DLL const std::string& getID();
/**
* Set the string ID of this node. String IDs are a Geode addition
* that are much safer to use to get nodes than absolute indexes
* @param id The ID of the node, recommended to be in kebab case
* without any spaces or uppercase letters. If the node is added
* by a mod, use the _spr literal to append the mod ID to it
* @note Geode addition
*/
GEODE_DLL void setID(std::string const& id);
/**
* Set the string ID of this node. String IDs are a Geode addition
* that are much safer to use to get nodes than absolute indexes
* @param id The ID of the node, recommended to be in kebab case
* without any spaces or uppercase letters. If the node is added
* by a mod, use the _spr literal to append the mod ID to it
* @note Geode addition
*/
GEODE_DLL void setID(std::string&& id);
/**
* Get a child by its string ID
* @param id ID of the child
* @returns The child, or nullptr if none was found
* @note Geode addition
*/
GEODE_DLL CCNode* getChildByID(std::string_view id);
/**
* Get a child by its string ID. Recursively searches all the children
* @param id ID of the child
* @returns The child, or nullptr if none was found
* @note Geode addition
*/
GEODE_DLL CCNode* getChildByIDRecursive(std::string_view id);
/**
* Get a child based on a query. Searches the child tree for a matching
* child. The query currently only supports the following features:
* - `node-id`: Match a node with a specific ID
* - `node-id-1 node-id-2`: Match a descendant (possibly not immediate)
* child of a node with a specific ID
* - `node-id-1 > node-id-2`: Match the immediate child of a node with a
* specific ID
* For example, the query "my-layer button-menu > mod.id/epic-button" is
* equivalent to `getChildByIDRecursive("my-layer")
* ->getChildByIDRecursive("button-menu")
* ->getChildByID("mod.id/epic-button")`
* @returns The first matching node, or nullptr if none was found
*/
GEODE_DLL CCNode* querySelector(std::string_view query);
/**
* Removes a child from the container by its ID.
* @param id The ID of the node
* @note Geode addition
*/
GEODE_DLL void removeChildByID(std::string_view id);
/**
* Add a child before a specified existing child
* @param child The node to add. The node may not be a child of another
* node already
* @param before The child the node is added before of. If this is null or
* not a child of this node, the new child will be placed at the start of the
* child list
* @note Geode addition
*/
GEODE_DLL void insertBefore(CCNode* child, CCNode* before);
/**
* Add a child after an specified existing child
* @param child The node to add. The node may not be a child of another
* node already
* @param after The child the node is added after of. If this is null or
* not a child of this node, the new child will be placed at the end of the
* child list
* @note Geode addition
*/
GEODE_DLL void insertAfter(CCNode* child, CCNode* after);
/**
* Check if this node's parent or its parents' parent is the given node
* @param ancestor The node whose child or subchild this node should be. If
* nullptr, returns true if the node is in the current scene, otherwise
* false.
* @returns True if ancestor is an ancestor of this node
* @note Geode addition
*/
GEODE_DLL bool hasAncestor(CCNode* ancestor);
/**
* Set the Layout for this node. Used to automatically position children,