利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转)

【雕爷学编程】Arduino智能家居之使用条件语句触发发送邮件 在使用过程中,需要注意触发条件的定义、邮件服务的配置和安全性考虑等方面的问题,以确保系统的可靠性和信息的安全性。你可以根据自己的需求和传感器选择相应的案例,并根据注释中的指导替换必要的参数和邮箱地址,以实现你的具体应用需求。1、温度和湿度控制:通过连接温度传感器和湿度传感器,Arduino可以实时监测室内环境的温度和湿度,并通过控制空调、加热器或加湿器等执行器,实现室内温湿度的自动调节。设计用户友好的界面和操作方式,提供简单直观的控制和反馈机制,以及考虑用户习惯和需求,能够提升系统的整体用户体验。 阅读详情
        你是否想过为自己的游戏中加入“发送自定义游戏关卡“的功能呢?

如果你有自己的服务器的话当然可以实现,或是使用openfeint的挑战功能以及Gamecenter(这个木有试过)来实现。

但是这些方法总是有些麻烦…要么得有台服务器,要么得使用penfeint/gamecenter(有的用户可能并没有用这些功能)。

其实,使用URLSchemes可以很简单的实现”游戏关卡发送“的功能^_^

本问包括了以下的内容:

1.准备需要的Scene和类
2.JSON文件的读写
3.在游戏内发送邮件
4.使用URLSchemes发送和接收数据
5.总结

1.准备需要的Scene和类

为了保证项目简单易懂,我们首先准备了以下几个Scene:

a.MainMenu Scene: 主菜单,包含了一些跳转的菜单项

b.MyEditor Scene: 随机生成”游戏关卡“并同时保存至本地,也可以通过邮件发送给朋友

c.MySentLevel Scene: 显示所有”发送的关卡“,可以选择关卡进行加载显示内容

d.MyReceivedLevel Scene: 显示所有”通过邮件接收的关卡“,可以选择关卡进行加载显示内容

除了这些Scene以外我们还需要一个使用单件模式的”GameDataManage“类来保存一些数据和提供一些方法,这样我们就可以在项目的所有地方对其进行访问。

最后需要的,是一个与JSON中保存数据结构一一对应的”GameLevelData”类。

OK,准备工作完成,接下来就开始JSON的读写部分^_^

2.JSON文件的读写

写游戏的一个好习惯自然是把一些数据和代码分离出来,用配置文件来进行保存。你可以使用plist或是xml,不过本项目选择使用JSON。

当你的游戏数据结构比较简单的时候,JSON会是一个不错的选择,通过cocos2d自带的”TouchJson”三方库,可以帮助你很轻松的读写JSON文件。

本项目所使用的JSON文件结构:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

{
    "PlayerName": "SuperSuRaccoon",
    "SpriteArray":
    [
        {
            "SpriteName": "Sprite1",
            "SpritePng": "raccoon.png",
            "SpriteScale": 1.2,
            "SpritePosition":
            [
                {
                    "XPos": 120,
                    "YPos": 150,
                }
            ]
        },
        {
            "SpriteName": "Sprite2",
            "SpritePng": "rabbit.png",
            "SpriteScale": 0.6,
            "SpritePosition":
            [
                {
                    "XPos": 300,
                    "YPos": 100,
                }
            ]
        }
    ]
}

结构比较简单,主要是一个用户名,以及保存了CCSprite各种属性的大小可变的”SpriteArray”。

2.1 读取JSON文件

读取JSON格式的文件非常简单:



1
2
3
4

NSString *testJsonFilePath = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"json"];
NSData *testJsonFileData = [[NSFileManager defaultManager] contentsAtPath:testJsonFilePath];
CJSONDeserializer *jsonDeserializer = [CJSONDeserializer deserializer];
NSDictionary *testConfigDict = [jsonDeserializer deserializeAsDictionary:fileData error:nil];

首先把文件内容读入NSData,再使用CJSONDeserializer来将NSData转换为NSDictionary。

2.2 解析NSDictionary

NSDictionary中包含了我们所有的游戏数据信息,我们需要将其解析为我们的”GameLevelData”类对:

”GameLevelData“类:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

@interface SpriteData : CCNode {
   
    NSString *spriteName;
    NSString *spritePng;
    CGPoint spritePosition;
    float spriteScale;
}
@property(nonatomic, retain) NSString *spriteName;
@property(nonatomic, retain) NSString *spritePng;
@property(nonatomic) CGPoint spritePosition;
@property(nonatomic) float spriteScale;
@end
@interface GameLevelData : CCNode {
    NSString *playerName;
    NSMutableArray *spriteArray;
}
@property(nonatomic, retain) NSString *playerName;
@property(nonatomic, retain) NSMutableArray *spriteArray;
@end

如何读取”playername“属性内容:



1
2

GameLevelData *glData = [[GameLevelData alloc] init];
glData.playerName = [testConfigDict objectForKey:@"PlayerName"];

很简单吧^_^

读取spriteArray的话就相对比较麻烦了:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

NSArray *spriteArray = [testConfigDict valueForKey:@"SpriteArray"];
for (NSDictionary *spriteInfo in spriteArray) {
    SpriteData *spData = [[SpriteData alloc] init];
    spData.spriteName = [spriteInfo objectForKey:@"SpriteName"];
    spData.spritePng = [spriteInfo objectForKey:@"SpritePng"];
    spData.spriteScale = [[spriteInfo objectForKey:@"SpriteScale"] floatValue];
               
    NSArray *spritePosArray = [spriteInfo valueForKey:@"SpritePosition"];
    for (NSDictionary *spritePosInfo in spritePosArray) {
       
        spData.spritePosition = ccp([[spritePosInfo objectForKey:@"XPos"] floatValue],
                                    [[spritePosInfo objectForKey:@"YPos"] floatValue]);
    }
   
    [glData.spriteArray addObject:spData];
}

搞定。

顺便把解析后的数据打印出来检查一下:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

-(void) printGameLeveDataInfo:(GameLevelData *)glData
{
    /*Debug Log*/
    CCLOG(@"/**************Game level data**************/");
    CCLOG(@"PlayerName: %@", glData.playerName);
   
    for (SpriteData *spData in glData.spriteArray) {
       
        CCLOG(@"SpriteName: %@", spData.spriteName);
        CCLOG(@"SpritePng: %@", spData.spritePng);
        CCLOG(@"SpritePng: %0.1f", spData.spriteScale);
        CCLOG(@"SpritePosition: %0.1f - %0.1f", spData.spritePosition.x, spData.spritePosition.y);
    }
    CCLOG(@"/*******************************************/");
    /*Debug Log*/  
}

控制台输出结果:



1
2
3
4
5
6
7
8
9
10
11

URLSchemesDemo[1012:207] /**************Game level data**************/
URLSchemesDemo[1012:207] PlayerName: SuperSuRaccoon
URLSchemesDemo[1012:207] SpriteName: Sprite1
URLSchemesDemo[1012:207] SpritePng: raccoon.png
URLSchemesDemo[1012:207] SpritePng: 1.2
URLSchemesDemo[1012:207] SpritePosition: 120.0 - 150.0
URLSchemesDemo[1012:207] SpriteName: Sprite2
URLSchemesDemo[1012:207] SpritePng: rabbit.png
URLSchemesDemo[1012:207] SpritePng: 0.6
URLSchemesDemo[1012:207] SpritePosition: 300.0 - 100.0
URLSchemesDemo[1012:207] /***********************************************/

好了, 现在我们已经成功的读取并解析了JSON文件。接下来就是保存JSON文件了。

2.3 JSON文件的保存

其实将NSData保存为JSON文件并不需要使用到TouchJson,只需要:



1

[jsonData writeToFile:filePath options:NSDataWritingAtomic error:nil];

就可以了。

但是我们需要使用TouchJson来将NSDictinnary转换为NSData:



1

jsonData = [[CJSONSerializer serializer] serializeObject:gameLevelDic error:nil];

NSDictionary中包含的数据必须与JSON的数据结构一一对应,其实就是我们读取解析JSON的一个逆操作:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

//save all the level info into a Big Dic
NSMutableDictionary *gameLevelDic = [[NSMutableDictionary alloc] init];
[gameLevelDic setValue:@"sxc" forKey:@"PlayerName"];
NSMutableArray *spriteArray = [[NSMutableArray alloc] init];
   
//random num of sprites to generate
numOfSprites = 1 + CCRANDOM_0_1() * 10;
   
for (int i = 0; i < numOfSprites; i++) {
       
    //pick raccoon or rabbit
    NSString *spriteFile = @"";
    if (CCRANDOM_0_1() > 0.5f) {
       
        spriteFile = @"raccoon.png";
    }
    else {
       
        spriteFile = @"rabbit.png";
    }
    CCSprite *sprite = [CCSprite spriteWithFile:spriteFile];
    sprite.scale = 0.1 + CCRANDOM_0_1() * 1;
    sprite.position = ccp(20 + CCRANDOM_0_1() * 400, 20 + CCRANDOM_0_1() * 300);
    sprite.tag = i;
   
    [self addChild:sprite];
   
    //Position info
    NSMutableDictionary *positionDic = [[NSMutableDictionary alloc] init];
    [positionDic setValue:[NSNumber numberWithFloat:sprite.position.x] forKey:@"XPos"];
    [positionDic setValue:[NSNumber numberWithFloat:sprite.position.y] forKey:@"YPos"];
   
    //Sprite info
    NSMutableDictionary *spriteDic = [[NSMutableDictionary alloc] init];
    [spriteDic setValue:spriteFile forKey:@"SpriteName"];
    [spriteDic setValue:spriteFile forKey:@"SpritePng"];
    [spriteDic setValue:[NSNumber numberWithFloat:sprite.scale] forKey:@"SpriteScale"];
   
    NSMutableArray *posArray = [[NSMutableArray alloc] init];
    [posArray addObject:positionDic];
    [spriteDic setValue:posArray forKey:@"SpritePosition"];
   
    [spriteArray addObject:spriteDic];
}
[gameLevelDic setValue:spriteArray forKey:@"SpriteArray"];

这样我们就可以把NSDictioany转换为NSData并写入JSON文件了。

PS: 这里保存好的JSON文件在格式上有一点小问题,文件中没有换行符和缩进,所以看起来比较麻烦,当然你可以自己写一段程序来解决这个问题。

接下来,我们就要在游戏中,通过邮件来发送我们的”游戏关卡“内容了^_^

我会在第二部分完成后把整个项目的源代码下载地址发布出来^_^

项目截图:

利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
  
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
   
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
 
   
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
 
   
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
   
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
   
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
   
利用URLSchemes功能通过邮件发送“游戏关卡”的解决方案(转) - ♂苹果 - 眼睛想旅行
 

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆

If you feel all the stuffs in this site helped you a lot and you would buy me a beer :)

转自:http://www.supersuraccoon-cocos2d.com/zh/2011/09/25/part-1-a-solution-to-using-urlschemes-to-send-game-level-through-e-mail/


我有一个QQ群,学开发的,可以一起学习:195949812
ESP8266-Arduino网络编程实例-发送邮件(基于SMTP) 本文将演示如何使用ESP8266发送邮件。实例中将使用SMTP(Simple Mail Transfer Protocol)协议通QQ邮箱向指定邮箱发送邮件。 阅读详情

相关推荐

c++编写收发邮件介绍

本文主要讲述如何使用Visual C++用MAPI编写E-mail程序。MAPI是包含在Windows之中的,因此不需要安装其他额外的部件。MAPI有以下三种形式: SMAPI,Simple MAPI,简单的MAPI CMC,Common Messaging Calls,一般通讯调用 完整的MAPI ---- SMAPI和CMC都包含在完整的MAPI中,当用户想执行一些高级操作,比如编写自己的E-mail服务器的时候,必须使用完整的MAPI。本文主要阐述如何编写能够收发电子邮件的程序,因此使用SMAPI就足够了。

17、邮件发送原理及实现

1.原理图解 ![image.png](https://img-blog.csdnimg.cn/img_convert/e0e760a0d26d86fe75ec3c404da6c41f.png#clientId=uc6575cd4-f367-4&from=paste&height=416&id=u17663af5&margin=[object Object]&name=image.png&originHeight=592&originWidth=11.

qq_51143149的博客 594

EMailSender:具有Arduino IDE的Arduino,esp32,Es8266 EMailSender,简单的库,可通过带有附件的smtp发送电子邮件

EMailSender:具有Arduino IDE的Arduino,esp32,Es8266 EMailSender,简单的库,可通过带有附件的smtp发送电子邮件

ESP8266使用邮件客户端 Arduino 库发送邮件(兼容ESP32)

使用 ESP8266 发送邮件可以方便地处理各种事情。 可以让 ESP8266 直接访问您的邮件服务器(例如 Gmail、Hotmail、Outlook)并通过它发送邮件,但许多邮件服务器会拒绝从不同于邮件服务器的域(您的 ip)发送的邮件。 因此,在这些情况下,使用 smtp2go.com 等第三方服务会更安全。只要您保持在一定的电子邮件限制以下,就可以获得一个免费帐户。 使用 SMTP2go 注册 smtp2go 后,您需要为您的 smtp 登录选择用户 ID 和密码。因此您有两组 ID 和密码:一组用

跨学科知识视角展现 2203

ue4 分发消息(网络联机 )

上一版本的丰富化,添加消息分发机制

XXSG-CoCos-Creator-Project:小小三国cocos项目源码(开发中)

XXSG-CoCos-Creator-Project 小小三国cocos项目源码(开发中)creater版本:v2.1.2

Arduino+ESP8266发送邮件,在原基础上小改,可直接在项目中引用!

这几天想做一个报警项目,通过esp8266简单wifi协议进行邮件发送,首先还是来看看官方示例有没有合适的。有些童鞋没有的话,可以去下载官方库 ESP Mail Client等。 示例源码如下 /** * This example will send the Email in * the html version. * * * Created by K. Suwatchai (Mobizt) * * Email: suwatchai@outlook.com * * G

jsjjchm281900的专栏 7608

使用ESP8266和Arduino发送电子邮件-项目开发

通知问题的一种简单方法是使用电子邮件,它非常有用且易于共享,因此我创建了一个库来进行处理。

短信或者邮件链接打开 APP(URL Scheme)

最近项目用到了点击分享的短信或者是邮件中的URL直接跳转到APP中,如果APP未安装,直接跳转到AppStore下载页面。下面进入正题 实现方式就是通过设置APP的URL Scheme,那么如何设置呢?come on 1、首先点开需要被打开的APP中的info.plist文件,添加URL Types;如下图 2、这时候我们展开URL Types(URL Types是个数组) 就可以看

gsn1125227的博客 6114

使用Arduino和ESP8266发送SMTP电子邮件-项目开发

显示基本项目以发送不带Wifi库的电子邮件的示例

工业互联网工控安全与工业质检AI大模型建设方案.pptx

工业互联网工控安全与工业质检AI大模型建设方案.pptx

URL scheme是什么?能拿来做什么?

一、什么是url scheme? URL scheme是系统提供的一种机制,它可以由应用程序注册,然后其他程序通过url scheme来调用该应用程序。 它分为两部分:一部分是系统默认的url scheme,另外一部分是应用程序自己注册的url scheme。 例如:mailto:这种就属于系统默认的一种机制。访问一个mailto的url链接,可以直接调用本机的邮件客户端,如: 目前它...

lengye7的博客 2万+

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

unity3d实现发送带附件的邮件

using UnityEngine; using System.Collections; using System; using System.Net; using System.Net.Mail; using System.Net.Security; using System.Security.Cryptography.X509Certificates; public class TryDe...

810364804 480

基于Ansys Fluent 的颗粒分离/过滤解决方案

过滤是指通过特殊装置将颗粒移除,将流体提纯净化的过程。过滤的方式很多,应用的物系也很广泛,固-液、固-气、大颗粒-小颗粒等。

sh_djoin的博客 1852

FoundationPose 4090部署 真实场景迁移

复现并应用foundationpose

m0_52835296的博客 613

什么是 URL Schema

什么是 URL Schema? 详情描述 Android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。 详细链接点此进入

FE-阿阳的博客 2万+

第三方系统(异构系统)基于token身份认证方式访问Ecology9的Restful接口Ecology9服务器配置部分

通过Token的认证方式调用Ecology9系统Restful业务接口服务器配置部分

svsou的专栏 2173

阿里云上linux操作系统购买

FR:海涛高软(hunk Xu) QQ技术交流群:386476712

海涛高软 784

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

Yolov5自学笔记之一--从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

零基础自学yolov5,学会简单使用和训练自己的数据集,在自己工作中使用

qq_41597915的博客 1万+

开源Cocos全家桶,2D光线追踪!

超级浣熊Cocos引擎10年老用户,精通Cocos全家桶Cocos-iPhoneCocos2d-x Cocos2d-html5Cocos2d-jsCocos Creator2011年开始...

奎特尔星球 852

智能家居系统设计:基于MATLAB的智能家居系统设计和仿真,包括智能家居控制、家庭能源管理和家庭安全监控

基于 MATLAB 的智能家居系统设计方法可以有效地解决各类智能家居问题。

走向CTO的路上... 1775

Unity发送邮件功能

使用Unity发送邮件案例案例效果图 代码CS控制台说明:单纯的发送邮件class Program { static void Main(string[] args) { SmtpClient mailClient = new SmtpClient("smtp.qq.com"); mailClient.

学无止境的专栏 1万+

4.4 线上vs离线:使用 Langfuse 实现智能体的全方位无死角评估

本文介绍了如何利用Langfuse工具实现AI智能体的全方位评估,包括线上和离线两种评估方式。线上评估通过收集用户实时反馈(如点赞/点踩)来监控真实表现,而离线评估则通过创建标准化数据集进行批量测试和自动评分。文章详细演示了如何为"旅小智"AI应用添加反馈功能、创建评估数据集,并利用Langfuse SDK进行自动化评估和分析。通过这两种评估方式的结合,开发者可以建立数据驱动的AI质量保障体系,实现持续优化和版本迭代。

yonggeit的博客 3310

HX711重量传感器原理图设计,已量产(压力传感器)

最近调通了一款针对家用、物联网场景的重量传感套件,核心用了 HX711 这颗经典的称重 AD 芯片,还加了用户最需要的 “一键校准” 功能 —— 之前帮朋友做家用米桶余量报警时,用户总吐槽校准步骤太繁琐,这次的方案把操作简化到只按一个键,试下来体验好了不少。正好拆解下这套硬件的设计逻辑,供做同类产品的朋友参考。

不脱发的程序猿 365
上一篇: cocos2d多点触摸(转)
下一篇: Linux下Socket编程(转)
woodcol
博客等级 码龄19年 288粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值