Это может показаться довольно простым. Я заполнил массив PhysicsSprites в классе (Sprites.mm), который возвращает себя (который я инициализирую в методе init метода HelloWorldLayer.mm). Как получить доступ к массиву (из Sprites.mm) в методе обновления HelloWorldLayer.mm? Я хочу поместить некоторые ограничения на спрайты в методе обновления. Пожалуйста помоги.Доступ к массиву из одного класса в другой - cocos2d
ответ
Прежде всего, вы должны одни и те же b2World в обоих классах, а затем вы можете получить доступ к мир Sprites.mm.
Для лучшего понимания я создал демоверсию, которая будет работать. Я добавляю код кода Sprites.mm, который я назвал, как Spritese.h & Spritese.mm
Ниже приведен код Spritese.h
@interface Spritese : CCLayer {
NSMutableArray *arrSprite;
b2World* world;
}
@property (nonatomic,retain) NSMutableArray *arrSprite;
-(id)initWithArrayOfSprites : (b2World *)_world;
@end
показано ниже для .mm
@implementation Spritese
@synthesize arrSprite;
#define PTM_RATIO 32
#define kTagBatchNode 1
-(id)initWithArrayOfSprites :(b2World *)_world{
if((self = [super init])){
CGSize screenSize = [CCDirector sharedDirector].winSize;
world = _world;
//Set up sprite
CCSpriteBatchNode *batch = [CCSpriteBatchNode batchNodeWithFile:@"blocks.png" capacity:150];
[self addChild:batch z:0 tag:kTagBatchNode];
for(int i=0; i<3; i++)//creating 3 objects
[self addNewSpriteWithCoords:ccp(screenSize.width/2, screenSize.height/2)];
}
return self;
}
-(void) addNewSpriteWithCoords:(CGPoint)p
{
CCLOG(@"Add sprite %0.2f x %02.f",p.x,p.y);
CCSpriteBatchNode *batch = (CCSpriteBatchNode*) [self getChildByTag:kTagBatchNode];
//We have a 64x64 sprite sheet with 4 different 32x32 images. The following code is
//just randomly picking one of the images
int idx = (CCRANDOM_0_1() > .5 ? 0:1);
int idy = (CCRANDOM_0_1() > .5 ? 0:1);
CCSprite *sprite = [CCSprite spriteWithBatchNode:batch rect:CGRectMake(32 * idx,32 * idy,32,32)];
[batch addChild:sprite];
sprite.position = ccp(p.x, p.y);
// Define the dynamic body.
//Set up a 1m squared box in the physics world
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
bodyDef.userData = sprite;
b2Body *body = world->CreateBody(&bodyDef);
// Define another box shape for our dynamic body.
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box
// Define the dynamic body fixture.
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
body->CreateFixture(&fixtureDef);
[arrSprite addObject:sprite];
}
@end
В файле HelloWorld.h импортировать класс Spritese и добавить
@property(nonatomic,retain) Spritese *sprit;
и синтезировать его в .mm файле
Теперь в методе инициализации в HelloWorld добавить этот код
sprit = [[Spritese alloc] initWithArrayOfSprites:world];
[self addChild:sprit];
И, наконец, в клеща или обновления метода необходимо добавить
-(void) tick: (ccTime) dt
{
int32 velocityIterations = 8;
int32 positionIterations = 1;
world->Step(dt, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != NULL) {
CCSprite *myActor = (CCSprite*)b->GetUserData();
myActor.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
Spritese *s = (Spritese *)b->GetUserData();
for(int i=0; i < [sprit.arrSprite count]; i++){
if(s == [sprit.arrSprite objectAtIndex:i]){
s.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
s.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
NSLog(@"Process Sprite Here");
}
}
}
}
}
I надеюсь, что пример кода будет работать на вашей стороне.
создать свойство в файле sprites.h
@property (nonatomic, readonly) NSArray* physicSprites;
затем в файле .mm
@synthesize physicSprites = m_physicSprites;
, если ваш экземпляр массива называется m_physicSprites;
тогда вы будете иметь возможность получить доступ к нему чего-л, как
[spritesInstance physicSprites];
или
spriteInstance.physicSprites
спасибо. см. комментарий в ответе ниже – wilM
- 1. Как я могу получить доступ к массиву строк из одного класса в другой в C#
- 2. Доступ к UIView-методу из класса Cocos2D
- 3. Доступ к переменным из одного класса в другой в Python
- 4. Доступ к данным из одного класса в другой в android
- 5. Доступ к массиву объектов из другого класса
- 6. Доступ к массиву из другого класса
- 7. PHP Доступ к одному массиву из класса
- 8. доступ к массиву из другого класса
- 9. Доступ к переменным из одного файла класса в другой
- 10. C# - Доступ к списку объектов из одного класса в другой
- 11. Как получить доступ к переменным из одного класса в другой?
- 12. Доступ к структуре из одного класса в другой
- 13. C# Доступ к переменной-члену из одного класса в другой
- 14. Как получить доступ к String из одного класса в другой?
- 15. Cocos2d перенос переменной из одного класса в другой класс
- 16. Доступ к тегам из разных классов - cocos2d
- 17. Доступ к другой вкладке из одного окна
- 18. Как получить доступ к массиву из другой цели (KeyboardViewController)
- 19. как доступ к функциям одного класса в другой цель с
- 20. Доступ к массиву struct внутри другой структуры
- 21. , как получить доступ к массиву в конфигурационном файле из класса
- 22. Доступ к массиву доступа в GameScene из экземпляра класса SKSpriteNode?
- 23. Python: доступ к атрибутам и методам одного класса в другой
- 24. Доступ NSTimer из одного класса в другой класс
- 25. Доступ к 2-мерному массиву из класса объектов.
- 26. Cast исключение из одного класса в другой
- 27. Pass значение из одного класса в другой
- 28. Доступ к массиву в script_score
- 29. Доступ к массиву из другой проблемы с контроллером представления
- 30. Javascript не может получить доступ к массиву из одного файла в другой
Угадайте, это сработало, но у меня проблема, которая, как мне кажется, связана с методом обновления. На данный момент я хочу наложить гравитацию (выше мира) на спрайтов в «arrSprite», но они все еще отвечают мировой гравитации. См. Метод обновления ниже. '- (void) update: (ccTime) dt { \t \t int32 velocityIterations = 8; \t int32 positionIterations = 1; \t world-> Step (dt, velocityIterations, positionIterations); \t для (PhysicsSprite * spr in sprit.arrSprite) { b2Body * bBody = [spr getPhysicsBody]; bBody-> ApplyForce (b2Vec2 (0,20 * bBody-> GetMass()), bBody-> GetWorldCenter()); } } ' – wilM
Извините abt форматирование кода – wilM
Как вы делитесь одним и тем же миром в обоих слоях. Вы не сможете отличить оба мира. Я предполагаю, что любой слой не может иметь более одного мира. – Marine