f(sixleaves) = sixleaves

重剑无锋 大巧不工

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

#

     摘要: 1.总结了继承的概念、作用、编程思想、使用注意、缺点。  阅读全文
posted @ 2015-04-30 16:01 swp 阅读(119) | 评论 (0)编辑 收藏

     摘要: 1.掌握继承的概念  阅读全文
posted @ 2015-04-30 15:59 swp 阅读(108) | 评论 (0)编辑 收藏

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 {
 5     int _age;
 6     @private
 7     int _fuck;
 8 }
 9 + (void)test;
10 + (void)test1;
11 - (void)test1;
12 - (void)test;
13 - (void)modify;
14 - (int)age;
15 @end
16 
17 @implementation Person
18 + (void)test
19 {
20     [self test1];
21 }
22 + (void)test1
23 {
24     NSLog(@"Called Class Method test1");
25 }
26 - (void)test1
27 {
28     NSLog(@"Called Instance Method test1");
29 }
30 - (void)test
31 {
32     [self test1];
33 }
34 
35 - (void)modify
36 {
37     self->_age = 10;
38     self->_fuck = 20;
39 }
40 
41 // error 编译阶段就会出错。
42 //+ (void)modify
43 //{
44 //    self->_age = 10;
45 //}
46 
47 - (int)age
48 {
49     return _age;
50 }
51 
52 - (int)fuck
53 {
54     return _fuck;
55 }
56 @end
57 
58 int main() {
59     
60     Person *p = [Person new];
61     [p test]; // 输出 Called Instance Method test1
62     [Person test]; // Called Class Method test1.由以上两句可知,self指向,其所在方法的调用对象(类也是个对象)。
63     [p modify];
64     
65     int a = p.age;
66     int f = p.fuck;
67     NSLog(@"a = %d,f = %d", a, f);
68     
69     //[Person modify]; //错误,因为self指向的是类对象,而类对象本身并不存在_age这个成员变量。
70     
71     
72     return 0;
73 }
74 
75 /*总结:
     self的作用:
76  1.self指针能在对象方法中访问对象的成员变量。(无论该成员变量的权限是private、protected、public都可以) 
      2.self指针能调用类方法或对象方法,具体看self指向类对象还是实例对象。
     self的编程思想:
      1.在方法中想调用其他方法时候。
      2.当成员变量与set方法的形参同名时候,如果不想改变成员变量名字。可以用self把成员变量和形参分开。

77  self的使用注意:.self指针指向的是调用当前方法的对象。(类也是对象,叫做类对象)
78  */
posted @ 2015-04-30 14:47 swp 阅读(142) | 评论 (0)编辑 收藏

 1 
 2 #import <Foundation/Foundation.h>
 3 
 4 @interface Person : NSObject
 5 
 6 @end
 7 
 8 
 9 @implementation Person
10 
11 @end
12 
13 @interface Person1 : NSObject
14 - (void)test;
15 @end
16 
17 
18 @implementation Person1
19 
20 @end
21 
22 @interface Person2 : NSObject
23 
24 @end
25 
26 
27 @implementation Person2
28 - (void)test
29 {
30     NSLog(@"哈哈哈哈哈哈哈");
31 }
32 @end
33 
34 
35 
36 int main()
37 {
38 
39     // Person *p = [Person new];
40     // [p test]; // 编译 warning: 'Person' may not respond to 'test'
41      //              // 链接 warning: 'Person' may not respond to 'test'
42     //           // 运行  unrecognized selector sent to instance 0x7fe619c0fd30
43     //           // 总结: 给对象发送不存在的消息,会导致程序异常退出。在移动终端上就是闪退
44 
45 
46 
47 
48     Person1 *p1 = [Person1 new];    
49     [p1 test];    // 编译链接不出错。运行时候出错。
50                 // 总结:OC是弱语法,在程序运行过程中,才会检查对象有没有实现相应的方法。
51 
52 
53     Person2 *p2 = [Person2 new];
54     [p2 test]; // 编译链接不出错。也能正常运行
55                // 总结:OC可以不写方法的声明。但是一般不会不写方法的声明。
56 
57     return 0;
58 
59 }
60 
posted @ 2015-04-30 14:43 swp 阅读(95) | 评论 (0)编辑 收藏

类方法的优点就是。你不用创建对象,就能通过类名引用,从而提高了程序的效率。
类方法的使用场景:当一个实例方法不会改变对象的成员变量,也就是对对象的状态无影响。则可以将其声明为类方法。
工具类:所有方法都是类方法,几乎不存在成员变量的类称为工具类。
 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Calc : NSObject
 4 
 5 + (int)sumWithNum1:(int)num1 andNum2:(int)num2;
 6 + (int)pingFang:(int)num;
 7 
 8 @end
 9 
10 
11 @implementation Calc
12 
13 + (int)sumWithNum1:(int)num1 andNum2:(int)num2
14 {
15     return num1 + num2;
16 }
17 
18 + (int)pingFang:(int)num
19 {
20     return num * num;
21 }
22 
23 @end
24 
25 int main() {
26 
27     int a = [Calc sumWithNum1:10 andNum2:20];
28     int b = [Calc pingFang: 20];
29     NSLog(@"\n10+20 = %d\n20*20 = %d", a,b);
30     return 0;
31 }
32 
33 //
34 /*总结
35  1.写一个方法的时候我们要先问自己这个方法会改变对象的成员变量么?如果不会最好将其声明为类方法。
36  
37  */
posted @ 2015-04-30 14:41 swp 阅读(136) | 评论 (0)编辑 收藏

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 + (void)test;
 5 - (void)test;
 6 @end
 7 
 8 @implementation Person
 9 + (void)test
10 {
11     NSLog(@"Class Method test");
12 }
13 - (void)test
14 {
15     NSLog(@"Instance Method test");
16 }
17 
18 - (void)fuck
19 {
20     NSLog(@"Instance Method fuck");
21 }
22 @end
23 
24 int main() {
25     
26     Person *p = [Person new];
27     //[p test];  unrecognized selector sent to instance 0x7f9c11c10600
28     [Person test];
29     
30     // [Person fuck];  unrecognized selector sent to class 0x10a1f71c0
31     [p fuck];
32     return 0;
33 }
34 
35 // 总结OC中类方法与对象方法的区别
36 /*
37  1.对象方法一减号开头。类方法以加号开头
38  2.对象方法只能有对象调用。类方法只能由类调用,否则运行时候程序会异常退出。
39  3.类方法不依赖于对象,所以其不能访问成员变量。
40  Tips:对象方法与类方法能同名存在。
41  */
posted @ 2015-04-29 23:55 swp 阅读(98) | 评论 (0)编辑 收藏

链表的思想很简单,要做到活用也不难。一般我是这样做得,从实际问题出发,先高度的概括符不符合链表的特点。能不能用链表简单解决。接着,就是编码。
链表编码要理清细节性思路,最好是简单的画下图,正如改题的链表,本质上是循环链表。last指向最后一个节点。其next指针一定指向头节点。我们把s[0]当做头节点。
 1 
 2 #include <cstdio>
 3 #include <cstring>
 4 const int maxn = 100000 + 5;
 5 int last, cur, next[maxn];
 6 char s[maxn];
 7 int main() {
 8     
 9     while ( scanf("%s", s + 1) == 1) {
10         
11         int n = strlen(s + 1);
12         last = cur = 0;
13         next[0] = 0; // 头结点初始化指向自身
14         
15         for (int i = 1; i <=n; i++) {
16             
17             char ch = s[i];
18             if ('[' == ch ) cur = 0;
19             else if (']' == ch) cur = last;
20             else {
21                 
22                 next[i] = next[cur];  // next[cur]为当前光标的前一个字符,而next[i]就是当前光标要输入的字符,接着,光标还要跳到下个字符。所以我们要把当前字符next指向光标输入的字符。也就是next[cur] = i;但要先保存其next指针给输入字符。其next指针其实就是真相头结点。
23                 next[cur] = i;
24                 if (cur == last) last = i;
25                 cur = i; // 指向下一个节点
26             }
27             
28         }
29         
30         for (int i = next[0];i != 0; i = next[i]) {
31             printf("%c", s[i]);
32         }
33         puts("");
34     }
35     
36     return 0;
37 }

2015/4/12上午12:10:12
posted @ 2015-04-12 00:10 swp 阅读(601) | 评论 (0)编辑 收藏

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <stack>
 5 
 6 using namespace std;
 7 
 8 struct Matrix {
 9     int r,c;
10     Matrix(int a = 0, int b = 0) : r(a), c(b) {};
11 }m[26];
12 
13 stack<Matrix> s;
14 
15 int main()
16 {
17     
18     int n;
19     cin >> n;
20     for (int i = 0; i < n; i++) {
21         string name;
22         cin >> name;
23         int k = name[0] - 'A';
24         cin >> m[k].r >> m[k].c;
25         
26     }
27     
28     string expr;
29     while (cin >> expr) {
30         
31         int len = expr.size(); // 获取字符串的大小,因为这整个字符串都没有空格
32         bool error = false;
33         int ans = 0;
34         for (int i = 0; i < len; i++) { // 循环整个表达式、思路是遇到右括号就出栈两个Matrix进行计算,算完在压回。
35             // 其实你可以发现带括号的表达式十分符合栈,而不仅仅是该题目,首先左括号越深
36             // 其计算的有先级别越高,而右括号又和左括号配对,如果我们从左到右读取一个表达式
37             // 每次一遇到右括号,其前面到左括号的部分肯定就是这个表达式最优先的部分。
38             if (isalpha(expr[i])) { s.push(m[expr[i] - 'A']); }
39             else if (')' == expr[i]) {
40                 Matrix m2 = s.top(); s.pop();
41                 Matrix m1 = s.top(); s.pop();
42                 if (m1.c != m2.r) { error = truebreak; }
43                 ans += m1.r * m1.c * m2.c;
44                 s.push(Matrix(m1.r, m2.c));
45             }
46             
47         }
48         
49         if (error) printf("error\n"); else printf("%d\n", ans);
50         
51     }
52     
53     return 0;
54 }
55 

2015/4/10下午6:32:37
By sixleaves
posted @ 2015-04-11 02:33 swp 阅读(87) | 评论 (0)编辑 收藏

     摘要: cocos2dx坐标系与笛卡尔坐标系简而言之,cocos2dx的2d中的坐标系与我们初中所学的笛卡尔坐标系一样。也就是向右为X正轴,向上为Y正轴。在屏幕中,其原点位于屏幕的左下方。屏幕坐标系屏幕坐标系的Y正轴是向下,X正轴不变。原点位于左上方。World Coordinate与Node LocalWorld Coordinate == > 世界坐标系、绝对坐标系Node Local == &...  阅读全文
posted @ 2015-04-06 01:53 swp 阅读(2946) | 评论 (0)编辑 收藏

inherent
cocos2dx调度器的类图路上所示,调度器继承自Ref类,该类实现了内存的自动管理机制。
我们先看一下官方文档的介绍,一下是引用官方文档,到-----线为止。

原理介绍

Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处:

  1. 每当Node不再可见或已从场景中移除时,调度器会停止。
  2. Cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
  3. Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。

基础用法

使用场景:游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞检测。为了解决以上问题,我们引入了调度器,这使得游戏能够更好的处理动态事件。Cocos2d-x提供了多种调度机制,在开发中我们通常会用到3种调度器:

  1. 默认调度器:schedulerUpdate()
  2. 自定义调度器:schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
  3. 单次调度器:scheduleOnce(SEL_SCHEDULE selector, float delay)

以下我们来对这3种调度器做简单的介绍。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的理解:
我们知道schedulerUpdate()也就是默认调度器的实现是基于update方法,该方法是虚方法定义在Node类中,在cocos2dx框架中。会在每次绘制一帧之前调用update方法,但是默认情况下,这个方法是不启用的。
也许你也有这个疑问,为什么update方法可以实现调度。可以实现游戏逻辑的判断。这就需要对游戏有一个认识,游戏都是由一帧一帧绘制而成,在一定范围内的不同时刻,对应的会是不同的游戏画面。回想一下,你学过的微积分
,如果我们把游戏的看成是微积分,那么这每一帧就是微分。所以帧率越高,游戏越逼真,越流程,体验度越高。我们也可以借助这一思想来理解,为什官方框架中会对update做出下面这句解释。
该调度器是使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。由于每帧之间时间间隔较短,所以每帧刷新一次已足够完成大部分游戏过程中需要的逻辑判断。绿色这句话是引用自官方,可能你会不理解
为什么说每帧之间间隔较短,所以每一帧刷新以此足够完成部分游戏逻辑的判断。
由官方文档我们知道一下代码的执行顺序,下面用伪代码表示
{
       1:
         update();执行update方法
         drawOneFrame();绘制一帧
        go 1;
}
由上面的伪代码我们知道其想表达的意思是说,由于帧率比较高,能模拟出更真实的效果。而update方法敲好是在两帧之间调用,所以update的执行时间一般来说是和帧率相互挂钩。
也就是说update里面的所有变量其实是无限趋近于drawOneFrame()的。所以我们可以再update中书写一些游戏逻辑。简而言之,在update里面可以做的事等效于给每一帧里面各个对象的做逻辑判断。


接下来分析下自定义调度器,先看官方文档解说。

自定义调度器(scheduler)

游戏开发中,在某些情况下我们可能不需要频繁的进行逻辑检测,这样可以提高游戏性能。所以Cocos2d-x还提供了自定义调度器,可以实现以一定的时间间隔连续调用某个函数。

由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1秒以上。

同样,取消该调度器可以用unschedule(SEL_SCHEDULE selector, float delay)。
我的理解:
其实读完这个解说你应该更清楚了我前面理论的正确性,如果你定义的间隔时间比两帧短,也就是说,将在同一帧类不断的重复回调selector指向的方法。但这是不需要的所以官方会说将
两帧内的多次调用会被合并成一次调用。
自定义时间应该在0.1秒以上,帧率就是10.也就是你定义的定时器的频率应该小于10,或者说间隔时间应该大于0.1。


当然cocos2dx框架还提供单次调度器具体看官方文档,这个就很好理解了,不解释和分析。
2015/4/6上午1:03:59

posted @ 2015-04-06 00:57 swp 阅读(2471) | 评论 (0)编辑 收藏

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