Временные события с Cocos2d - PullRequest
       13

Временные события с Cocos2d

2 голосов
/ 22 декабря 2011

Я ищу совет и, возможно, несколько примеров. Я пытаюсь выяснить, как создать CCSprite и сделать так, чтобы игрок прикоснулся к нему как можно ближе к int aCertainAmountOfTime после его создания. Я хочу, чтобы оценка игрока определялась тем, как близко к отметке в 1 секунду они попали в предмет, с более низким баллом за то, что слишком рано или слишком поздно.

Будет ли это лучше всего решить путем создания какого-либо обновления по расписанию или галочкой? Я никогда не делал этого, и я немного смущен логикой этого. Я понимаю необходимость, но не как это реализовать.

Я знаю, что этот вопрос неопределенный, но я немного растерялся, и любой совет был бы оценен. Может кто-нибудь поделиться базовым примером того, когда отметка обновления по расписанию будет иметь значение и как будет выглядеть код?

Спасибо, что справились с моей двусмысленностью = D

Ответы [ 4 ]

1 голос
/ 23 декабря 2011

Мое решение довольно простое, вам нужно только добавить это к методу init вашего класса CCSprite:

[self scheduleUpdate];

Затем обновление просто подсчитывает время с момента его создания (lifeTime - это плавающий ivar, объявленный вкласс '@interface):

-(void) udpate:(ccTime)delta
{
   lifeTime += delta;
}

Когда пользователь касается спрайта, просто вычтите 1 из lifeTime, чтобы получить разницу во времени относительно 1 секунды:

-(void) playerTouchedMe
{
   int diff = lifeTime - 1.0f;
}

Если diffотрицательно, игрок коснулся слишком рано на столько секунд.Если разность положительна, игрок коснулся слишком много секунд.И чтобы получить абсолютную разницу, вы должны использовать fabsf, то есть, в основном, он просто удаляет знак (если есть):

int absoluteDiff = fabsf(diff);

Готово.

1 голос
/ 22 декабря 2011

Исходя из того, что вы объяснили, я думаю, что планирование обновления для обработки этого было бы излишним и бессмысленным.

Вы можете создать свой объект, составив CCSprite и NSDate для хранения времени, на которое оно было помещено.сцену (вероятно, на - (void) onEnter), добавьте обнаружение касания (addTargetedDelegate CCTouchDispatcher) и сравните разницу между датой касания и датой создания с вашим количеством времени.

Если вам нужен пример кода, дайте мнезнаю, и я добавлю это позже.Это написано с телефона.

Редактировать: Добавление отсутствующего кода

@interface TimedObject : CCNode <CCTargetedTouchDelegate> {
    CCSprite    *sprite_;
    NSDate      *spawnDate_;
    NSUInteger  amountOfTime_;
}

-(id)initWithSprite:(CCSprite *)sprite andTime:(NSUInteger)amountOfTime;

@end

@implementation TimedObject

-(id)initWithSprite:(CCSprite *)sprite {
    if (self = [super init]) {
        sprite_ = sprite;
        [sprite_ setPosition:ccp(sprite_.contentSize.width * 0.5, sprite_.contentSize.height * 0.5)];
        [self addChild:sprite_];

        [self setContentSize:sprite_.contentSize];

        amountOfTime_ = amountOfTime;
    }
}

-(void)onEnter {
    [super onEnter];

    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];

    spawnDate_ = [[NSDate date] retain];
}

-(void)onExit {
    [super onExit];

    [[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
    [spawnDate_ release];
    spawnDate_ = nil;
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    CGPoint touchLocation = [touch locationInView:touch.view];
    touchLocation = [self convertToNodeSpace:touchLocation];

    CGRect touchArea;
    touchArea.origin = CGPointZero;
    touchArea.size = self.contentSize;

    if(CGRectContainsPoint(touchArea, touchLocation)) {
        // Tapped inside

        NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:spawnDate_];

        // Check here and handle
        if (interval > amountOfTime) {
            // over
        }
        else {

        }

        return YES;
    }

    return NO;
}

@end
0 голосов
/ 23 декабря 2011

Создать подкласс CCNode.Мы назовем это CustomCustom будет экземпляр CCSprite (называемый mySprite) и свойство float (называемое myTimer).Пока что мы получили что-то вроде этого:

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface Custom : CCNode {
    CCSprite *mySprite;
    float myTimer;
}
@property(readwrite)float myTimer;
@end

Хорошо.Не забудьте инициализировать myTimer в функции init Custom.Значение будет 0.0.

Теперь перейдите на свою игровую сцену.Здесь мы установим график.Перейдите к функции init вашей игровой сцены и введите:

[self schedule:@selector(updateCustomTimers:)interval:0.1];

Естественно, вам нужно будет создать метод updateCustomTimers в своем классе игровой сцены.Хорошо, теперь все, что вам нужно сделать, это перебрать каждый экземпляр Custom и увеличить их таймеры:

-(void)updateCustomTimers {
    for (Custom *myCustomInstance in arrayOfCustomInstances) {
        myCustomInstance.myTimer += 0.1;
    }
}

Обратите внимание, что arrayOfCustomInstances - это NSMutableArray, который должен содержать все экземплярыCustom в вашей игровой сцене.Поэтому всякий раз, когда вы создаете новый экземпляр Custom, добавляйте его также в массив.

Теперь у вас есть возможность обновлять отдельные таймеры для каждого отдельного спрайта (заключенного в пользовательский класс) в вашей игре.Отсюда подсчет очков должен быть легким (вы можете получить доступ к таймеру любого экземпляра Custom, полученного с помощью свойства myTimer float).

0 голосов
/ 22 декабря 2011

я бы сделал это, создав подкласс спрайта, скажем, MySprite со счетчиком с плавающей точкой внутри в качестве экземпляра закрытого члена.

затем в вашем основном цикле произнесите

-(void) nextFrame:(ccTime) dt {

[mysprite tick:dt]

if( mysprite.isExpired ) {
  //stuff here
}

в вашемсенсорным методом, когда вы нажимаете спрайт, вы можете получить

float score = mysprite.score;

, реализующий тик и свойства isExpired, и оценка довольно проста

-(void) tick:(ccTime) dt {
  counter += dt; //increment the private counter
}

@ свойство (только для чтения, неатомное) BOOL isExpired;

-(BOOL) isExpired {
return counter > TIME_LIMIT ? YES : NO;
}

и результаты с плавающей запятой @property (только для чтения, неатомные) просто возвращают оценку вашего компьютера на основе прошедшего времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...