f(sixleaves) = sixleaves

重剑无锋 大巧不工

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  95 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks

#

函数指针是一个重难点,看完书本后,决定写篇自己做下总结。
首先在C++\C中,函数的函数名本身就是地址,而函数指针就是存储这个地址的变量。
如下代码void fun(int a, int b) {.....};函数,其fun就是一个指针,也就是存的是地址,
而void (*p)(int, int) = fun;就是指向这个函数的指针,其实说来p函数指针这时也使指
向这个函数的,所以要使用这个函数的话,理论上应该写成(*p)(2, 3);这种形式,但是实
际上,通过p(2, 3)也可以成功调用,所以我们可以把函数指针在某种情况下当成函数的别
名,虽然这样不符合逻辑,当然,如果你比较较真,可以使用(*p)(2, 3);这边讲了这么多
现在来总结下如何声明一个特定类型的函数指针吧。
知识点1:
声明特定类型的函数指针:
     1.先写出要声明的指定函数的原型prototype。如void fun(int , int );
     2.把prototype中的函数名替换成(*p),如void (*p)(int , int );
经过上面两步,你就声明了一个指向无返回值,带有两个int类型的函数的函数指针p。
哇,原来函数指针这么简单啊、谁说指针很复杂的,谁说指针很难的,拉出去斩了、欺骗我们幼小的心灵。
此时你可能会问,怎么调用啊,怎么调用啊,首先你要给他赋值,其次,调用分两种,就是上面一开始说
的那两种。说白了,也就是对于函数指针调用函数,你可以解引用,可以刻直接用地址。

知识点2:
声明特定类型的函数指针数组:
    1.和知识点一1,2步一样,我们先写出一个。第二步在想办法写成一个数组
    2.把(*p)替换成(*p[3])这样p就是一个包含3个函数指针的数组。也就是说p是函数指针的指针!
什么意思!什么叫做指针的指针,你在说什么!,哈哈有得人看到这开始晕了,那么后面的你更晕,其实说白了p是指向数组的第一个元素
也就是说p的地址值是第一个元素的地址,所以说p是函数指针的指针啊,因为p指向的时函数指针,函数指针指向的才是内存中函数指令区域的那个块!

知识点3:
对于数组p[n]区别,p和&p的重大区别:
前言:我们知道p指向数组的第一个元素,所以p等价于&p[0],所以我们可以轻易看出区别了,p和&p
        的相同点是在数字上,他们相同,但是在大小上,或者说类型上,他们不同,&p指向的时整个数
        组,如果&p + 1则跨越的时整个数组。其实我们可以从指针定义的运算来理解,我们知道,指针
        的加加,本质上是地址的跨越,而跨越的长度,取决于地址的类型,&p是指向数组的指针,所以
        其跨越的长度,肯定是一整个数组,而p指向的时数组中得第一个元素,所以p + 1,跨越的时数
        组的一个元素。
1.p和&p的相同点,在于数值上,他们都是那个内存块的地址,而那个内存块用一个地址标志,所以他们的数字相同。
2.p和&p的区别在于类型上,p是指向一个元素的,&p是指向一个数组的,所以p + 1和&p + 1有十分大得区别。

知识点4:
问题:
假设有const double * (*pa[3])(const double * , int ) = {f1, f2, f3},声明指向该函数指针数组的指针。

有了知识点3,理解知识点4就十分容易了。
      1.C11方法auto pc = &pa;  C11的方式十分简单方便但是对于不支持C11的请看第二个,最原始的方法
      2.分析:因为我们要声明的时一个指针,而不是一个数组所以首先用(*pd)把其扩起来,然后其是指向一个函数指针数组,这个数组有3个元素。所以其核心部分就是(*pd)[3],此时的意思就是所pd是一个指针,其指向包含3个元素的数组
所以第三步我们要说明,数组元素的类型了,类型就是const double * (*)(const double *, int),也就是const double * (* (*pd)[3])(const double *, int)。
tips:
有人反映第三步类型看不懂,其实很简单,我举个例子,
1.int *p;p的类型是int *,
2.而int *p[3],p的类型是int * [3]也很好理解就是带有三个数组,元素类型都是int *。
3.而int (*p[3])(int ),p的类型是int (*[3])(int),p是指向一个3个元素的数组,且每个元素的类型都是int (*)(int)。
(指针是什么类型主要看括号、*号、[]号,和参数列表的结合顺序,如果只有(*p)(int ,....)那p就是函数指针)
所以有以下推论。
      
元素的数据类型推论:
要判断数组或指针的类型,就是拿掉<数组名、指针名>后组成的,而且[]和*是从右向左结合。
要判断数组元素的类型,就是在数组类型的基础上把大小拿掉


知识点5:
使用typedef创建函数指针类型别名:
       1.typedef简化函数指针其本质就是为函数指针的类型取别名。
       如下:
       typedef const double *(*p_fun)(const double *, int);其是此时相当于typedef Const double *(*)(const double *, int)  p_fun;
当然你不能这样写,这样写只是方便你理解。
       p_fun不是函数指针了,而是这种函数指针类型的别名,所以此时你可以这样做
       p_fun p1 = f1;
       p_fun pa[3] = {f1, f2, f3};
       p_fun (*pd)[3] = &pa;
       是不是比之前的简单许多!,这个很重要哦
好了函数指针就总结到这,如有不足请指教。
以下是测试代码:测试代码参考自C++ Primer Plus
 1 //
 2 //
 3 //  Unit7
 4 //
 5 //  Created by sixleaves on 14-7-26.
 6 //  Copyright (c) 2014年 sixleaves. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 
11 const double * f1(const double ar[], int n);
12 const double * f2(const double [], int);
13 const double * f3(const double *, int);
14 
15 int main() {
16     
17     using namespace std;
18     double av[3] = {1112.3, 1542.6, 2227.9};
19     
20     
21     //pointer to a function
22     const double * (*p1)(const double *, int) = f1;
23     auto p2 = f2;//C++11 automatic type deduction
24     //pre-C11 can use the following code instead
25     //const double * (*p2)(const double *, int) = f2;
26     
27     
28     cout << "Using pointers to functions:\n";
29     cout << "Address Value\n";
30     cout << (*p1)(av, 3) << ": " << *(*p1)(av, 3) << endl;//严密的逻辑性调用
31     cout << p2(av, 3) << ": " << *p2(av, 3) << endl;//感性调用
32     
33     //pa an array of pointers
34     //auto doesn't work with list initialization
35     const double *(*pa[3])(const double *, int) = {f1, f2, f3};
36     //but it does work for initializing to a single value
37     //pb a pointer to  fitst element of pa
38     auto pb = pa;
39     //pre-c11 can use the following code instead
40     //const double *(**pb)(const double *, int) = pa;
41     
42     cout << "\nUsing an array of pointer to functions:\n";
43     cout << " Address Value\n";
44     for (int i = 0; i < 3; i++) {
45         cout << pb[i](av, 3) << ": " << *pb[i](av, 3) <<endl;
46     }
47     
48     //what about a pointer to an array of function pointers;
49     cout << "\nUsing pointers to an array of function pointers:\n";
50     cout << " Adress Values\n";
51     //easy way to declare pc
52     auto pc = &pa;
53     //pre c11 can use the following code instead
54     //const double *(*(*pc)[3])(const double *, int) = &pa;
55     
56     cout << (*pc)[0](av, 3) << ": " << *(*pc)[0](av, 3) << endl;
57     
58     //hard way to declare pd;
59     const double *(*(*pd)[3])(const double *, int) = &pa;
60     
61     //store return value in pdb;
62     const double *pdb = (*pd)[1](av, 3);
63     cout << pdb << ": " << *pdb << endl;
64     
65     //alternative notation
66     cout << (*(*pd)[2])(av, 3) << ": " << *(*(*pd)[2])(av, 3) << endl;
67     
68     return 0;
69 }
70 const double * f1(const double ar[], int n) {
71     return ar;
72 }
73 const double * f2(const double ar[], int) {
74     return ar + 1;
75 }
76 const double * f3(const double ar[], int) {
77     return ar + 2;
78 }
79 
posted @ 2014-07-26 18:08 swp 阅读(2418) | 评论 (5)编辑 收藏

@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 最近在学习游戏开发,又得重新看C++鸟,为了进行语法的熟悉决定再次进行刷oj,我刷的oj时杭电的oj。在1002题时候,卡了一下,但最终还是顺利通过。
大数加法是一项十分十分基本的编程技能,好鸟不啰嗦鸟。

算法核心思想:1.将字符串按照权重转换为整型数组中相应的位(0索引对应最低位,权重为1,是个位)。2.然后进行按照位相加运算。

具体代码如下。
 2 //  main.cpp
 3 //  oj
 4 //
 5 //  Created by sixleaves on 14-7-23.
 6 //  Copyright (c) 2014年 sixleaves. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <string>
11 #include <cstdlib>
12 const int ArSize = 1024;
13 using namespace std;
14 char *psResult = new char[ArSize];//   分配于堆中,不是局部变量
15 char* sum(string a, string b);

16 int main(int argc, const char * argv[])
17 {
18 
19     int nTestCase;
20     int i = 0;
21     cin >> nTestCase;
22     while (i < nTestCase) {
23         string a,b;
24         while (cin >> a >> b) {
25             cout << "Case " << i + 1 <<":"<< endl;
26             cout << a + " + " + b + " = "
27                  <<sum(a, b) << endl;
28             if(i + 1 != nTestCase)
29                 cout << endl;
30             i++;
31             break;
32         }
33     }
34     return 0;
35 }
36 
37 char* sum(string a, string b) {
38     //   进行数据的转换,把字符串数据转换为整数
39     //   char *psResult = new char[ArSize];
        //   为了提高程序速度,把这个放在了外面,不用每次都申请
40     int nR[ArSize] = {0}, nA[ArSize] = {0}, nB[ArSize] = {0};//   并且都初始化为0
41     int nLenA = a.length(), nLenB = b.length();
42     for(int i = 0; i < nLenA; i++) {
43         nA[i] = a[nLenA - i - 1] - '0';
44     }
45     for(int i = 0; i < nLenB; i++) {
46         nB[i] = b[nLenB - i - 1] - '0';
47     }
48     //   进行相加运算
49     int nLenMax = nLenA > nLenB? nLenA : nLenB;
50     for(int i = 0; i < nLenMax; i++) {
51         nR[i] += nA[i] + nB[i];
52         if(nR[i] > 9) {
53             nR[i] -= 10;
54             nR[i + 1]++;
55         }
56     }
57     //   转换为字符串
58     if(nR[nLenMax] != 0)//   如果最后一位相加有近位,则总长度加1
59         nLenMax++;
60     for(int i = 0; i < nLenMax; i++) {
61         psResult[i] = nR[nLenMax - i - 1] + '0';
62     }
63     psResult[nLenMax] = '\0';
64     return psResult;
65 }
66 
posted @ 2014-07-24 02:58 swp 阅读(166) | 评论 (0)编辑 收藏

今天完成了图片库的改进,不得写下关于这个的深切感触,获得的宝贵经验!。不罗嗦直接看先看代码
1.平稳退化
    要支持平稳退化,也就是在浏览器禁用js时,不会造成无法浏览,知识用户体验变差了而已,功能还是实现了的。此时就不能使用javascript伪协议加href属性来解决。如下。
2.分离js
    分离js的关键技术就是要结合HTML生命周期,和window对象的onload方法以及元素对象拥有事件函数进行相应的自定义函数绑定。
3.兼容性(对象检查技术、其实用来确定代码错误位置也很好用)
4.优化代码(使用特定压缩工具,压缩js代码)
 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8" />
 5         <title>Image Gallery</title>
 6     </head>
 7     <body>
 8         <h1>Snapshots</h1>
 9         <ul id = "imagegallery">
10             <li>
11                 <href="images/fireworks.jpg" title="A fireworks display">
12                 Fireworks
13                 </a>
14             </li>
15             <li>
16                 <href="images/coffee.jpg" title="A cup of black coffee">
17                 Coffee
18                 </a>
19             </li>
20             <li>
21                 <href="images/rose.jpg" title="A red. red rose">
22                 Rose
23                 </a>
24             </li>
25             <li>
26                 <href="images/bigben.jpg" title="The famous clock">
27                 Big Ben
28                 </a>
29             </li>
30         </ul>
31         <img id="placeholder" src="images/placeholder.jpg" alt="my image gallery" />
32         <id="desp">Choose an Image</p>
33         <script type="text/javascript" src="./scripts/showPic.js">
34         </script>
35     </body>
36 </html>
g 1 function showPic(whichPic) {
 2     alert("showPic");
 3     var source = whichPic.getAttribute("href");
 4     var placeholder = document.getElementById("placeholder");
 5     placeholder.setAttribute("src",source);
 6     var text = whichPic.getAttribute("title");
 7     var txtNode = document.getElementById("desp").firstChild;
 8     txtNode.nodeValue = text;
 9     return false;
10         /*
11         经验总结:
12         1.由于js是动态语言,所以存在一个很严重的问题,
13         那就是你自己取的变量名称时,尽可能的采用骆驼峰写法,
14         并且最后借助好的编辑器,有自动补全功能的编辑器,一面
15         拼写错误,这种错误低级,而且查找起来十分困难。
16 
17         2.如果站点用到多个js文件,因该把它合并到一个文件中。以减少请求次数,提高性能。
18 
19     */
20 }
21 
22 function addLoadEvent(func) {
23     var oldLoad = window.onload;
24     if(typeof oldLoad == 'function') {
25         window.onload = function() {
26             oldLoad();
27             func();
28         }
29     }else {
30         window.onload = func;
31     }
32 }
33 
34 function prepareGallery() {
35     //使用对象检查技术,检查所要用到的方法是否可以用。
36     //在js dom中,一切都可视为对象,包括方法,
37     //所以说这是对象检测技术,检测这个对象存不存在
38     //下面主要是检查浏览器是否支持这些DOM接口
39     //alert("jsss");
40     
41     if(!document.getElementsByTagName) {alert("tag");return false};
42     if(!document.getElementById) return false;
43     if(!document.getElementById("imagegallery")) return false;
44     var gl = document.getElementById("imagegallery");
45     var links = gl.getElementsByTagName("a");
46     //alert(typeof links);
47     for(var i = 0; i < links.length; i++) {
48         links[i].onclick = function() {
49             return showPic(this);
50         }
51     }
52     //alert("end");
53 }
54 addLoadEvent(prepareGallery);
55 /*
56 这里介绍下HTML的声明周期,当HTML文档完成加载时,此时DOM节点树立即构建起来,此时会出发window对象的onload事件
57 所以我们在这个时候执行prepareGallery()函数进行,相应节点对象上的事件绑定是最合适的,因为此时我们能确保整颗节点
58 树已经构建完毕,我们绑定只要代码不出错,就肯定不会出错。要是不用这个事件来处理。而只是通过srcipt标签引入,不管是放在
59 head区域还是body结束之前,都无法保证此时DOM节点树已经构建完成,所以要实现js分离我们一定要用到HTML的声明周期中的加载完成
60 ,构建完成DOM节点树而触发的window.onload事件,有人会问此时document对象是否存在,在BOM中,window对象含有一个成员变量,
61 就是document,所以有window对象,就有document对象。
62 */
63 
g
代码中的注释已经详细说明了代码是要来干什么的。其实今天改进版本的图片库,本来是想学习下HTML生命周期和DOM节点树的关系,以及和window.onload的关联。还有学习怎么平稳退化。结果卡壳,卡了半天,差错,差了半天,起初是其中一个字符编码有问题,运行结果不对。找了半天才找到。
这里总结写js的快速调试办法,当然有点麻烦。
我们在写js时,如果在定位元素时,我们应该分步定位,步步缩进,在定位时,利用对象检查技术,我们可以很轻易找到我们出错的地方。本来这项技术是用来保证兼容性的,但是我们还可以用它来定位错误!,在没有该对象的时候使用alert进行提示。在调试时,我们就可以快速定位错误的位置,因为大多数时候我们写的代码在我们理解的逻辑上是不会有错的,但是我们有时可能为定位某个元素,给其加了给id,但是定位时却拼错了,这时我们通过对象检查技术,就可以很快找到错误的地方。
2014.07.11
02:44
于福州
posted @ 2014-07-11 02:41 swp 阅读(121) | 评论 (0)编辑 收藏

 1 <!DOCTYPE html>
 2 <html>
 3     <!--我们希望做到的是
 4         1.当点击某个链接,我们3希望能留在这个网页而不是转到另外一个窗口
 5         2.当点击某个链接,我们希望能在这个网页上同事看到那张图片和原有的图片清单
 6     -->
 7     <!--
 8         1.当我们触发onclick事件时,不仅showPic函数会被调用,链接也会起作用,而跳转到另外一个窗口
 9           所以,这里有个知识点,对于a标签的onclick函数,如果你让onclick函数返回false,那么浏览器
10           会认为你没有点击链接,也就不会发生跳转。
11         2.如果吧a标签看成对象,你会发现这个很容易理解,我们给a标签增加了onclick函数具体的做什么事情,
12           也就是说onclick函数是a对象里的一个方法,那么这里的this就是指的就是a标签这个对象。现在你明白
13           为什么要用this了吧(想想C++、java)
14     -->
15     <head>
16         <meta charset="utf-8" />
17         <title>Image Gallery</title>
18     </head>
19     <body>
20         <h1>Snapshots</h1>
21         <ul>
22             <li><href="images/fireworks.jpg" title="A fireworks display" onclick="return showPic(this);">Fireworks</a></li>
23             <li><href="images/coffee.jpg" title="A cup of black coffee"  onclick="return showPic(this);">Coffee</a></li>
24             <li><href="images/rose.jpg" title="A red. red rose" onclick="return showPic(this);">Rose</a></li>
25             <li><href="images/bigben.jpg" title="The famous clock" onclick="return showPic(this);">Big Ben</a></li>
26         </ul>
27         <img id="placeholder" src="images/placeholder.jpg" alt="my image gallery" />
28         <id="desp">Choose an Image</p>
29         <script type="text/javascript" src="scripts/showPic.js"></script>
30     </body>
31 </html>

showPic.js

function showPic(whichPic) {
    var source = whichPic.getAttribute("href");
    var placeholder = document.getElementById("placeholder");
    placeholder.setAttribute("src",source);
    var text = whichPic.getAttribute("title");
    var txtNode = document.getElementById("desp").firstChild;
    txtNode.nodeValue = text;
    return false;
    /*
        经验总结:
        1.由于js是动态语言,所以存在一个很严重的问题,
        那就是你自己取的变量名称时,尽可能的采用骆驼峰写法,
        并且最后借助好的编辑器,有自动补全功能的编辑器,一面
        拼写错误,这种错误低级,而且查找起来十分困难。

        2.如果站点用到多个js文件,因该把它合并到一个文件中。以减少请求次数,提高性能。

    
*/
}
posted @ 2014-07-10 02:53 swp 阅读(155) | 评论 (0)编辑 收藏

     摘要:   阅读全文
posted @ 2014-07-09 03:33 swp 阅读(159) | 评论 (0)编辑 收藏

准备工作:
      编写javascript并不需要复杂的工具,其编写的代码必须通过HTML/XHTML文档执行。有两种方式可以做到,第一种是在head标签中的script标签中写生javascript代码。
      另外一种方式使我们推荐的使用的方式,把js代码放在外部,在引用进去,引用的位置最好是在HTML文档最后,</body>之前,这样可以加快浏览器加载页面的速度。引
      用的方式就是在script标签中的src属性上赋值,所写js代码的路径。
  1 <!DOCTYPE HTML>
 2 <html>
 3   <head>
 4      <meta charset="utf-8" />
 5      <title></title>
 6   </head>
 7   <body>
 8      ..
 9      <script src="file.js"></script>
10   </body>
11 </html>
语法:
       一.语句:js的语句可以不加分号而把他们放在不同行上,但这不是好的编程习惯,为了培养好的编程习惯,我们每条语句都给它加上分号,不管是不同行的还是同一行的。
       二.注释:(1)行注释// (2)段注释/**/ (3)HTML风格行注释<!--(不推荐使用,容易于HTML注释混淆)
       三.变量:使用var进行声明,由于js是动态语言,可以直接用变量赋值代替变量声明(test = “fuck”,将自动声明test变量)。但是为了培养编程习惯,请在使用前声明。
       四.变量类型:
               (1)字符串:包含在单引号或者双引号里的字符序列,选择的简单原则是:如果字符串包含单引号,则使用双引号,如果字符串包含双引号,则是同单引号。如:var mood = "don't ask";淡然也可以用转义字符,那么你仍然可以使用单引号,var mood                                  = 'don\'t ask';
                (2) 数值:可以直接使用整数,浮点数。var a = 3, b= 2.32;
                (3) 布尔值:var test=true,sleeping = false;注意布尔值true于字符串"true"是两码事
                Tips:标量--如果某个数是标量(scalar),它在任意时刻只能有一个值。(1)-(3)都是标量。

                (4) 数组:相对于标量,如果想用变量存储一组值,就得用数组。
                    4.1创建数组:
                            使用数组有两种方式:一种是先声明数组,在对数字赋值。一种是在声明是就赋值。
                            第一种的话,如果使用整数索引,0开始表示第一个。第二种方式,是var test = Array("waht",1,"fuck","come",1.23);//创建了有五个元素的数组
                            Tips:数组的元素还可以是数组。
                    4.2关联数组:(哈希数组)
                            var test = array();test["first"] = 1;//不推荐使用关联数组,因为在js中,每中类型其实都是实例对象,所以这种方法的本质是给Array()对象添加
                            属性,如上,添加就是first属性。最好的情况下不应该修改Array对象属性,而是使用OBject对象。
                (5)对象:
                      与数组一样的是,对象也是使用一个名字表示一组值。
                      5.1:创建对象,使用Object关键字。如:var lesson = Object();
                      5.2:使用.号了添加或者获取对象的属性。如 lesson.name = "John";
                      5.3:创建对象的另外一种简单方法----花括号方法:
                            var lesson = {name:"John",year:1945};
                       Tips:
                             var beatles = {};//创建一个Object对象
                             beatles.vocalist = lesson;//为Object对象添加vocalist属性,值为lesson对象。
                             于是我们这样获取值beatles.vacalist.name,beatles.vacalist.year
         五.操作:  (1)算数操作运算符(+ - * / )(2)字符串拼接运算符(+)so:10 + 20 ---30;"10" + 20 --- 1020;(3)另外一个特殊的很好用的是+=,如:var year=2000;var message = "this is "; message += year;---"This is 2000";
         六. 条件语句、循环语句、函数(函数有点区别):略(于C、C++、Java差不多)
         七.变量的作用域:
                  全局变量:可以在脚本任何位置引用。
                  局部变量:存在于指定函数内部。在函数内部,使用var关键字的变量一定是局部变量,而没有使用的这是全局变量。
                     function square(num) {
                    total = num * num;//total为全局
                       return total;
                }

              var total = 50;
              var number = square(20);//改变total,因为其实全局的。
              alert(total);//400
                   function square(num) {
                   var total = num * num;//改成这样就安全了
                   return total;
                }
         八:对象:一个对象包含属性和方法,都可以通过.来访问属性和方法。
                内建对象(其实应该成为类):Array().可以使用new关键字来创建var beatles = new Array();还有Date类、Math类。
                宿主对象():也即是JS寄生的环境,如浏览器环境,则此时有浏览器提供的对象被成为宿主对象,Form、IMage、Element、document
         
         总结:JS对对象的定义有点奇葩,这里总结下,首先同意观点,可以把它所说的对象看成类,而实例化对象的方法有两种,一种是使用关键字如Array()、Object()等即可,一种是
                最通用的显示的使用new关键字,进行对象的创建如new Array()等。
posted @ 2014-07-09 00:42 swp 阅读(186) | 评论 (0)编辑 收藏


cocos2dx因其得天独厚的跨平台性,得以受到众多开发者的晴菜,包括我在内。那么如何在osx系统中编译成antroid程序呢?

我们知道android的开发工具google已经打包提供给我们,其里面有完整的定制好的eclipse,所以我们需要google给我打包好的
这个安装包adt-bundleXXX。再者我们需要java的运行环境,jdk。还有一个很重要的是ndk。所以你的第一步是到google上下载.
first step
       1.Go to google and download adt、ndk。
       2.Go to Oracle and download jdk(一般苹果默认自带jdk,除非版本太久,不然不用自己下载了)

把安装准备好之后,把他们分别解压到对应文件夹,我是解压到dev(development的简写)文件夹(cocos2dx也在这个文件夹里面)。
接着打开终端编辑/etc/profile文件,用命令sudo vim /etc/profile,进入后,按i进入编辑状态,在最后一行输入
export NDK_ROOT="这里填写上你的ndk根目录",然后按Esc按键,输入wq!保存并退出既可以。接着还得输入source /etc/profile
让这个配置文件中设置的环境变量立即生效。
second step
       1.sudo vim /etc/profile and input “export NDK_ROOT="这里填写上你的ndk根目录“"
       2.source /etc/profile

thirdth step 在终端中建立工程,指定编程语言,包名,存放位置python cocos.py new HelloWorldDemo -p com.coco2dx.org -l cpp -d ~/Desktop

fourth step打开HelloWorldDemo项目,cocos2d/cocos/platform/android/java/src/org/cocos2dx/lib,将其这个库复制到anroid开发平台的源代码目录下:

HelloWorldDemo/proj.android/src/org/cocos2dx/目录下,其实这些都不要强记,第四步也很好理解,因为当我们把这个工程导入eclipse时其找不到要引用
的这些包,所以要将其拷贝到那个目录下,至于怎么记忆,理解了就容易,在项目中一共有五个平台,对应五个文件夹,我们关注的是antroid,所以有关键字android
的那个文件夹就是对应android平台的,进入我们要到其源代码目录下,其实也就是src。而拷贝的包是在cocos框架下的所以我们要进入这个框架,进入之后肯定有对应于
个给平台所对应的库,所以我们关注platform这个关键字,找到后进入,找到antroid平台,在进入其src下,一直进入知道找到lib这个文件夹,将其拷贝到刚才说的地方。

finally step

最后一步就是打开eclipse,选着android工程,将我们创建的那个项目中的andoird.projXXX什么这个文件夹导入,然后你就可以编译,运行,这就完成了转换到antroid平台的
转换。

posted @ 2014-07-07 00:10 swp 阅读(340) | 评论 (0)编辑 收藏

关于cocos2dx开发环境的搭建,在其官方网站其实有详细的说明,这里进行进一步封装和提取。

1.由于cocos2dx-3.0版本中用到了python来构建项目,所以首先你的系统要具有python开发环境。
first step:去下载python2.7.7版本。但是mac默认其实已经自带了,就可以不用在去下载安装了。

2.由于我们可以通过python写的命令行程序很方便的构造工程,所以我们有必要学习其构造工程的命令
将tools/cocos2d-console/bin添加到系统环境变量或者直接cd tools/cocos2d-console/bin到该目录下
然后执行python cocos.py 这个python运行程序,我们需要说明我们工程的名字,用new指定。需要说明包名,用-p 指定包名
用-l 指定语言 -d指定这个项目文件放在哪里。如下:
python cocos.py new HelloWorldDemo -p com.coco2dx.org -l cpp -d ~/Desktop
也就是创建HelloWorldDemo这个项目,把它放在桌面,其编写语言用c++、其包名为com.coco2dx.org
这样我们就创建了一个工程项目。

3.用Xcode打开工程,进入HelloWorldDemo里面的proj.ios_mac文件夹里面,后缀为xcodeproj的文件,其名字就是刚才创建的工程名称。

2014.07.06 周日
16:37:00
于福州 创建
posted @ 2014-07-06 16:28 swp 阅读(3164) | 评论 (0)编辑 收藏

最近刚换成mac osx,用校园网的认证客户端inode,osx版本的,却老是给你断线。解决方案如下。
1.关掉app nap功能,该功能会自动判断程序状态,把程序搞成block状态。所以程序就会释放掉相应资源暂停运行,于是inode就会出现提示,服务器收不到响应或什么的,让后直接给你断线了。
所以在osx的搜索中,打入ter打开终端,输入
defaults write NSGlobalDomain NSAppSleepDisabled -bool YES
按下回车就会把app nap关掉。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.你是不是只做了第一步,过了几天,或者一会儿,又会断线了。那么接下来你要做得就是每天已启动mac后打开终端,重新启动 iNodeMon进程。
打开终端输入如下命令:
cd /Applications/iNodeClient
sudo ./iNodeMon
接着会要求你输入密码,输入后按回车。再次打开iNode
就可以成功运行。之所以会出现这种情况,应该是这个软件在mac启动时候。iNodeMon没有启动成果,所以需要我们手动启动。
posted @ 2014-07-06 00:47 swp 阅读(984) | 评论 (0)编辑 收藏

科技正在改变我们所处的时代,科技的发展也有个奇点,就像宇宙大爆炸,在还不到0.1秒的时间内突然膨胀出现了现在这个宇宙,或许万事万物都如同中国哲学上的轮回,宇宙还会回归奇点,然后再爆炸长生新的宇宙。今天有这些感慨是我们的国家在很多方面落后美国太多,刚在看新闻,看到一条军方曝光新疆精锐特战部队,训练的内容竟然是扛着圆木,骑着摩托像耍杂技似的,诚然一些身体体能、素质需要训练,但是在我们的国家,有多少这样的情况呢?在现代化的战争中,最精锐的是科技,而不是体力,比原子弹更有威力的是人类的大脑不是身体,每每看到国家报道这种训练,我都觉得不可思议,然道我们国人认为现在还是冷兵器时代,当美国人派着机器人、无人战机,无人坦克,甚至是无人航母,而所有的战士都只是坐在电脑前操作,当然除了不可能全部,美国人会保持自身军事化训练,免得机器出问题没人回打仗。当我们面对的是这种高科技,而我们国家还是扛着打枪大炮对抗这种高智能,自动化,高精确、快速打击的武器岂不是和清朝末年清军拿起大刀和洋鬼子作战一个道理。有时在想我们中国为什么会落后,其实是在一种意识形态上我们经过几千年封建思想演化留下来的一种定性、几乎无法改变的思维。为什么中国是一个强调人际关系型的关系型社会,这本身并没有什么不好,人本来就是要人情,这也是一种以人为本的态度吧。但是现在又有多少国人已经把这种发展成为了圆滑。这是一种毒瘤,如果要算经济损失,不知道损失了多少,因为圆滑让我们没有十分严谨的法律制度,现在的我们国家的法律有那么多的漏洞和不足,而这又导致了许许多多的社会问题、包括现在人们对待科技、对待人才、对待学术的态度、很多人认为读书无用、很多人认为在中国要生存的好,只要懂得做人就好,但是这的的确确是现在我们国家的问题、根结所在。现在只有国家的精英团体强势的改革才有希望改变中国,时间有限,希望中国越变越好,希望改革永不停止,还我们的是开放、包容的华夏民族。而不是现在圆滑的民族。

posted @ 2014-04-27 02:43 swp 阅读(299) | 评论 (1)编辑 收藏

仅列出标题
共10页: First 2 3 4 5 6 7 8 9 10