IOS开发入门介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
iPhone 发环境设置
If the ax is dull and its edge unsharpened, more strength is needed.
铁器钝了,若不将刃磨快,就必多费气力。
——《旧约•传道书》
书 让 统 习 发 础 识,让 习 软 发 过 术 发 同时也为 经验 发 实 编 实例 这 贵 实例 进 发时 实际 发 软 时 问题时最珍贵的资源,有效使用这些资源能让你快速解决问题, 实现软件需要的功能, 节约你大量的宝贵时间。
对 术 们 习 还
户 编 还 样 码 临 练习 刚刚
软 发 时 这样 书 实 发 讲 软 发 识 读 阅读 时 编译 码 这 码应 实际 软 发 选 绍时 杂 满 项 发 实际
统
进 发 拥 统 码 对许 统 烦 为 发环 发环 为 讲解 发环
统 见 图
华硕
1.6 Wine Source Insight
Source Insight 过 优 码阅读 编辑 软 码编辑 码浏览 对 语 语 语 汇编 语 语 Source Insight 阅读 软 码 软 块 间 间 继 间 调 码 码 编 优 软 许 业软 Source Insight 编辑 发 执
$ mv Si3Setup.exe ~/.wine/drive_c/
$ cd ~/.wine/drive_c/
$ wine Si3Setup.exe
启动Source Insight 过 样 输 结
Source Insight 码阅读 软 码 Source Insight 运 时 图
编 础
A wise man who built his house on the rock, a foolish man who built his house on sand.
一个聪明人,把房子盖在磐石上。
无知的人,把房子盖在沙土上。
——《新约•马太福音》
2.15 Objective-C 编程
2.15.1 编程之@protocol
Protocols
@protocol 义 过@protocol 义 实现该 这 义 为
@protocol 实现 协议仅仅 义 负责实现
为 骤 调 实现 们
该
// ClassWithProtocol.h
#import <Foundation/Foundation.h>
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;
@end
义 该
@interface ClassWithProtocol : NSObject
{
id <ProcessDataDelegate> delegate;
}
变 为
@property (retain) id delegate;
时 义 务 务 时 调
-(void)startSomeProcess;
@end
调 户 时 设 这 该 调 户 码
// ClassWithProtocol.m
#import "ClassWithProtocol.h"
@implementation ClassWithProtocol
@synthesize delegate;
- (void)processComplete
{
// 调接口,processSuccessful() 负责具体实现
[[self delegate] processSuccessful:YES];
}
// 过定时器, 拟在任务完成时调用接口回调函数
-(void)startSomeProcess
{
[NSTimer scheduledTimerWithTimeInterval:5.0target:self selector:@selector(processComplete) userInfo:nil repeats:YES];
}
@end
实现 编 测试 实现 码
// test_appAppDelegate.h
#import <UIKit/UIKit.h>
#import "ClassWithProtocol.h"
@class testAppObject;
@interface TestAppDelegate : NSObject <UIApplicationDelegate, ProcessDataDelegate>
{
UIWindow *window;
ClassWithProtocol *protocolTest;
}
@property (nonatomic, retain) UIWindow *window;
@end
实现 们 这 简单 输 语
- (void) processSuccessful:(BOOL)success
{
NSLog(@"Process completed");
}
这 实现 调 时 执 这 语 码请 书 带
实
@protocol 时 对 对 对 对 设 则 对 经 发 给 产 码
ClassWithProtocol *another;
TestAppDelegate *test;
another.delegate = test;
//do some work …
another.delegate = nil;
[test release];
节 码 请 书 带 实
练习 编 实现 义 拟简单 运
发 础
The heart of the discerning acquires knowledge; the ears of the wise seek it out.
聪明人的心得知识,智慧人的耳求知识。
——《旧约•箴言》
3.7 层
发 过设 层 backgroundColor 组 创 户 这 图 处 层 对 样 层显 层 换 层
显 调 视图 bringSubviewToFront() 层 调 视图 sendSubviewToBack() 图显
击 钮 则 动态显 图 实现 码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch.
UIView *mainview = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
mainview.backgroundColor = [UIColor clearColor];
imageViews = [[NSMutableArray alloc] initWithCapacity:5];
for(int i = 1; i< 6; i++){
NSString *name = [NSString stringWithFormat:@"apple-ipad-background-%d.jpg",i];
UIImage *image = [UIImage imageNamed:name];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = [[UIScreen mainScreen] bounds];
[imageViews addObject:imageView];
[mainview addSubview:imageView];
[imageView release];
}
[window addSubview: mainview];
[mainview release];
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Show Next Picture"
forState:UIControlStateNormal];
[button addTarget:self action:@selector(showNext:) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(160-75, 480-44, 150, 40);
button.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
[window addSubview: button];
[window makeKeyAndVisible];
return YES;
}
读 组 组 对 图 这样 显 时 户 过 见图 钮 应
- (void)showNext:(id)sender{
UIImageView *view = nil;
for(view in imageViews){
if([view isInFront]){
[view sentToBack];
break;
}
}
}
历 组 显 图 过
这样 图 显 过 扩 实现 义
级编
发
约
4.10 义用户
4.10.1 ComboBox UIPikerView设计
软 节结 实现 观 图 该 户 击 边 头时弹 户 动 时 户选择 项 动 户选择 选项 击蓝 钮 闭 绍 实现该
过 实现 头 时实现 协议
这样 应 发 义
@interface UIComboBox : UITextField<UITextFieldDelegate,
UIPickerViewDataSource,
UIPickerViewDelegate> {
}
载 载 头图 组
设 边 这样 实现 带 头
业应 实
约
5.2 统 绍
这 过 进 业 项 术 层 构 业务层 务 户 统 图
5.3 统
项
统
软 发 础
处
约 传 书
6.7 Google地图编程
这 图 发 实际 项 发 发 图 战 节 过 线测 为 图软 发 实 绍 发 编 识 让读 图项 应 这 识 实际项 发问题 线测 启动 显 图 户 过 击 图 钮 图 标 标 测 线顺 标 时 线 测 线 标 击 钮 线 对应 线 户 标 蓝 线 图
蓝 线 击 让 计 线 长 图显
过 实现 获 设 图 缩 图 动 图 过这 进
义
// MapWebView.h
#import <UIKit/UIKit.h>
业软 实
满
约 传 书
图 户 图 图 时 则 查 图 击 边 图则 应 视频 视频 图
户 击 图标时 统显 项 对应 产
戏 发 础
Wisdom is better than weapons of war.
智慧胜过打仗的兵器。
——《旧约•传道书》
统
统 戏 发 拟
雾 闪电 时 统 统 较 杂 课题 运动 转 渐隐 缩 绍 具体的 统实例。
轨 卫
这 绍 卫 飞 时 喷 图
拟 卫 飞 启动 拟卫 发 飞 卫 绕 飞 图 卫 绕 飞 带 拟 义 应 拟
们 实现 统 库 实现
过 义 设 统
// SatParticle.h
#import "PointParticleSystem.h"
#import "QuadParticleSystem.h"
@interface SatParticle : PointParticleSystem
{
}
@end
业 戏实
岂 发长 岂 发
约 约 记
9.1
过 习 读 经对 戏 发 绍 质 业 戏实 过对 业 戏实 习 让读 实 戏项 统 构 设计 视频 图 处 编 术 鉴 综 应 这 识 实际 戏项 发 戏 业 值 戏 码 读 这 戏 础 创 戏
9.2 闪回(Flash Back)
优 戏 戏 发 发 时 该 戏 风 纷纷 戏 戏 畅 动 连贯 动 赢 户 爱 试图 记忆 戏设 乌 戏 节 谋 戏 戏 岛 戏 实 敌
戏 经 戏 实现 该 运 实现 戏实现 戏 户 统设
统启动 创
对 启动 戏 环 对 则 码
义
// EmulationViewController.m
- (void)loadView {
systemStub = static_cast<iPhoneStub*> (SystemStub_create());
engine = new Game(systemStub, dataPath, documentsPath, ver);
inputController = [[InputControllerView alloc] initWithFrame:CGRectZero];
self.inputController.TheJoyStick = &systemStub->TheJoyStick;
[view addSubview:self.inputController];
}
过 节实 们 戏 拟 实现
码 层 发 户输 协议 戏 码 络 许 这样 拟 们 戏 码 发和测试 这 进 业 戏 发 发
节 码 请 书 带
术 释
戏 这 戏 戏 发库 库实现 义 戏 戏 轻 骑 欢 险 时 证 乡 长 废 这样 达铺满 时 视 骏马 马, 最 赖 转 们 风对 搡 锈 铰链 让 觉 见 风 风 扫 过 紧闭 阵 转 为 访这
过 恶 销 术 这 则 们 这 远 紧张 发 现 绝对 释 术 恶 谁 单
戏
戏 术 该 术 经 历 戏 发 简单 块图 绘 图 图 戏 图编辑
过 维 组 块图 组织 绘
该 绘 图
该 为
该 给 伤
图编辑 图编辑 为 戏 这 图
<map version="1.0" orientation="orthogonal" width="200"
height="200" tilewidth="40" tileheight="40">
该 为 顶层 图 宽 宽 设 设 设 过
<property name="PlayerStartx" value="10"/> <property
name="PlayerStarty" value="10"/>
</properties>
码 实现 树 图
实现地图界面,同时将一棵 树作为精灵(Sprite)移动到前面:
实 码 请 书 带
戏 发 义 劲 图编辑 图设计时间 创 驱动 戏 过 图 实现 戏 这样 戏
过 节实 们 库 样 发 业 戏 库 这 戏 实现 戏 额 对 库 说还
戏 码 请 书 带
9.4 (Sweet Dreams)
为 时 动
轻 闲 戏 戏 发库进 发 戏 创 户 过倾 动 击 进 跃 摇动 摆动绳 乐 让 难题 获 奖 戏
戏 构 统 为 则 为 戏 进 对 间 连
转连 连结 对应 刚 对 这样 对应 视图
戏 图
义
// BaseModelObject.h
#import "IModelObject.h"
@interface BaseModelObject : NSObject<IModelObject>
{
b2Body* physicalBody;
float z;
float width;
float height;
float linearDamping;
float angularDamping;
float density;
float friction;
float restitution;
bool hasMass;
bool isInWater;
bool fixedRotation;
}
-(id) initInWorld:(b2World*) mWorld withRect:(CGRect) mLocation;
@end
宽 还 戏 该 对 过这样 戏 进 检测
传
获 这 该 传 读 图 总 检测 值 间 设 对 为 对 对 调
UIAccelerometer *accelerometer;
self.accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer.updateInterval = .1;
self.accelerometer.delegate = self;
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
labelX.text = [NSString stringWithFormat:@"X:%f", acceleration.x]; labelY.text = [NSString stringWithFormat:@"Y:%f", acceleration.y]; labelZ.text = [NSString stringWithFormat:@"Z:%f", acceleration.z];
self.progressX.progress = ABS(acceleration.x);
self.progressY.progress = ABS(acceleration.y);
self.progressZ.progress = ABS(acceleration.z);
}
戏 过 变 历这 组 组 对 这样 产
// BaseGameLayer.mm
-(void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
for(id<IInputHandler> inputHandler in inputHandlers){
[inputHandler accelerometer:accelerometer
didAccelerate:acceleration];
}
}
戏 场 对 该 组
//Cow01Scene.mm
-(void) spawnChar{
[self unschedule:@selector(spawnChar)];
CharacterController* character = [[[CowController alloc] initCharacter:self :CGRectMake(0, -110, 15, 42)] autorelease];
[self addChild:character z:CHARACTER_ATLAS_Z];
[self addInputHandler:character];
[spawnExit closeExit];
}
处
// CharacterController.mm
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
}
这 过 计 倾 过 阈值进 较获 户 动 计 应该 还 动 应该 变 这 动阈值 义为 值
#define MOVEMENT_ACCELERATION_THRESHOLD 0.125f
过 节实 们 进 对 结 库进 实 业 戏 发 库 戏 发 库 编 码 实现 戏 扩
节 码 请 书 带
9.5 毁灭之战(RavagedByWar)
戏 胁 敌 进 敌 飞 戏 级 图 选择 戏 现 风 这 瘾 戏 为敌 设 线 须 构 线 设计 围歼敌 让敌 认为 线其实是 车 车 时间
戏主界面
战 场面
9.6.1
经 计 戏 图 问题 该 为 过 设 张 节 记录 访问过 节 启发 评 许 显为 进 进 术 满
节
预测 节 标节 为 评
节 评
节
环执 骤
查 节 为 节 过评 计
节 进 时 删
伪
毁灭 战 计 线
实现
// AStar.m
+ (NSArray *)shortestPathFromA:(CGPoint)a ToB:(CGPoint)b OnGrid: (Grid *)grid WithCreepAttribute:(NSInteger)creepAttribute { AStarNode *startNode = [AStarNode
AStarNodeWithPositionOnGrid:a AndGoal:b];
NSMutableArray *closed = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *open = [[[NSMutableArray alloc] init] autorelease];
...
return nil;
}
调 这样 实现 戏
// Creep.m
- (NSArray *)updatePath {
GridCell *gc = [[GameState sharedGameState].map.mapGrid gridCellForPositionOnGrid:self.gridPosition];
if (![gc isAccessibleWithCreepAttribute:self.attributes]) { self.gridPosition = stGridPosition;
}
[self.path removeAllObjects];
self.path = [AStar shortestPathFromA:self.gridPosition
ToB:self.exit OnGrid:[GameState sharedGameState].map.mapGrid WithCreepAttribute:self.attributes];
self.currentPathIndex = 0;
[self performSelector:@selector(moveToNextPoint)
withObject:nil afterDelay:.1];
[self stopAllActions];
return self.path;
}
过 节实 们 戏 实现 实现 计 戏 结 态 实现 戏 应 戏 计 许 戏 层 实现 戏 选择 业 戏 娱乐 时 竞
节 码 请 书 带
鱼
鱼 竞 戏 戏让 历蓝色的 戏 进 躲 鲨鱼 戏 鱼为 须 还 鲨鱼 戏 顶 显 标 达 险 运动 红
戏
戏 为 统 为 设 调
//GameScene.mm
-(id) init{
cpInitChipmunk();
cpBody *staticBody = cpBodyNew(INFINITY, INFINITY);
space = cpSpaceNew();
cpSpaceResizeStaticHash(space, 100.0f, 10);
cpSpaceResizeActiveHash(space, 50, 300);
space->gravity = ccp(0, 0);
space->damping =0.02;
space->iterations =2;
space->elasticIterations = 0;
...
}
过 节实 们 实现 戏 运动 检测 为 调 戏 为 戏 戏 库 为 戏 统 库 统 码 块 组织 码 戏 扩 维护 结 库 实现 业 戏 发 戏 发 创 时间实现 戏产 时间 销 为 创 润
节 码 请 书 带
9.7 总结
过 业 戏实 绍不同类型的 业 戏的核心技术, 戏 业 戏的 读者通过这些实 业 戏的内部构造, 统 构 键 术 过对 戏 码 戏 设计,移植 编 识 这 识应 业 戏项 发。