[ˈkəukəus tu: D](扣扣斯兔地)最后的d 为字母D的发音2D 指的是 二维(two dimension)cocos2d是一个开源框架,用于构建2D游戏、演示程序和其他图形界面交互应用等。
Cocos2d是开发2D游戏的一款强大的游戏引擎,它提供了丰富的功能和灵活的工具,使开发者能够轻松地创造出令人惊叹的游戏作品。然而,对于新手开发者来说,Cocos2d的文档可能会让人感到有些困惑。在本篇博客中,我们将深入研究Cocos2d文档,帮助您更好地理解和使用这个强大的引擎。
Cocos2d的文档是以官方网站为主要平台进行发布和更新。您可以通过访问官方网站来获取最新的文档版本。文档主要包含以下几个部分:
了解文档的结构对于快速找到需要的信息非常重要。同时,Cocos2d文档还提供了搜索功能,您可以通过关键字搜索来查找特定的内容。
入门指南是Cocos2d文档的第一部分,它为新手开发者提供了一个系统的学习路径。在入门指南中,您将学习到以下内容:
通过入门指南,您将建立起对Cocos2d的基本理解,为后续的开发工作打下坚实的基础。
API参考是Cocos2d文档的核心部分,它提供了关于Cocos2d引擎各个模块和类的详细说明。在API参考中,您可以找到以下内容:
API参考是Cocos2d文档中最重要的部分之一,它提供了丰富的信息和实例,帮助您深入理解和熟练使用Cocos2d的各个功能。
教程和示例是Cocos2d文档中另一个非常有价值的部分。通过教程和示例,您可以学习到如何实现特定的功能或者解决常见的问题。Cocos2d文档中的教程和示例包括但不限于以下内容:
通过教程和示例,您可以通过实际的代码和案例加深对Cocos2d的理解,提高自己的开发能力。
Cocos2d拥有一个强大的社区支持,您可以通过访问官方网站的社区支持页面来获取更多的资源和帮助。社区支持包括以下内容:
通过社区支持,您可以扩展自己的知识和技能,解决开发过程中遇到的问题,还可以结识到来自世界各地的其他Cocos2d开发者。
Cocos2d文档是学习和使用Cocos2d引擎的重要工具。通过深入理解Cocos2d文档的结构和内容,您将更好地掌握这个强大的游戏引擎,实现您的创意和梦想。当您遇到问题或者需要更多帮助时,不要忘记利用Cocos2d社区支持的资源,与其他开发者一起成长和进步。祝愿您在Cocos2d的开发之路上取得巨大的成功!
欢迎来到本篇博客,今天我们将聚焦于Cocos2d文档。无论您是初学者还是有经验的开发者,文档是学习和使用Cocos2d游戏引擎的重要资源。本文将引导您了解Cocos2d文档的重要性以及如何利用文档来提升您的开发效率。
Cocos2d是一个功能强大且广受欢迎的游戏开发框架,但它也是一个复杂的工具。文档为使用Cocos2d的开发者提供了必要的指导和资源,以便更好地理解框架的各个方面。文档包含了关于Cocos2d的详细说明、示例代码、API参考等重要信息。
使用文档可以帮助您快速入门并提高开发效率。无论您是在探索Cocos2d的基本概念还是处理高级特性,文档都是您的良好指南。
使用Cocos2d文档需要一些技巧,下面是一些利用文档的实用建议:
以下是一些技巧,可帮助您更有效地利用Cocos2d文档:
Cocos2d文档对于开发Cocos2d游戏的人们来说是一个宝贵的资源。它提供了全面的指导、示例代码和API参考,帮助您更好地理解和应用Cocos2d的各个方面。通过阅读官方文档、查看示例代码、参考API文档以及参与社区,您可以更快地掌握Cocos2d的技巧和技术,从而提高开发效率和质量。
因此,无论您是刚起步还是有一定经验的Cocos2d开发者,花费时间和精力去借助Cocos2d文档进行学习是非常值得的。希望这篇博客能够帮助您更好地利用Cocos2d文档,并取得开发上的成功。
作为游戏开发领域两大知名引擎,Unity和Cocos2d-X都拥有自己的一席之地。对于初学者来说,选择哪个引擎进行学习和开发是一个重要的抉择。本文将从新手角度出发,探讨Unity与Cocos2d-X的优劣势以及哪个更适合新手游戏开发者入门学习。
Unity:
Cocos2d-X:
了解了Unity和Cocos2d-X各自的特点后,新手开发者可以根据自身需求和兴趣选择合适的引擎进行学习和开发。若是希望快速上手、跨平台部署游戏,那么Unity可能更适合;若是对2D游戏开发感兴趣、并且喜欢深入学习底层原理,那么Cocos2d-X可能更适合。
学习cocos2d-x需要学习计算机语言,cocos2d有多个语言的版本,建议用C++因为跨平台比较容易些,javaC#object-c的版本都有,html5的也有,但是有局限性。计算机语言(computerlanguage)指用于人与计算机之间通讯的语言,是人与计算机之间传递信息的媒介。计算机系统最大特征是指令通过一种语言传达给机器,为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字、字符和语法规划,由这些字符和语法规则组成计算机各种指令(或各种语句),这些就是计算机能接受的语言。计算机语言的概念比通用的编程语言要更广泛,例如,HTML是置标语言,也是计算机语言,但并不是编程语言。
游戏引擎是游戏开发中至关重要的工具之一,它提供了开发人员创建游戏所需的基本框架和功能。在众多游戏引擎中,Unity与Cocos2d 等引擎备受开发者青睐。
Unity 是一款功能强大的跨平台游戏引擎,提供了丰富的开发工具和资源,使开发者能够轻松创建高质量的游戏作品。其灵活性和易用性使其成为业内领先的游戏开发引擎之一。
Cocos2d 是另一款备受好评的游戏引擎,特别适合2D游戏的开发。其简单易学的特点吸引了许多开发者选择使用它来开发手机游戏和小型游戏项目。
决定选择哪款游戏引擎取决于您的项目需求和个人偏好。如果您的项目需要制作复杂、高质量的3D游戏,Unity可能更适合您;如果您偏爱二维游戏开发,Cocos2d将是不错的选择。
无论您选择哪款游戏引擎,都可以通过学习相应的文档和教程来提升开发技能,创作出引人入胜的游戏作品。希望您能根据个人需求,选择一款适合自己的游戏引擎,开发出令人惊艳的游戏作品!
1. 什么是plist文件格式?这是一种人类可读的串行化对象文件,由苹果公司发明,最早用于NeXTSTEP系统。详情看这里: Plist 。cocos2d-x 从 cocos2d-iphone 发展而来,因此在引擎中大量使用了这种文件格式。
2. 如何编辑plist文件?在 OS X 系统上,XCode 就可以直接打开和编辑plist文件。而在Windows上,我还没有找到可用的plist编辑软件。当然,plist是基于XML的纯文本格式,随便找个文本编辑器就可以编辑了。
3. cocos2d-x在哪些地方使用了plist格式?图像纹理定义文件 将多个纹理拼在一张大图上,使用 CCSpriteFrameCache 可以载入这类plist文件; 这里有一个图像纹理定义文件的范例: [cocos2d-x]\samples\Cpp\TestCpp\Resources\animations\grossini_family.plist。Label纹理定义文件 作用与图像纹理定义文件类似,只不过处理的是自己,面向 CCLabelAtlas ; 这里有一个Label纹理定义文件的范例: [cocos2d-x]\samples\Cpp\TestCpp\Resources\fonts\tuffy_bold_italic-charmap.plist 。帧动画定义 定义一个或多个动画中,使用哪些纹理,使用 CCAnimationCache 可以载入这类plist文件; 这里有一个帧动画定义文件的范例: [cocos2d-x]\samples\Cpp\TestCpp\Resources\animations\animations.plist 。
4. 生成plist文件的工具对于纹理定义文件来说,它的作用是如何在大图中找到碎图的坐标。因此很多拼合碎图的软件可以在拼合碎图的同时生成plist文件。TexturePacker 是所有平台上最好用的工具了;Zwoptex 是MAC Only的软件,我不太喜欢用;SpritePacker 是Windows Only的软件,功能尚可。
5. 图像纹理定义文件格式说明cocos2d-x中的纹理定义格式,是以Zwoptex生成的格式为标准的。Zwoptex生成的格式,有4种主要不同的版本:format值为0,代表Flash版本;format值为1,Zwoptex 0.4b以前支持;format值为2,Zwoptex 1.0以后支持,与format1的区别在于支持旋转;format值为3,属性名称进行了大幅修改,Zwoptes1.0.2之后支持。这3种格式的plist文件,cocos2d-x都能支持,具体的解析代码在CCSpriteFrameCache::addSpriteFramesWithDictionary 。TexturePacker生成的for cocos2d plist格式与Zwoptex生成的format为2的格式相同。5.1 format为0的plist文件这里贴一个比较完整plist文件,为了方便描述,其中仅包含一个frame。
pygame在PC上写小游戏非常方便,可能几十行代码就可以实现一个简单的小游戏,使用pygame编写贪吃蛇、俄罗斯放开、连连看等小游戏很简单,有Python基础,可能半天就可以完成了!
Cocos2d是一个面向移动设备的开源游戏框架,它是基于OpenGL ES 2.0的,由Cocos2d-iPhone和Cocos2d-X两个分支组成。相对于其他游戏引擎,Cocos2d具有轻量级、易学易用、跨平台等优点,因此很受开发者的欢迎。
对于有编程经验或有一定编程基础的开发者来说,学习Cocos2d并不是非常困难。但是对于完全没有编程经验或编程基础的开发者来说,学习Cocos2d可能会比较困难,需要花费更长的时间和精力。同时,需要学习的内容也比较多,包括Cocos2d的架构、语法、API等等。
不过,自学Cocos2d是可以学好的,只需要有耐心、勤奋和坚持不懈的学习精神。建议初学者可以通过查看Cocos2d官方文档、视频教程、相关书籍等多种方式来学习。另外,加入Cocos2d社区可以获得更多的帮助和支持,可以向经验丰富的开发者请教问题,也可以了解最新的技术和开发动态。
之前看了Mahout官方示例 20news 的调用实现;于是想根据示例的流程实现其他例子。网上看到了一个关于天气适不适合打羽毛球的例子。
训练数据:
Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No
检测数据:
sunny,hot,high,weak
结果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代码调用Mahout的工具类实现分类。
基本思想:
1. 构造分类数据。
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
接下来贴下我的代码实现=》
1. 构造分类数据:
在hdfs主要创建一个文件夹路径 /zhoujainfeng/playtennis/input 并将分类文件夹 no 和 yes 的数据传到hdfs上面。
数据文件格式,如D1文件内容: Sunny Hot High Weak
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
这三步,代码我就一次全贴出来;主要是两个类 PlayTennis1 和 BayesCheckData = =》
package myTesting.bayes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;
import org.apache.mahout.text.SequenceFilesFromDirectory;
import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;
public class PlayTennis1 {
private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";
/*
* 测试代码
*/
public static void main(String[] args) {
//将训练数据转换成 vector数据
makeTrainVector();
//产生训练模型
makeModel(false);
//测试检测数据
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"testinput";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeTrainVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"input";
String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeModel(boolean completelyNB){
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";
String model = WORK_DIR+Path.SEPARATOR+"model";
String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";
Path in = new Path(input);
Path out = new Path(model);
Path label = new Path(labelindex);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean参数是,是否递归删除的意思
fs.delete(label, true);
}
TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();
String[] params =null;
if(completelyNB){
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};
}else{
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};
}
ToolRunner.run(tnbj, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生成训练模型失败!");
System.exit(3);
}
}
}
package myTesting.bayes;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.mahout.classifier.naivebayes.BayesUtils;
import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;
import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;
import org.apache.mahout.common.Pair;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Vector.Element;
import org.apache.mahout.vectorizer.TFIDF;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
public class BayesCheckData {
private static StandardNaiveBayesClassifier classifier;
private static Map<String, Integer> dictionary;
private static Map<Integer, Long> documentFrequency;
private static Map<Integer, String> labelIndex;
public void init(Configuration conf){
try {
String modelPath = "/zhoujianfeng/playtennis/model";
String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";
String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";
String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";
dictionary = readDictionnary(conf, new Path(dictionaryPath));
documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));
labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);
classifier = new StandardNaiveBayesClassifier(model);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("检测数据构造成vectors初始化时报错。。。。");
System.exit(4);
}
}
/**
* 加载字典文件,Key: TermValue; Value:TermID
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {
Map<String, Integer> dictionnary = new HashMap<String, Integer>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
String name = path.getName();
return name.startsWith("dictionary.file");
}
};
for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {
dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());
}
return dictionnary;
}
/**
* 加载df-count目录下TermDoc频率文件,Key: TermID; Value:DocFreq
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {
Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
return path.getName().startsWith("part-r");
}
};
for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {
documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());
}
return documentFrequency;
}
public static String getCheckResult(){
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String classify = "NaN";
BayesCheckData cdv = new BayesCheckData();
cdv.init(conf);
System.out.println("init done...............");
Vector vector = new RandomAccessSparseVector(10000);
TFIDF tfidf = new TFIDF();
//sunny,hot,high,weak
Multiset<String> words = ConcurrentHashMultiset.create();
words.add("sunny",1);
words.add("hot",1);
words.add("high",1);
words.add("weak",1);
int documentCount = documentFrequency.get(-1).intValue(); // key=-1时表示总文档数
for (Multiset.Entry<String> entry : words.entrySet()) {
String word = entry.getElement();
int count = entry.getCount();
Integer wordId = dictionary.get(word); // 需要从dictionary.file-0文件(tf-vector)下得到wordID,
if (StringUtils.isEmpty(wordId.toString())){
continue;
}
if (documentFrequency.get(wordId) == null){
continue;
}
Long freq = documentFrequency.get(wordId);
double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);
vector.setQuick(wordId, tfIdfValue);
}
// 利用贝叶斯算法开始分类,并提取得分最好的分类label
Vector resultVector = classifier.classifyFull(vector);
double bestScore = -Double.MAX_VALUE;
int bestCategoryId = -1;
for(Element element: resultVector.all()) {
int categoryId = element.index();
double score = element.get();
System.out.println("categoryId:"+categoryId+" score:"+score);
if (score > bestScore) {
bestScore = score;
bestCategoryId = categoryId;
}
}
classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";
return classify;
}
public static void printResult(){
System.out.println("检测所属类别是:"+getCheckResult());
}
}