吾輩はやれば出来る子である。
∩∩
(´・ω・)
_| ⊃/(___
/ └-(____/
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
ロジックパネルの個数化 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時間)