Добавете NSIntegers САМО когато 2-ро NSInteger промени стойността

Осъзнавам, че for-цикълът вероятно би бил най-добрият начин да направите това, просто не знам правилния начин да кажа за всеки 5 преминати препятствия, добавете 1 към общото цяло число на Scriptures

Имам приложение, подобно на Flappy bird. Обект преминава между два вертикални обекта, като потребителят докосва, за да го задържи плаващ.

Методът за оценяване е малко по-различен, така че ще направя всичко възможно да го обясня. В приложението потребителят събира „писания“, като преминава през препятствията. За всеки 5 преминати препятствия потребителят печели 1. Така че в моя метод за точкуване първо разделям на 2 (за да отчитам преминаването между две препятствия) и след това разделям на 5, за да разбера колко писания са спечелени.

Също така се опитвам да следя общия брой спечелени писания. Правя това, като създавам цяло число NSUserDefault, което започва от 0. Това, което се опитвам да направя, е да разделя на 2, за да получа броя на преминатите препятствия, след това да разделя на 5, за да получа колко писания са спечелени, и да добавя това число към NSUserDefault, който споменах по-рано. Въпреки това, с кода, който предстои да видите, щом дадено писание бъде спечелено, то поддържа тази стойност и така за първите 5 препятствия всичко е наред, но след като едно писание бъде спечелено, то добавя писание към стандартните за всеки един време. Може ли някой да ме посъветва как да извърша добавянето само ако номерът на finalChange е различен от последния отчет?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                 NSInteger startIt = [defaults integerForKey:@"totalScripturesCollected"];
                 NSInteger goBetween = _score/2;
                 NSInteger finalChange = goBetween/5;
                 NSInteger toReport = startIt + finalChange;

                 [defaults setInteger:_score/2 forKey:@"theScore"];
                 [defaults setInteger:toReport forKey:@"totalScripturesCollected"];
                 [defaults synchronize];
                 NSLog(@"startit %ld", (long)startIt);
                 NSLog(@"gobetween %ld", (long)goBetween);
                 NSLog(@"finalchange %ld", (long)finalChange);
                 NSLog(@"toreport %ld", (long)toReport);

person user717452    schedule 24.11.2014    source източник
comment
Колко често се обаждате на това? _score включва ли резултатите, които сте записали преди това, или го нулирате преди всяко запазване?   -  person Tiago Lira    schedule 24.11.2014
comment
@TiagoLira, когато започне нова игра, _score се нулира на 0. Увеличава се с 2 всеки път, когато премине между препятствия. След преминаване на 5 препятствия се печели 1 писание. Целта е да увеличите NSUserDefault с 1 за всеки 5 преминати препятствия. Този код се извиква, когато успешно премине през едно препятствие.   -  person user717452    schedule 24.11.2014


Отговори (1)


Бих казал, че трябва да правите това изчисление само веднъж в края на играта.

Ако трябва да показвате резултата от изчислението през цялото време, можете да добавите класова променлива, за да поддържате броя. И при всяко изпълнение на този код направете:

count++;
if (count == 10) {
    NSInteger toReport = startIt++;
    [defaults setInteger:toReport forKey:@"totalScripturesCollected"];
    [defaults synchronize];
    count = 0;
} 

Така че на всеки 10 преминати препятствия добавяте едно писание и след това започвате да броите отново.

person Tiago Lira    schedule 24.11.2014
comment
Ще опитам това, но това се използва за печелене на постижения, така че трябва да работи през приложението, така че ако получат 1 стих, ще покаже постижението, а ако на същото ниво получат още 10, ще покажете постижението от 10 стиха. Дали поставянето на това в този код ще работи добре? - person user717452; 24.11.2014
comment
Да, използвайте този код, за да актуализирате номера всеки път. Забележете, че count трябва да бъде запазена променлива на класа, като _score. Това трябва да реши проблема ви. - person Tiago Lira; 25.11.2014
comment
Освен това, за бъдещи ситуации, моят съвет е да използвате локални и класови променливи за този вид изчисления и да използвате NSUserDefaults просто за периодично запазване на данни (в края на играта например). Това ще направи кода по-малко объркващ :) - person Tiago Lira; 25.11.2014