3日坊主で終わらないためのアプリ開発日記 9日目

吾輩はやれば出来る子である。
    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 本日の作業

ロジックパネルの個数化 2時間目(全5時間)

前回、プレーヤーの所持データとして必要なものを

1.どのロジックパネルを何個持っているか

2.獲得累計経験値

としてまとめたので、これを保存/読込するUserDataクラスを作成する。

ロジックパネルのデータは、

種別(“ACTION” もしくは “JUDGE”)

種類(“歩く”や”左を向く”や”前方が壁なら”など)

個数

の3つを1セットとし、この3つの数値をメンバとしてもつLogicPanelUnitクラスを作成する。

UserDataクラスには、このLogicPanelUnitクラスを配列で可変個と、獲得累計経験値を持たせ、saveとloadメソッドを実装する。

誰かの役に立つかはわかりませんが、コードを貼り付けます。

尚、swiftは最適化が進んでいないのかコンパイル/実行速度共に遅いので使ってません。

UserDataクラスにはレベルも持たせていますが、獲得累計経験値から逆算できるのでファイル保存はしていません。

———— LogicPanelUnit.h ————

#ifndef EggOfEvolution_LogicPanelUnit_h
#define EggOfEvolution_LogicPanelUnit_h

@interface LogicPanelUnit : NSObject <NSCoding> {
int _kind;
int _data;
int _num;
}

@property (nonatomic) int kind;
@property (nonatomic) int data;
@property (nonatomic) int num;

@end

#endif /* LogicPanelUnit_h */

———— LogicPanelUnit.m ————

#import <Foundation/Foundation.h>
#import “LogicPanelUnit.h”

@implementation LogicPanelUnit

@synthesize kind = _kind;
@synthesize data = _data;
@synthesize num = _num;

-(id)init {
if (self = [super init]) {
_kind = 0;
_data = 0;
_num = 0;
}
return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInteger:_kind forKey:@”encKind”];
[aCoder encodeInteger:_data forKey:@”encData”];
[aCoder encodeInteger:_num forKey:@”encNum”];
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];

_kind = (int)[aDecoder decodeIntegerForKey:@”encKind”];
_data = (int)[aDecoder decodeIntegerForKey:@”encData”];
_num = (int)[aDecoder decodeIntegerForKey:@”encNum”];

return self;
}

@end

———— UserData.h ————

#ifndef EggOfEvolution_UserData_h
#define EggOfEvolution_UserData_h

@interface UserData : NSObject {
int _lv;
long _exp;
NSMutableArray *_lpa;
}

@property (nonatomic, readonly) int lv;
@property (nonatomic, readonly) long exp;

-(BOOL)addExp:(int)exp;
-(BOOL)delExp:(int)exp;
-(BOOL)addLogicPanel:(int)kind data:(int)data num:(int)num;

-(void)dump;

-(BOOL)save;
-(BOOL)load;

@end

#endif /* UserData_h */

———— UserData.m ————

#import <Foundation/Foundation.h>
#import “UserData.h”
#import “LogicPanelUnit.h”

#define LOGIC_PANEL_MAX_NUM 99
#define MAX_EXP_NUM 38085

#define K_EXP @”kExp”
#define K_LOGICPANEL @”kLogicPanel”
#define K_VERSION @”kVersion”

#define FILENAME_USERDATA @”eoe.dat”

@implementation UserData

@synthesize lv = _lv;
@synthesize exp = _exp;

-(id)init {
if (self = [super init]) {
_lv = 1;
_exp = 0;
}
return self;
}

-(BOOL)addExp:(int)exp {
BOOL bRet = YES;
_exp += exp;
if (MAX_EXP_NUM < _exp) {
_exp = MAX_EXP_NUM;
bRet = NO;
}
[self recalcLv];
return bRet;
}

-(BOOL)delExp:(int)exp {
BOOL bRet = YES;
_exp -= exp;
if (_exp < 0) {
_exp = 0;
bRet = NO;
}
[self recalcLv];
return bRet;
}

-(BOOL)recalcLv {
int preLv = _lv;
int lv = 0;
long exp = _exp;
while (0 < exp) {
lv++;
exp -= [self expAtLv:lv];
}
_lv = lv;
return preLv != _lv;
}

-(long)expAtLv:(int)lv {
if (1 <= lv && lv <= 10) {
return (10 + lv);
} else if (11 <= lv && lv <= 30) {
return (20 + (lv – 10) * 5);
} else if (31 <= lv && lv <= 90) {
return (120 + (lv – 30) * 10);
} else if (91 <= lv && lv <= 99) {
return (720 + (lv – 90) * 100);
}
return 0;
}

-(BOOL)addLogicPanel:(int)kind data:(int)data num:(int)num {
BOOL bRet = NO;

if (nil == _lpa) {
_lpa = [[NSMutableArray alloc] init];
}

for (LogicPanelUnit *unit in _lpa) {
if (unit.kind == kind && unit.data == data) {
unit.num += num;
if (LOGIC_PANEL_MAX_NUM < unit.num) {
unit.num = LOGIC_PANEL_MAX_NUM;
bRet = NO;
}
return bRet;
}
}

LogicPanelUnit *newUnit = [[LogicPanelUnit alloc] init];
newUnit.kind = kind;
newUnit.data = data;
newUnit.num = num;
if (LOGIC_PANEL_MAX_NUM < newUnit.num) {
newUnit.num = LOGIC_PANEL_MAX_NUM;
bRet = NO;
}
[_lpa addObject:newUnit];

return bRet;
}

-(BOOL)save {

NSMutableDictionary *dicSettings = [[NSMutableDictionary alloc]init];

NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@”Documents”];
NSString *path = [dir stringByAppendingPathComponent:FILENAME_USERDATA];

[dicSettings setObject:@”1.0.0″ forKey:K_VERSION];
[dicSettings setObject:[NSNumber numberWithLong:_exp] forKey:K_EXP];
if (nil != _lpa) {
[dicSettings setObject:_lpa forKey:K_LOGICPANEL];
}

if ([NSKeyedArchiver archiveRootObject:dicSettings toFile:path]) {
return YES;
}
return NO;
}

-(BOOL)load {
NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@”Documents”];
NSString *path = [dir stringByAppendingPathComponent:FILENAME_USERDATA];

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {

NSMutableDictionary *dicSettings = (NSMutableDictionary*)[NSKeyedUnarchiver unarchiveObjectWithFile:path];

_exp = [[dicSettings objectForKey:K_EXP] longValue];
[self recalcLv];

_lpa = [dicSettings objectForKey:K_LOGICPANEL];

} else {
return NO;
}
return YES;
}

-(void)dump {
NSLog(@”LV=[%d]”, _lv);
NSLog(@”EXP=[%ld]”, _exp);
for (LogicPanelUnit *unit in _lpa) {
NSLog(@”LOGICPANEL=[%d,%d,%d]”, unit.kind, unit.data, unit.num);
}
}

@end

  • 明日の作業

ロジックパネルの個数化 3時間目(全5時間)

コメントを残す

メールアドレスが公開されることはありません。