官方SPRITE KIT游戏ADVENTURE流程

本文详细介绍使用SpriteKit进行游戏开发的具体步骤,包括资源预加载、地图加载与分块、图层管理、角色初始化等关键环节。

此文为学习笔记,单纯记录下有助以后速查~

SPRITE KIT新人,有错误的地方希望留言指教~


1, 在创建场景之前,在viewController里先加载所有资源文件,包括frames, emitters等等,并且开启进度条以提示等待。 由于目前Sprite Kit 存在问题,这些处理要放在viewWillAppear里来处理,否则场景大小会出问题。同时要在此处判断用户设备是IPHONE或者是IPAD,并对尺寸做出相应处理。

2,给场景一个尺寸,并且创建场景。

3,判断是否有外接操控设备(IOS新加入外接控制器),连接或者断开控制器时做相应的notification提示,

4, 当加载资源完成后,通过handler来通知主线程,停止掉进度条的显示,并且屏幕显示出两个按钮,战士,弓箭手。这两个按钮是本来就在那里,不过是HIDDEN属性,handler触发后,通过动画的来让alpha值2秒内渐变到1.0f,来实现动态显示的过程。

5, 在加载资源过程中,需要加载emiiter特效与frame到atlas集合里,方便以后的调用。

6, 加载世界地图。游戏中将整个世界划分为32*32个小地图,并存储到Tiles.atlas中,这样做的好处是不需要全部将地图加载到内存中,只需要按场景需要加载要显示的部分就可以。所以共有1024个小地图场景碎片。

7,官方文档说,在编译的过程中,XCODE会自动将这些地图碎片整合成5张小图,这样最小化的加载资源。

8,在加载地图的method里边,给每个小图一个SKSpriteNode实例,并且设定好位置,确保加载后能正确显示位置。在加载这些的之后,开始场景内其他环境资源,人物资源加载的同时。给地图碎片一个NSMutableArray,大小是1024。加载过程如下:

    sBackgroundTiles = [[NSMutableArray alloc] initWithCapacity:1024];
    for (int y = 0; y < kWorldTileDivisor; y++) {
        for (int x = 0; x < kWorldTileDivisor; x++) {
            int tileNumber = (y * kWorldTileDivisor) + x;
            SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[tileAtlas textureNamed:[NSString stringWithFormat:@"tile%d.png", tileNumber]]];
            CGPoint position = CGPointMake((x * kWorldTileSize) - kWorldCenter,
                                           (kWorldSize - (y * kWorldTileSize)) - kWorldCenter);
            tileNode.position = position;
            tileNode.zPosition = -1.0f;
            tileNode.blendMode = SKBlendModeReplace;
            [(NSMutableArray *)sBackgroundTiles addObject:tileNode];
        }
    }

9,资源加载部分: 为了节省资源,场景内共享的资源都一次加载到内存中,保存尽量长的时间,通过用dispatch_once block来确保只加载一次,每个人物class都继承了loadSharedAssets这个method,拿BOSS类来说,会加载BOSS相关的动画,包括闲置时的动画,移动动画,攻击动画,被攻击动画,死亡时的动画等等,同时也会加载粒子效果,比如当英雄的武器攻击到BOSS时产生的伤害效果。

10,游戏里有一个叫做APAGraphicsUtilities的类,专门来做图方面的处理。其中APALoadFramesFromAtlas()方法就是从本地加载纹理贴图,提取图片名字并且序列化,返回一个SKTexture的array,简化了加载资源的过程。代码如下:

#pragma mark - Loading from a Texture Atlas
NSArray *APALoadFramesFromAtlas(NSString *atlasName, NSString *baseFileName, int numberOfFrames) {
    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:numberOfFrames];
    
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:atlasName];
    for (int i = 1; i <= numberOfFrames; i++) {
        NSString *fileName = [NSString stringWithFormat:@"%@%04d.png", baseFileName, i];
        SKTexture *texture = [atlas textureNamed:fileName];
        [frames addObject:texture];
    }
    
    return frames;
}


11,大部分全局资源都保存在static变量中,方便访问,代码如下:

static SKEmitterNode *sSharedDamageEmitter = nil;
- (SKEmitterNode *)damageEmitter {
    return sSharedDamageEmitter;
}

12,在加载完所有资源后,搭建场景及场景环境NSMutableArray来存储玩家以备日后多人游戏,并且设置一个defaultPlayer。在array里先添加上NSNull,以备随时有玩家加入游戏。本游戏中最大支持4人同时游戏,所以是一个default player和3个NSNull的实例。

13,对世界场景分层次。同样是保存在typedef enum: uint8_t 的enumeration中,

/* The layers in a scene. */
typedef enum : uint8_t {
	APAWorldLayerGround = 0,
	APAWorldLayerBelowCharacter,
	APAWorldLayerCharacter,
	APAWorldLayerAboveCharacter,
	APAWorldLayerTop,
	kWorldLayerCount
} APAWorldLayer;
之后无论何时,在添加进新的元素的时候,都采用方法 addNode:atWorldLayer: 方法,来给元素一个层级。


14,因为所有图层都是在world层之下,所以创建world节点后,分别创建不同的节点图层,并添加到world中,分别给zPosition值来确定层级关系。

15,创建HUD,屏幕上方显示的人物头像,血条等等图层。这个要跟world图层分开,这些是会始终显示在屏幕上方,不随world变化而产生位置变化。

16,创建游戏场景图层,创建各种array来分别保存场景中的元素,英雄,敌人,洞穴,树等等,并且创建树分布图与levelmap(后边会用到)。并且把camera设置到以英雄为中心的位置。

#pragma mark - Mapping
- (void)centerWorldOnPosition:(CGPoint)position {
    [self.world setPosition:CGPointMake(-(position.x) + CGRectGetMidX(self.frame),
                                        -(position.y) + CGRectGetMidY(self.frame))];
    
    self.worldMovedForUpdate = YES;
}

17, 在buildWorld方法中,设置模拟物理效果,添加physicsbody, 然后添加sprite,并且设置初始化位置。本游戏为俯视2D游戏,不需要重力设置,取消重力。设置self.physicsWorld.contactDelegate = self;,当碰撞产生时来接受callback。(后边会详细提到)。之后将预先加载的地图添加到场景中。

18,为了更容易确定不同角色的初始位置,我们创建了一个level map(16中提到的),level map通过像素点来指出各个角色所在的位置。有点透明的像素点是表示BOSS所在位置,红色表示的是墙,绿色是哥布林的洞穴,蓝色表示英雄初始的位置。


                 


19, 这张图早先也在预加载资源的过程中被加载到内存中,这样可以通过调用APACreateDataMap()来读取到这张图,APACreateARGBBitmapContext(),通过这个方法来创建8bit的bit map.

19, (未完!!)








内容概要:本文详细介绍了“电动汽车聚合可行域的内-外结合近似方法”的Matlab代码实现,旨在通过数值仿真手段对大规模电动汽车集群作为灵活资源参与电网调度的能力边界进行建模与逼近。该方法融合内部凸包构造与外部约束逼近策略,精确刻画电动汽车在充电状态、功率调节、时间维度等方面的聚合可调能力范围,形成紧致的可行域表示,为高比例电动车接入下的电力系统优化调度、需求响应、车网互动(V2G)等关键应用提供可靠的建模基础。文中强调科研应兼顾严谨逻辑与创新思维,并倡导借助YALMIP等成熟优化工具提升研究效率。完整的代码、工具包及相关案例可通过指定网盘链接和微信公众号“荔枝科研社”获取。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的科研人员,尤其适用于从事新能源并网、电动汽车调度、智能电网、综合能源系统等方向的研究生与工程技术人员。; 使用场景及目标:①研究大规模电动汽车集群的聚合建模与灵活性量化方法;②实现电动汽车聚合可行域的内-外近似算法;③支撑含高渗透率电动汽车的电力系统日前-实时协同优化调度;④学习并应用YALMIP工具进行数学规划建模与求解;⑤为需求响应、市场机制设计及V2G运营提供技术支撑。; 阅读建议:建议读者按照文档指引循序渐进学习,结合网盘提供的完整资源(包括YALMIP工具包与示例代码)进行实践调试,重点掌握内-外近似方法的数学建模逻辑、约束处理技巧及优化求解流程,并参考团队发布的其他相关案例,深化对优化算法与仿真技术在能源系统中应用的理解。
下载代码方式:https://pan.quark.cn/s/93e47adaae45 医学研究人员近期识别了若干新型病毒,经由对这些病毒的解析,揭示出它们的遗传物质序列均呈现环状形态。当前,研究人员已汇集了丰沛的病毒遗传物质与人类遗传物质样本数据,期望能迅速辨识个体是否感染了相关病毒。为便于探究,研究人员将人类遗传物质与病毒遗传物质均表述为由若干字母构成的字符串序列。继而,检测某种病毒遗传物质序列是否在患者遗传物质序列中有所显现,倘若出现,则表明该个体感染了对应病毒,反之则未感染。《病毒感染检测实验报告》是在医学研究背景下,依托软件技术基础中的编程知识完成的一个课程设计任务,其目的在于评估人体是否感染特定病毒。在此实验中,病毒遗传物质与人类遗传物质被表现为字母序列,通过比对病毒遗传物质序列是否存在于人的遗传物质序列中,从而判定感染状态。在程序构建方面,该实验所涉及的核心知识要点包括: 1. **字符串操作**:程序需处理病毒遗传物质与人类遗传物质的序列,这些序列以字符串形式呈现。字符串操作涵盖输入、输出、比较及匹配等操作,是C/C++编程的基础。 2. **线性表**:遗传物质序列可视为线性数据结构,可通过数组来表示。程序运用全局变量数组`V`和`D`存储病毒与人的遗传物质序列。 3. **栈**:在循环展开病毒遗传物质时,可能需借助栈数据结构来保存某个阶段遗传物质序列的状态,以便进行所有可能的匹配尝试。 4. **BF算法**(Brute Force,暴力搜索算法):BF算法是一种基础性的字符串匹配方法,用于在文本中搜寻模式。在此,BF算法用于在人的遗传物质序列中探寻病毒遗传物质序列的所有展开形态。 5. **文件处理**:程序需从文件《病毒感染检测输入数据...
内容概要:本文系统研究了基于粒子群PSO、灰狼GWO、鲸鱼WOA、哈里斯鹰HHO、蜣螂DBO、麻雀SSA六种智能优化算法的无人机三维路径规划方法,并通过Matlab代码实现了在复杂三维环境下的路径搜索与优化对比。研究构建了包含障碍物、威胁区域等实际地形特征的空间模型,综合考虑路径长度、飞行时间、能耗及安全性等多维度成本函数,对各算法的寻优能力、收敛速度、稳定性和全局搜索性能进行了量化评估与深入分析。通过大量仿真实验,全面比较了不同算法在多样化环境条件下的路径规划表现差异,揭示了各类算法的优势与局限性,为无人机在实际任务中的自主导航与决策提供了可靠的算法选型依据和技术支撑。; 适合人群:具备一定Matlab编程基础,从事无人机路径规划、智能优化算法研究或相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握主流群智能优化算法在三维路径规划中的建模与实现方法;② 对比分析不同算法在复杂环境下的性能优劣,服务于算法选型与改进;③ 为无人机自主导航、无人系统协同控制等应用场景提供算法验证平台。; 阅读建议:此资源以Matlab代码为核心,建议读者结合代码与算法原理进行同步学习,通过调整环境参数与成本函数权重开展仿真实验,深入理解算法行为特征,并可根据自身研究需求进行二次开发与拓展。
本项目是一套基于知识图谱与 LLM 大模型的电影智能问答与推荐系统完整 Python 源码,为计算机相关专业高分毕业设计项目(评审得分 98 分),经导师全程指导与专业审定,全量源码均通过本地编译与多场景调试,确保可稳定运行,兼具学习参考与二次开发价值。 项目以电影领域知识为核心,通过构建结构化电影知识图谱,结合大语言模型(LLM)作为智能 AI 助手,实现了自然语言驱动的电影知识问答与个性化推荐能力,解决了传统系统语义理解能力弱、交互形式单一的痛点。 核心技术栈:基于 Python 开发,采用 Neo4j 图数据库存储与管理电影知识图谱,融合 LLM 大模型实现自然语言意图解析、答案生成与推荐理由输出,配套完整的前后端交互界面。 核心功能: 智能问答功能:支持用户以自然语言提问电影详情、演员作品、导演履历、影片类型、上映信息等各类问题,LLM 负责精准识别用户意图,调用知识图谱数据推理并生成通顺自然的回答; 个性化推荐:基于知识图谱的实体关联关系,结合用户偏好输出电影推荐结果,同时由 LLM 生成贴合用户需求的个性化推荐理由; 知识图谱可视化:支持电影、演员、导演等实体及其关联关系的图形化展示,直观呈现知识网络结构; 多轮对话交互:依托 LLM 的对话能力,支持上下文关联的多轮追问,交互体验更贴近真人对话。 项目代码结构清晰、注释完整,覆盖数据预处理、知识图谱构建、LLM 接口封装、后端服务、前端页面全流程,难度适中,非常适合计算机、软件工程、人工智能等专业学生用于毕业设计、课程设计、期末大作业,也可作为 Python 项目实战、知识图谱与 LLM 落地应用学习的练手项目,可直接基于现有框架进行功能扩展与场景创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值