<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[Clear]]></title>
  <subtitle type="html"><![CDATA[创造机会的人是勇者；等待机会的人是愚者]]></subtitle>
  <id>http://www.cnrui.cn/blog/</id>
  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.cnrui.cn/blog/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2012-01-04T01:02:50+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[完整cocos2d实现scrollView]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=23" label="IOS经验" /> 
	  <updated>2012-01-04T01:02:50+08:00</updated>
	  <published>2012-01-04T01:02:50+08:00</published>
		  <summary type="html"><![CDATA[前面实现了一部分的scrollView，今天将这个类的功能完整实现。<br/>转帖请注明出处：<br/><a href="http://www.cnrui.cn/blog/article.asp?id=267" target="_blank" rel="external">http://www.cnrui.cn/blog/article.asp?id=267</a><br/><br/>#ScrollViewUtilty.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code13419);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code13419><br/>//<br/>//&nbsp;&nbsp;ScrollViewUtilty.h<br/>//&nbsp;&nbsp;Shop<br/>//<br/>//&nbsp;&nbsp;Cr&#101;ated by 胡 东平 on 12-1-1.<br/>//&nbsp;&nbsp;Copyright (c) 2012年 Magnetjoy. All rights reserved.<br/>//<br/><br/>#import &#34;Utilties.h&#34;<br/>/** 溢出隐藏节点<br/> */<br/>@interface OverflowNode : CCNode<br/>// 绘制前<br/>-(void)beforeDraw;<br/>// 绘制后<br/>-(void)afterDraw;<br/>@end<br/><br/>// 触摸方法<br/>typedef enum{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 先选中子项目<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollBeforeTouch,<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 后选中子项目<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollAfterTouch<br/>}fmScrollTouchFunc;<br/><br/>// 滚动方向<br/>typedef enum{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 从左到右滚动<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollOrientationLeftToRight,<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 从右到左滚动<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollOrientationRightToLeft,<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 从上到下滚动<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollOrientationTopToBottom,<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 从下到上滚动<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollOrientationBottomToTop<br/>}fmScrollOrientation;<br/>/**************************************************************/<br/>/** 滚动视图<br/> */<br/>@interface FMScrollView : OverflowNode&lt;CCTargetedTouchDelegate&gt;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 内部滚动栏<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCSprite* inner;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 包含项目<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCArray* items;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 视图大小<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGSize size;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 间隔<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat itemSpace;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 触摸起始点<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint startPoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint friction;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 摩擦阻力 默认0.03<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat resistance;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 惯性 默认20<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat inertia;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 前一次触摸纪录时间<br/>&nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval preTimestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 前一次触摸点纪录<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint prePoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 可视大小<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint viewPosit;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 触摸方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollTouchFunc touchFunc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 滚动方向<br/>&nbsp;&nbsp;&nbsp;&nbsp;fmScrollOrientation scrollOrientation;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 触摸范围<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGRect touchRect;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 开始的触摸点<br/>&nbsp;&nbsp;&nbsp;&nbsp;UITouch* beginTouch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 开始的事件<br/>&nbsp;&nbsp;&nbsp;&nbsp;UIEvent* beginEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 当前选中的节点<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCNode&lt;CCTargetedTouchDelegate&gt;* currentItem;<br/>}<br/>// 摩擦阻力 默认0.03<br/>@property(nonatomic)CGFloat resistance;<br/>// 惯性 默认20<br/>@property(nonatomic)CGFloat inertia;<br/><br/>// 使用视图大小初始化 默认先选中子项 左右滚动<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space;<br/>// 使用视图大小初始化 默认 左右滚动<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space touchFunc:(fmScrollTouchFunc)func;<br/>// 使用视图大小初始化 touchRect触摸范围<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space touchFunc:(fmScrollTouchFunc)func o&#114;ientation:(fmScrollOrientation)orientation touchRect:(CGRect)rect;<br/>// 使用视图大小初始化 touchRect触摸范围<br/>-(id)initWithViewSize:(CGSize)viewSize space:(CGFloat)space touchFunc:(fmScrollTouchFunc)func o&#114;ientation:(fmScrollOrientation)orientation touchRect:(CGRect)rect;<br/>// 添加一个项目节点<br/>-(void)addItemNode:(CCNode*)node;<br/>// 保存触摸开始信息<br/>-(void)saveTouchStartInfo:(UITouch *)touch withEvent:(UIEvent *)event;<br/>// 清楚触摸开始信息<br/>-(void)clearTouchStartInfo;<br/>// 等待子项触摸开始<br/>-(void)waitItemTouchBegin;<br/>// 通知触摸包含项目触摸事件开始<br/>-(BOOL)containsItemTouchBegin:(UITouch *)touch withEvent:(UIEvent *)event;<br/>@end<br/></div></div><br/><br/>#ScrollViewUtilty.m<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code5133);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code5133><br/>//<br/>//&nbsp;&nbsp;ScrollViewUtilty.m<br/>//&nbsp;&nbsp;Shop<br/>//<br/>//&nbsp;&nbsp;Cr&#101;ated by 胡 东平 on 12-1-1.<br/>//&nbsp;&nbsp;Copyright (c) 2012年 Magnetjoy. All rights reserved.<br/>//<br/><br/>#import &#34;ScrollViewUtilty.h&#34;<br/>/** 溢出隐藏节点<br/> */<br/>@implementation OverflowNode<br/>// 使用视图大小初始化<br/>-(id) init<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;self = [super init];<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (self) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return self;<br/>}<br/>- (void)dealloc <br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];<br/>}<br/>// 绘制前<br/>-(void)beforeDraw<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeTop[]&nbsp;&nbsp;&nbsp;&nbsp;= {0.0f, -1.0f, 0.0f, self.boundingBoxInPixels.size.height};<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeBottom[] = {0.0f, 1.0f, 0.0f, 0.0f};<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeLeft[]&nbsp;&nbsp; = {1.0f, 0.0f, 0.0f, 0.0f};<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeRight[]&nbsp;&nbsp;= {-1.0f, 0.0f, 0.0f, self.boundingBoxInPixels.size.width};<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE0, planeTop);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE1, planeBottom);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE2, planeLeft);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE3, planeRight);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE3);<br/>}<br/><br/>// 绘制后<br/>-(void)afterDraw<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE3);<br/>}<br/><br/>// 绘制<br/>-(void) visit<br/>{<br/>&#160;&#160;&#160;&#160;// quick return if not visible<br/>&#160;&#160;&#160;&#160;if (!visible_)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glPushMatrix();<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if ( grid_ &amp;&amp; grid_.active) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[grid_ beforeDraw];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self transformAncestors];<br/>&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;[self transform];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self beforeDraw];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;if(children_) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ccArray *arrayData = children_-&gt;data;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NSUInteger i = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// draw children zOrder &lt; 0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for( ; i &lt; arrayData-&gt;num; i++ ) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CCNode *child = arrayData-&gt;arr[i];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ( [child zOrder] &lt; 0 )<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[child visit];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// self draw<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self draw];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// draw children zOrder &gt;= 0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for( ; i &lt; arrayData-&gt;num; i++ ) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CCNode *child =&nbsp;&nbsp;arrayData-&gt;arr[i];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[child visit];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;} else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self draw];<br/>&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self afterDraw];<br/>&#160;&#160;&#160;&#160;if ( grid_ &amp;&amp; grid_.active)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[grid_ afterDraw:self];<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glPopMatrix();<br/>}<br/>@end<br/><br/>/**************************************************************/<br/>/** 滚动视图<br/> */<br/>@implementation FMScrollView<br/>// 摩擦阻力<br/>@synthesize resistance;<br/>// 惯性<br/>@synthesize inertia;<br/><br/>// 使用视图大小初始化 默认先选中子项 左右滚动<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return [self viewWithViewSize:viewSize space:space touchFunc:fmScrollBeforeTouch <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&#114;ientation:fmScrollOrientationLeftToRight touchRect:CGRectZero];<br/>}<br/><br/>// 使用视图大小初始化 默认 左右滚动<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space touchFunc:(fmScrollTouchFunc)func<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return [[[self alloc]initWithViewSize:viewSize space:space touchFunc:func <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&#114;ientation:fmScrollOrientationLeftToRight touchRect:CGRectZero] autorelease];<br/>}<br/><br/>// 使用视图大小初始化 touchRect触摸范围<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space touchFunc:(fmScrollTouchFunc)func <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o&#114;ientation:(fmScrollOrientation)orientation touchRect:(CGRect)rect<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return [[[self alloc]initWithViewSize:viewSize space:space touchFunc:func <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&#114;ientation:orientation touchRect:rect] autorelease];<br/>}<br/><br/>// 使用视图大小初始化 touchRect触摸范围<br/>-(id)initWithViewSize:(CGSize)viewSize space:(CGFloat)space touchFunc:(fmScrollTouchFunc)func <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&#114;ientation:(fmScrollOrientation)orientation touchRect:(CGRect)rect<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;self = [super init];<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (self) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 摩擦阻力<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resistance = 0.03;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 惯性<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inertia = 20;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size = viewSize;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemSpace = space;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touchFunc = func;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scrollOrientation = o&#114;ientation;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touchRect.origin = rect.origin;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touchRect.size.width = (rect.size.width == 0) ? size.width : rect.size.width;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touchRect.size.height = (rect.size.height == 0) ? size.height : rect.size.height;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self setContentSize:size];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inner = [[CCNode node]retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inner.position = touchRect.origin;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从右到左<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (scrollOrientation == fmScrollOrientationRightToLeft) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[inner setLeft:size.width];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从上到下<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(scrollOrientation == fmScrollOrientationTopToBottom){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[inner setTop:size.height];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self addChild:inner];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items = [[CCArray array]retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return self;<br/>}<br/>// 添加一个项目节点<br/>-(void)addItemNode:(CCNode*)node<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(scrollOrientation == fmScrollOrientationLeftToRight){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从左向右排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[node setLeft:inner.contentSize.width + itemSpace];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(scrollOrientation == fmScrollOrientationRightToLeft){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从右向左排列 最后一个插入的应该在最左面 前面的对象都要向右排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGFloat left = node.contentSize.width + itemSpace;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = items.count - 1; i &gt; -1; i--) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCNode* item = [items objectAtIndex:i];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[item setLeft:item.position.x + left];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[inner setLeft:inner.position.x - left];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (scrollOrientation == fmScrollOrientationBottomToTop) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从下到上排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[node setTop:inner.contentSize.height + itemSpace];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(scrollOrientation == fmScrollOrientationTopToBottom){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从上到下排列 最后一个插入的应该在最下面 前面的对象都要向上排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGFloat top = node.contentSize.height + itemSpace;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = items.count - 1; i &gt; -1; i--) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCNode* item = [items objectAtIndex:i];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[item setTop:item.position.y + top];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[inner setTop:inner.position.y - top];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;[items addObject:node];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[inner addChild:node];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[inner setContentSizeWithChilds];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 设置可视区域<br/>&nbsp;&nbsp;&nbsp;&nbsp;viewPosit.x = inner.contentSize.width - touchRect.size.width + touchRect.origin.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;viewPosit.y = inner.contentSize.height - touchRect.size.height + touchRect.origin.y;<br/>}<br/><br/>- (void) onEnter<br/>{&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:INT_MAX swallowsTouches:YES];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super onEnter];&nbsp;&nbsp;<br/>}&nbsp;&nbsp;<br/>- (void) onExit<br/>{&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[[CCTouchDispatcher sharedDispatcher] removeDelegate: self];&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super onExit];&nbsp;&nbsp;<br/>} <br/><br/>- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(![self containsTouchLocation:touch touchRect:touchRect])return NO;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self stopAllActions];<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;friction.x = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;friction.y = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;prePoint = startPoint = [touch locationInView:[touch view]];<br/>&nbsp;&nbsp;&nbsp;&nbsp;preTimestamp = touch.timestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 设置定时器，如果用户在包含的某一项停留超过1秒，将触发该项的触摸行为，进而阻止滚动栏移动<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self saveTouchStartInfo:touch withEvent:event];<br/>&nbsp;&nbsp;&nbsp;&nbsp;return YES;<br/>}<br/><br/>- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (currentItem != nil) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 先选中子项<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (touchFunc == fmScrollBeforeTouch) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 触摸发生移动行为，取消子项的触摸<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if([currentItem respondsToSel&#101;ctor:@sel&#101;ctor(ccTouchCancelled:withEvent:)])<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[currentItem ccTouchCancelled:touch withEvent:event];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self clearTouchStartInfo];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(touchFunc == fmScrollAfterTouch){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 转发触摸事件给选中项<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if([currentItem respondsToSel&#101;ctor:@sel&#101;ctor(ccTouchMoved:withEvent:)])<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[currentItem ccTouchMoved:touch withEvent:event];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取消对子项的选择<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self unschedule:@sel&#101;ctor(waitItemTouchBegin)];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint touchPoint = [touch locationInView:[touch view]]; <br/>&nbsp;&nbsp;&nbsp;&nbsp;prePoint = startPoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;preTimestamp = touch.timestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 当前位置<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint endPoint = inner.position;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 距离差距<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint dfPoint = ccp(touchPoint.x - startPoint.x, touchPoint.y - startPoint.y);<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 需要移动到的结束坐标<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint targetPoint = ccp(endPoint.x + dfPoint.x, endPoint.y + dfPoint.y);<br/>&nbsp;&nbsp;&nbsp;&nbsp;startPoint = touchPoint;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(scrollOrientation == fmScrollOrientationLeftToRight){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从左向右排列 移动时超出边界增加莫摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.x &gt; touchRect.origin.x || targetPoint.x &lt; -viewPosit.x) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction.x = MAX(0, friction.x - resistance);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfPoint.x = dfPoint.x * friction.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x += dfPoint.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(scrollOrientation == fmScrollOrientationRightToLeft){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从右向左排列 最后一个插入的应该在最左面 前面的对象都要向右排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.x &gt; MAX(touchRect.origin.x, -viewPosit.x) || targetPoint.x &lt; -viewPosit.x) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction.x = MAX(0, friction.x - resistance);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfPoint.x = dfPoint.x * friction.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x += dfPoint.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (scrollOrientation == fmScrollOrientationBottomToTop) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从下到上排列 移动时超出边界增加莫摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.y &gt; touchRect.origin.y || targetPoint.y &lt; -viewPosit.y) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction.y = MAX(0, friction.y - resistance);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfPoint.y = dfPoint.y * friction.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y -= dfPoint.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(scrollOrientation == fmScrollOrientationTopToBottom){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从上到下排列 最后一个插入的应该在最下面 前面的对象都要向上排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.y &gt; MAX(touchRect.origin.y, -viewPosit.y) || targetPoint.y &lt; -viewPosit.y) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction.y = MAX(0, friction.y - resistance);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfPoint.y = dfPoint.y * friction.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y -= dfPoint.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;inner.position = endPoint;<br/>}<br/><br/>- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 转发触摸事件给选中项<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (currentItem != nil) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if([currentItem respondsToSel&#101;ctor:@sel&#101;ctor(ccTouchEnded:withEvent:)])<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[currentItem ccTouchEnded:touch withEvent:event];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self clearTouchStartInfo];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取消对子项的选择<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self unschedule:@sel&#101;ctor(waitItemTouchBegin)];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint touchPoint = [touch locationInView:[touch view]]; <br/>&nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval timedef = touch.timestamp - preTimestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 当前位置<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint endPoint = inner.position;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 距离差距<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint dfPoint = ccp(touchPoint.x - prePoint.x, touchPoint.y - prePoint.y);<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 需要移动到的结束坐标<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint targetPoint = ccp(endPoint.x + (dfPoint.x / (timedef * inertia)), endPoint.y - (dfPoint.y / (timedef * inertia)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(scrollOrientation == fmScrollOrientationLeftToRight){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从左向右排列 移动时超出边界增加莫摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x = targetPoint.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.x &gt; touchRect.origin.x) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x = touchRect.origin.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(endPoint.x &lt; MIN(touchRect.origin.x, -viewPosit.x)){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x = MIN(touchRect.origin.x, -viewPosit.x);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(scrollOrientation == fmScrollOrientationRightToLeft){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从右向左排列 最后一个插入的应该在最左面 前面的对象都要向右排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x = targetPoint.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.x &lt; -viewPosit.x) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x = -viewPosit.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if (targetPoint.x &gt; MAX(touchRect.origin.x, -viewPosit.x)) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.x = MAX(touchRect.origin.x, -viewPosit.x);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (scrollOrientation == fmScrollOrientationBottomToTop) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从下到上排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y = targetPoint.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.y &gt; touchRect.origin.y) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y = touchRect.origin.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(endPoint.y &lt; MIN(touchRect.origin.y, -viewPosit.y)){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y = MIN(touchRect.origin.y, -viewPosit.y);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(scrollOrientation == fmScrollOrientationTopToBottom){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从上到下排列 最后一个插入的应该在最下面 前面的对象都要向上排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y = targetPoint.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (targetPoint.y &lt; -viewPosit.y) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y = -viewPosit.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if (targetPoint.y &gt; MAX(touchRect.origin.y, -viewPosit.y)) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoint.y = MAX(touchRect.origin.y, -viewPosit.y);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (endPoint.x != inner.position.x || endPoint.y != inner.position.y) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCActionEase * action = [CCEaseElasticOut actionWithAction:[CCMoveTo actionWithDuration:1 position:endPoint] period:1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[inner runAction: action];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>// 保存触摸开始信息<br/>-(void)saveTouchStartInfo:(UITouch *)touch withEvent:(UIEvent *)event<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 先选中子项<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (touchFunc == fmScrollBeforeTouch) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 查找是否选中某个实现触摸协议的子项<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self containsItemTouchBegin:touch withEvent:event];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(touchFunc == fmScrollAfterTouch){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beginTouch = [touch retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beginEvent = [event retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self schedule:@sel&#101;ctor(waitItemTouchBegin) interval:1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>// 清除触摸开始信息<br/>-(void)clearTouchStartInfo<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[beginTouch release]; beginTouch= nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[beginEvent release]; beginEvent = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[currentItem release]; currentItem = nil;<br/>}<br/><br/>// 等待子项触摸开始<br/>-(void)waitItemTouchBegin<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self unschedule:@sel&#101;ctor(waitItemTouchBegin)];<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 查找是否选中某个实现触摸协议的子项<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self containsItemTouchBegin:beginTouch withEvent:beginEvent];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[beginTouch release]; beginTouch= nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[beginEvent release]; beginEvent = nil;<br/>}<br/><br/>// 通知触摸包含项目触摸事件开始<br/>-(BOOL)containsItemTouchBegin:(UITouch *)touch withEvent:(UIEvent *)event<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (id item in items) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ([item conformsToProtocol:@protocol(CCTargetedTouchDelegate)]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; [item containsTouchLocation:touch]) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentItem = [item retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[currentItem ccTouchBegan:touch withEvent:event];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return YES;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return NO;<br/>}<br/><br/>- (void)dealloc <br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[inner release]; inner = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[items release]; items = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[currentItem release]; currentItem = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[beginTouch release]; beginTouch= nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[beginEvent release]; beginEvent = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];<br/>}<br/>@end<br/></div></div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=267" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=267</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[cocos2d实现保持四个角进行图片拉伸]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=23" label="IOS经验" /> 
	  <updated>2012-01-01T22:55:40+08:00</updated>
	  <published>2012-01-01T22:55:40+08:00</published>
		  <summary type="html"><![CDATA[在cocos touch里面UIImage有一个实用方法stretchableImageWithLeftCapWidth:topCapHeight，可以对图片进行保持四个角拉伸。<br/><br/>而在cocos2d里面却没有有效地办法实现对sprite的拉伸，于是还是程序猿的本性，一切都要在一个体系下面，尽量不要混合多个不同的系统，自己实现吧。<br/><br/>如果大家有不清楚的地方请站内回复，同时希望转帖的朋友注明出处：<a href="http://www.cnrui.cn/blog/article.asp?id=266" target="_blank" rel="external">http://www.cnrui.cn/blog/article.asp?id=266</a><br/><br/>Sprite扩展方法<br/>＃SpriteUtilty.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code45778);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code45778><br/>/** 精灵帮助类<br/> */<br/>@interface CCSprite(SpriteUtilty)<br/>// 使用BatchNode初始化<br/>+(id) spriteWithBatchNode:(CCSpriteBatchNode*)batchNode rect:(CGRect)rect rotated:(BOOL)rotated;<br/><br/>// 使用BatchNode初始化<br/>-(id) initWithBatchNode:(CCSpriteBatchNode*)batchNode rect:(CGRect)rect rotated:(BOOL)rotated;<br/><br/>// 重新设置选区大小<br/>-(void)setTextureRect:(CGRect)rect rotated:(BOOL)rotated;<br/>@end<br/></div></div><br/><br/>＃SpriteUtilty.m<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code34029);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code34029><br/>//<br/>//&nbsp;&nbsp;SpriteUtilty.m<br/>//&nbsp;&nbsp;Shop<br/>//<br/>//&nbsp;&nbsp;Cr&#101;ated by 胡 东平 on 11-12-24.<br/>//&nbsp;&nbsp;Copyright (c) 2011年 Magnetjoy. All rights reserved.<br/>//<br/><br/>#import &#34;SpriteUtilty.h&#34;<br/>@implementation CCSprite(SpriteUtilty)<br/>// 使用BatchNode初始化<br/>+(id) spriteWithBatchNode:(CCSpriteBatchNode*)batchNode rect:(CGRect)rect rotated:(BOOL)rotated<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return [[self alloc]initWithBatchNode:batchNode rect:rect rotated:rotated];<br/>}<br/><br/>// 使用BatchNode初始化<br/>-(id) initWithBatchNode:(CCSpriteBatchNode*)batchNode rect:(CGRect)rect rotated:(BOOL)rotated<br/>{<br/>&#160;&#160;&#160;&#160;id ret = [self initWithTexture:batchNode.texture];<br/>&#160;&#160;&#160;&#160;[self setTextureRect:rect rotated:rotated];<br/>&#160;&#160;&#160;&#160;[self useBatchNode:batchNode];<br/>&#160;&#160;&#160;&#160;return ret;<br/>}<br/><br/>// 重新设置选区大小<br/>-(void)setTextureRect:(CGRect)rect rotated:(BOOL)rotated<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGRect rectInPixels = CC_RECT_POINTS_TO_PIXELS( rect );<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self setTextureRectInPixels:rectInPixels rotated:rotated untrimmedSize:rectInPixels.size];<br/>}<br/>@end<br/></div></div><br/><br/>关键代码来了。<br/>#StretchNode.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code69277);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code69277><br/>/** 可4个角拉伸<br/> */<br/>@interface StretchNode : CCSpriteBatchNode {<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 原始帧<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCSpriteFrame* frame;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 切分<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCArray* caps;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 角地宽高<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGSize angle;<br/>}<br/>// 使用帧名初始化<br/>+(StretchNode*)nodeWithFrameName:(NSString*)frameName;<br/>// 使用帧名初始化<br/>-(id)initWithFrameName:(NSString*)frameName;<br/>// 分割9个角<br/>-(void)spliteToCaps;<br/>@end<br/></div></div><br/><br/>＃StretchNode.m<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code63532);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code63532><br/>#import &#34;StretchNode.h&#34;<br/>/** 可4个角拉伸<br/> */<br/>@implementation StretchNode<br/>// 使用帧名初始化<br/>+(StretchNode*)nodeWithFrameName:(NSString*)frameName<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return [[[self alloc]initWithFrameName:frameName]autorelease];<br/>}<br/>// 使用帧名初始化<br/>-(id)initWithFrameName:(NSString*)frameName<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;frame = [[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:frameName]retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;self = [super initWithTexture:frame.texture capacity:29];<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (self) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self setDefaultPositAnchor];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;caps = [[CCArray arrayWithCapacity:9] retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle.width = roundf(frame.rect.size.width * 0.25);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle.height = roundf(frame.rect.size.height * 0.25);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CCLOG(@&#34;--------------&gt;x:%f&nbsp;&nbsp;y:%f&nbsp;&nbsp;width:%f&nbsp;&nbsp; height:%f&#34;, frame.rect.origin.x, frame.rect.origin.y, frame.rect.size.width, frame.rect.size.height);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self spliteToCaps];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return self;<br/>}<br/>// 分割9个角<br/>- (void)spliteToCaps<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;NSAssert(caps.count == 0, @&#34;The caps already to splited!&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self removeAllChildrenWithCleanup:YES];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 图片坐标系为左上<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 3; i++) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; 3; j++) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGRect rect;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i == 1) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.size.height = frame.rect.size.height - angle.height * 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.origin.y = frame.rect.origin.y + angle.height;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.size.height = angle.height;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i == 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.origin.y = frame.rect.origin.y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.origin.y = frame.rect.origin.y + frame.rect.size.height - angle.height;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (j == 1) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.size.width = frame.rect.size.width - angle.width * 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.origin.x = frame.rect.origin.x + angle.width;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.size.width = angle.width;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(j == 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.origin.x = frame.rect.origin.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect.origin.x = frame.rect.origin.x + frame.rect.size.width - angle.width;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCSprite* cap = [CCSprite spriteWithBatchNode:self rect:rect rotated:frame.rotated];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setDefaultPositAnchor];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[caps addObject:cap];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self addChild:cap];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self setContentSize:frame.rect.size];<br/>}<br/><br/>-(void) setContentSize:(CGSize)size<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat mw = MAX(0, size.width - angle.width * 2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat mh = MAX(0, size.height - angle.height * 2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super setContentSize:CGSizeMake(mw + angle.width * 2, mh + angle.height * 2)];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (CCSprite* cap in caps) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i == 0) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 上左<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setTop:angle.height + mh];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 1){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 上中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setLeft:angle.width top:angle.height + mh];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setWidth:mw];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 2){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 上右<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setLeft:angle.width + mw top:angle.height + mh];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 3){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 中左<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setTop:angle.height];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setHeight:mh];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 4){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 中中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setLeft:angle.width top:angle.height];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setWidth:mw];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setHeight:mh];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 5){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 中右<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setLeft:mw + angle.width top:angle.height];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setHeight:mh];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 6){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 下左<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 7){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 下中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setLeft:angle.width];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setWidth:mw];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if(i == 8){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 下右<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[cap setLeft:mw + angle.width];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>- (void)dealloc<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[frame release]; frame = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[caps release]; caps = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];<br/>}<br/>@end<br/></div></div><br/><br/>最后实用方法：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code7325);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code7325><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchNode* anode = [StretchNode nodeWithFrameName:@&#34;ConfirmOrderPanel.png&#34;];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[anode setContentSize:CGSizeMake(100, 200)];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[anode setLeft:winSize.width * 0.5 + 10];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self addChild:anode];<br/></div></div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=266" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=266</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[cocos2d实现ScrollView]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=23" label="IOS经验" /> 
	  <updated>2012-01-01T15:48:01+08:00</updated>
	  <published>2012-01-01T15:48:01+08:00</published>
		  <summary type="html"><![CDATA[最近使用cocos2d开发一款社交类型的游戏，经过程序猿们必经的痛苦熟悉之路后，终于获得了一门新的技能。<br/><br/>在cocoa touch里面是有一个UIScrollView，因为使用的cocos2d，假如要集成系统组件的需要修改cocos2d不少位置，同时还出现了一些不必要的麻烦，于是本着程序猿精神自己实现了一个。<br/><br/>PS：cocosd官网上那个ccScrollView最好别用，也是有一堆的限制和麻烦，而我们需要的是在cocos2d统一策略下的ScrollView，避免因为直接使用系统的UIView造成不必要的兼容考虑。<br/><br/>下面直接给出代码，如果大家有不清楚的地方请站内回复，同时希望转帖的朋友注明出处：<a href="http://www.cnrui.cn/blog/article.asp?id=265" target="_blank" rel="external">http://www.cnrui.cn/blog/article.asp?id=265</a><br/><br/>完整版请访问这里：<a href="http://www.cnrui.cn/blog/article.asp?id=267" target="_blank" rel="external">http://www.cnrui.cn/blog/article.asp?id=267</a><br/><br/>建立一个水平移动的协议，因为目前只需要水平滚动，所以只写了这么多，如果有需要垂直或者多向滚动的请自己实现。<br/><br/><br/><br/>#Protocols.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code50625);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code50625><br/>/** 水平移动协议<br/> */<br/>@protocol FMParallaxToXProtocol &lt;NSObject&gt;<br/>// 当前X坐标<br/>@property (nonatomic, readonly) CGFloat currentX;<br/>// 移动到<br/>-(void) currentXTo:(CGFloat)x;<br/>@end<br/></div></div><br/><br/>自定义一个Action,坐滚动缓冲动画<br/>#FMParallaxToX.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code51693);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code51693><br/>#import &#34;Protocols.h&#34;<br/>/** 无限背景滚动<br/> */<br/>@interface FMParallaxToX : CCActionInterval &lt;NSCopying&gt;<br/>{<br/>&#160;&#160;&#160;&#160;CGFloat endPositionX_;<br/>&#160;&#160;&#160;&#160;CGFloat startPositionX_;<br/>&#160;&#160;&#160;&#160;CGFloat delta_;<br/>}<br/>/** cr&#101;ates the action */<br/>+(id) actionWithDuration:(ccTime)duration positionX:(CGFloat)x;<br/>/** initializes the action */<br/>-(id) initWithDuration:(ccTime)duration positionX:(CGFloat)x;<br/>@end<br/></div></div><br/><br/>#FMParallaxToX.m<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code48488);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code48488><br/>#import &#34;FMParallaxToX.h&#34;<br/>/** 无限背景滚动<br/> */<br/>@implementation FMParallaxToX<br/>/** cr&#101;ates the action */<br/>+(id) actionWithDuration:(ccTime)t positionX:(CGFloat)x<br/>{&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;return [[[self alloc] initWithDuration:t positionX:x ] autorelease];<br/>}<br/>/** initializes the action */<br/>-(id) initWithDuration:(ccTime)t positionX:(CGFloat)x<br/>{<br/>&#160;&#160;&#160;&#160;if( (self=[super initWithDuration: t]) )<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;endPositionX_ = x;<br/>&#160;&#160;&#160;&#160;return self;<br/>}<br/><br/>-(id) copyWithZone: (NSZone*) zone<br/>{<br/>&#160;&#160;&#160;&#160;CCAction *copy = [[[self class] allocWithZone: zone] initWithDuration: [self duration] positionX: endPositionX_];<br/>&#160;&#160;&#160;&#160;return copy;<br/>}<br/><br/>-(void) startWithTarget:(CCNode *)aTarget<br/>{<br/>&#160;&#160;&#160;&#160;[super startWithTarget:aTarget];<br/>&#160;&#160;&#160;&#160;startPositionX_ = [(id&lt;FMParallaxToXProtocol&gt;)target_ currentX];<br/>&#160;&#160;&#160;&#160;delta_ = endPositionX_ - startPositionX_;<br/>}<br/><br/>-(void) up&#100;ate: (ccTime) t<br/>{&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;[(id&lt;FMParallaxToXProtocol&gt;)target_ currentXTo:startPositionX_ + delta_ * t];<br/>}<br/>@end<br/></div></div><br/><br/>关键的东西来了<br/>#ScrollViewUtilty.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code58102);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code58102><br/>//<br/>//&nbsp;&nbsp;ScrollViewUtilty.h<br/>//&nbsp;&nbsp;Shop<br/>//<br/>//&nbsp;&nbsp;Cr&#101;ated by 胡 东平 on 12-1-1.<br/>//&nbsp;&nbsp;Copyright (c) 2012年 Magnetjoy. All rights reserved.<br/>//<br/><br/>#import &#34;FMParallaxToX.h&#34;<br/>/** 溢出隐藏节点<br/> */<br/>@interface OverflowNode : CCNode<br/>// 绘制前<br/>-(void)beforeDraw;<br/>// 绘制后<br/>-(void)afterDraw;<br/>@end<br/><br/><br/>/**************************************************************/<br/>/** 滚动视图<br/> */<br/>@interface FMScrollView : OverflowNode&lt;CCTargetedTouchDelegate, FMParallaxToXProtocol&gt;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 内部滚动栏<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCSprite* inner;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 包含项目<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCArray* items;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 视图大小<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGSize size;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 间隔<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat itemSpace;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 触摸起始点<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint startPoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 当前X坐标<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat currentX;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat friction;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 前一次触摸纪录时间<br/>&nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval preTimestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 前一次触摸点纪录<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint prePoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 最大相对左边距离<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat maxX;<br/>}<br/>// 当前X坐标<br/>@property (nonatomic, readonly) CGFloat currentX;<br/>// 使用视图大小初始化<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space;<br/>// 使用视图大小初始化<br/>-(id)initWithViewSize:(CGSize)viewSize space:(CGFloat)space;<br/>// 添加一个项目节点<br/>-(void)addItemNode:(CCNode*)node;<br/>// 增量移动<br/>-(void)currentXBy:(CGFloat)dfx;<br/>@end<br/></div></div><br/><br/>ScrollViewUtilty.h<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code29262);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code29262><br/>//<br/>//&nbsp;&nbsp;ScrollViewUtilty.m<br/>//&nbsp;&nbsp;Shop<br/>//<br/>//&nbsp;&nbsp;Cr&#101;ated by 胡 东平 on 12-1-1.<br/>//&nbsp;&nbsp;Copyright (c) 2012年 Magnetjoy. All rights reserved.<br/>//<br/><br/>#import &#34;ScrollViewUtilty.h&#34;<br/>/** 溢出隐藏节点<br/> */<br/>@implementation OverflowNode<br/>// 使用视图大小初始化<br/>-(id) init<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;self = [super init];<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (self) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return self;<br/>}<br/>- (void)dealloc <br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];<br/>}<br/>// 绘制前<br/>-(void)beforeDraw<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeTop[]&nbsp;&nbsp;&nbsp;&nbsp;= {0.0f, -1.0f, 0.0f, self.boundingBoxInPixels.size.height};<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeBottom[] = {0.0f, 1.0f, 0.0f, 0.0f};<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeLeft[]&nbsp;&nbsp; = {1.0f, 0.0f, 0.0f, 0.0f};<br/>&nbsp;&nbsp;&nbsp;&nbsp;GLfloat planeRight[]&nbsp;&nbsp;= {-1.0f, 0.0f, 0.0f, self.boundingBoxInPixels.size.width};<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE0, planeTop);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE1, planeBottom);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE2, planeLeft);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glClipPlanef(GL_CLIP_PLANE3, planeRight);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_CLIP_PLANE3);<br/>}<br/><br/>// 绘制后<br/>-(void)afterDraw<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_CLIP_PLANE3);<br/>}<br/><br/>// 绘制<br/>-(void) visit<br/>{<br/>&#160;&#160;&#160;&#160;// quick return if not visible<br/>&#160;&#160;&#160;&#160;if (!visible_)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glPushMatrix();<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if ( grid_ &amp;&amp; grid_.active) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[grid_ beforeDraw];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self transformAncestors];<br/>&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;[self transform];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self beforeDraw];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;if(children_) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ccArray *arrayData = children_-&gt;data;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NSUInteger i = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// draw children zOrder &lt; 0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for( ; i &lt; arrayData-&gt;num; i++ ) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CCNode *child = arrayData-&gt;arr[i];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ( [child zOrder] &lt; 0 )<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[child visit];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// self draw<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self draw];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// draw children zOrder &gt;= 0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for( ; i &lt; arrayData-&gt;num; i++ ) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CCNode *child =&nbsp;&nbsp;arrayData-&gt;arr[i];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[child visit];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;} else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self draw];<br/>&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self afterDraw];<br/>&#160;&#160;&#160;&#160;if ( grid_ &amp;&amp; grid_.active)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[grid_ afterDraw:self];<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glPopMatrix();<br/>}<br/>@end<br/><br/>/**************************************************************/<br/>/** 滚动视图<br/> */<br/>@implementation FMScrollView<br/>// 当前X坐标<br/>@synthesize currentX;<br/>// 使用视图大小初始化<br/>+(FMScrollView*)viewWithViewSize:(CGSize)viewSize space:(CGFloat)space<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;return [[[self alloc]initWithViewSize:viewSize space:space] autorelease];<br/>}<br/><br/>// 使用视图大小初始化<br/>-(id)initWithViewSize:(CGSize)viewSize space:(CGFloat)space<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;self = [super init];<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (self) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size = viewSize;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemSpace = space;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self setContentSize:size];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inner = [[CCNode node]retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self addChild:inner];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items = [[CCArray array]retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return self;<br/>}<br/>// 添加一个项目节点<br/>-(void)addItemNode:(CCNode*)node<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat lastLeft = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(items.count &gt; 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCNode* last = items.count &gt; 0 ? items.lastObject : nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastLeft = last.contentSize.width + last.position.x + itemSpace;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[node setLeft:lastLeft top:size.height - node.contentSize.height];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[items addObject:node];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[inner addChild:node];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[inner setContentSizeWithChilds];<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;maxX = MIN(0, -(inner.contentSize.width - self.contentSize.width));<br/>}<br/><br/>- (void) onEnter&nbsp;&nbsp;<br/>{&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:INT_MAX swallowsTouches:NO];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super onEnter];&nbsp;&nbsp;<br/>}&nbsp;&nbsp;<br/>- (void) onExit&nbsp;&nbsp;<br/>{&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[[CCTouchDispatcher sharedDispatcher] removeDelegate: self];&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super onExit];&nbsp;&nbsp;<br/>} <br/><br/>- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event&nbsp;&nbsp;<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(![self containsTouchLocation:touch])return NO;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self stopAllActions];<br/>&nbsp;&nbsp;&nbsp;&nbsp;prePoint = startPoint = [touch locationInView:[touch view]];<br/>&nbsp;&nbsp;&nbsp;&nbsp;preTimestamp = touch.timestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return YES;&nbsp;&nbsp;<br/>}<br/><br/>- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event<br/>{&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint touchPoint = [touch locationInView:[touch view]]; <br/>&nbsp;&nbsp;&nbsp;&nbsp;prePoint = startPoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;preTimestamp = touch.timestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat dfx = touchPoint.x - startPoint.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;startPoint = touchPoint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat total = currentX + dfx;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 移动时超出边界增加莫摩擦系数<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(total &gt; 0 || total &lt; maxX){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction -= 0.03;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (friction &lt;= 0) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfx = dfx * friction;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friction = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self currentXBy:dfx];<br/>}<br/><br/>- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGPoint touchPoint = [touch locationInView:[touch view]]; <br/>&nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval timedef = touch.timestamp - preTimestamp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat xdef = touchPoint.x - prePoint.x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(xdef == 0)return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat end = currentX;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 缓冲数<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat between = xdef / (timedef * 20);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end += between;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;friction = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(end &gt; 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}else if(end &lt; maxX){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end = maxX;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;CCActionEase * action = [CCEaseElasticOut actionWithAction:[FMParallaxToX actionWithDuration:1 positionX:end] period:1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self runAction: action];<br/>}<br/><br/>// 移动到<br/>-(void) currentXTo:(CGFloat)x<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CGFloat dfx = x - currentX;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[self currentXBy: dfx];<br/>}<br/><br/>// 增量移动<br/>-(void) currentXBy:(CGFloat)dfx<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;currentX = currentX + dfx;<br/>&nbsp;&nbsp;&nbsp;&nbsp;inner.position = ccp(currentX, inner.position.y);<br/>}<br/><br/><br/>- (void)dealloc <br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;[inner release]; inner = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[items release]; items = nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];<br/>}<br/>@end<br/></div></div><br/><br/>使用方法：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code15781);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.cnrui.cn/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code15781><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topHeight = top;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGSize winSize = [[CCDirector sharedDirector]winSize];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCSprite* ss = [CCSprite spriteWithSpriteFrameName:@&#34;FriendBoxBG.png&#34;];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCSprite* ss1 = [CCSprite spriteWithSpriteFrameName:@&#34;FriendBoxBG.png&#34;];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCSprite* ss2 = [CCSprite spriteWithSpriteFrameName:@&#34;FriendBoxBG.png&#34;];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node = [[FMScrollView viewWithViewSize:CGSizeMake(winSize.width * 0.5, top - 8) space:fmScale(20)]retain];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[node setLeft:10 top:4];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[node addItemNode:ss];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[node addItemNode:ss1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[node addItemNode:ss2];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self addChild:node];<br/></div></div><br/><br/>里面有些自定义的方法比如setLeft，请自行更换为如：node.position = ccp(10,4);<br/><br/>目前没有提供的：<br/>如果你的手指放在某一个项上面等一会，就会激活这个项的touchStart事件，否则手指移动时滚动栏就跟着左右移动了。<br/><br/>Enjoy!]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=265" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=265</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[信息时代的闭关锁国]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=5" label="风格思想" /> 
	  <updated>2011-10-09T12:06:40+08:00</updated>
	  <published>2011-10-09T12:06:40+08:00</published>
		  <summary type="html"><![CDATA[300年前康乾盛世后，乾隆晚期，开始封锁海外贸易，实行闭关锁国政策。南京条约的签订，让中国开始觉醒，突然发现天朝落后了对手不知道几个级别，于是奋勇追赶，经历了100多年的努力，终于又回到了世界领先行列。<br/><br/>今天这个大时代，是信息化迅速发展的时代，随着全球文化的融合，一个崭新的世界文化开始呈现。可是因为我们的天朝民族，因为一直在经济上追赶列强，而人文这块明显滞后，显然跟不上世界发展的节奏。而现代那些新的人文思想显然一下子我们消化不了，于是产生了消化不良的副作用。产生了一大批对知识了解不充分的社会人物，这些人的言论和行为显然让天朝的情何以堪。而且这些人还管不住自己的嘴巴，利用自己的社会声望产生了一波又一波的负面效应。<br/><br/>看看现在最流行的新浪微博吧，里面那些人我总结了一下，正面的形容是这些人很有想法，敢于说出自己的猜测。负面的形容，是这些人为了博得社会声誉，胡乱臆想，形成了一种社会阴谋论。<br/><br/>当然，他们的行为也有积极的一面，形成了一种社会舆论压力，让有关部门积极修正和落实政策。但是任何事物都得有一个度，过了那条线就会产生意想不到的影响。这就是前面说的，对知识了解的不充分导致消化不良。<br/><br/>思想开放固然是好事，学习国外先进思想也是好事，但是不能形而上学。中国古典文化中的武学就有说过，一个练武之人外修型，内修功，相互间要匹配。否则如同武侠小说中写的拥有了浑厚不匹配的内力，自己本身资质有限，无法驾驭内力，那么就适得其反，走火入魔了。<br/><br/>为了减缓文化思想发展与社会现实脱节，于是我们天朝也展开了行动，伟大的国家局域网正在逐步建成。信息言论的监管在网监部门的出现后，开始逐步加强。国外的不雅言论在我们这升级为敏感字，于是大家发现很多信息发不出了，有用的信息给一刀切找不到了。<br/><br/>这意味着什么？会带来何种涟漪效应，现在已经开始逐步显现，愤青越来越多，监管越来越严，能了解的信息越来越少，如此恶性循环下去，未来会因为这种一刀切的管理方式，我们将开始再次变得愚昧无知，越是愚昧越是管不住那张嘴，于是在信息时代我们再次迎来了闭关锁国。<br/><br/>我们需要从根本来解决这个问题，要从教育入手。我是强烈谴责那些所谓的教授站着茅坑不拉屎的行为，就是这些人影响了中国的一代人。这些教授可能对于书本知识的了解无与伦比，但是对于社会进步的文化思想却置若惘闻。显然我们的政府已经开始关注这个问题，在政府单位开始发起年轻干部的培养。但是在教育机构的行动明显滞后，那些自以为是的老教授们站在那指手划脚，利用一群没有接触过社会历练的学生苦力，搞一些所谓的高新项目，骗取国家的经费。<br/><br/>真的高新吗？真的需要这些教授搞那么多所谓的科研吗？看看我们的社会现实，那些在教育机构所产生的所谓前沿科研成果，与社会中的企业相比，落后了不知道几个级别，还在那沾沾自喜。动不动以专家的身份去评论比自己先进的成果，并以自己的身份来打压进步。<br/><br/>教授如此，学生当然照单全收。可是当这些学生进入社会后，才发现自己幸苦几年的学术研究生涯，居然在社会上落后别人几个等级，于是对教育的怨念顿生。还有一种可能，就是学他们的教授继续忽悠，谋取社会效应。<br/><br/>能够解决教育系统固步自封局面其实也不是很难，将教育系统的科研成果，与社会同类企业的成果同台评审，当然为了避免所谓的暗箱不光彩操作存在的可能性，这些评审的专家们肯定不能用国内系统的专家们。我们可以聘请国外有关的专家来以沙箱的方式进行评审，既不让专家知道成果的方案由哪一方开发。这样一来如果教育系统获胜，那么就是名副其实；如果是社会企业获胜，国家应该将相应的经费用来支持该企业的发展。不能让这些劳动人民的血汗钱，让那些名不副实的专家，教授，有关单位胡乱挥霍。<br/><br/>解放思想，实事求是。这才是我们这个名族应该有的发展的主线。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=264" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=264</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[云技术正名]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=4" label="技术交流" /> 
	  <updated>2011-07-25T15:14:55+08:00</updated>
	  <published>2011-07-25T15:14:55+08:00</published>
		  <summary type="html"><![CDATA[不得不说现在IT行业鬼扯成风，迟早真的变成“挨踢”行业。<br/><br/>何为云，云的应用是什么？云端究竟是什么样的概念。<br/>大多数互联网企业都在忽悠着大家团团转，简单分析一下现在对云的定义：数据存在互联网上，使用任何可以联网设备，将数据取回。<br/><br/>这是什么云啊，扯蛋的，简单说就是把数据放服务器上，以后要用的时候取回来，这个从互联网诞生时就这样了。再高深一点分析，那么就剩下分布式，虚拟服务器这样存在很多年的概念，这哪是什么新东西，连实际用途都没有改变过，这么多公司在忽悠：百度，盛大，阿里巴巴什么的，别扯了。<br/><br/>我在2004年曾经设想过一个产品，并且把当时的创意很无知地发给了SUN，结果可想而知石沉大海。这里我不想说我的思想有多么超前，产品设计能力多么NB，只是当时的设想其实基于很简单的出发点：提供一种轻量便捷，价格非常低的硬件设备，来产生出犹如目前大型计算一样的运算效率。<br/><br/>这不是没有可能实现，在当时也没有云这一概念，所以我自己把这样的一种臆想的产品命名为纯服务器，有别人普通提供数据的服务器，这种服务器的作用是提用运算结果。估计还是很多人觉得这个和普通服务器没有区别啊，那么再浅显地描述一下这个产品的构成：<br/><br/>在服务器端直接运行魔兽世界，由服务器端将运算的结果，按照特别的数据接口标准，直接将运算好的图形，音频，以及操作发给客户机，而客户机简单看来就是一个和电视机一样的东西，就是多了一个输入的设备，所有输入的行为都是直接给服务器去处理。<br/><br/>那么这样一来，客户机就很简单了，像电视机一样直接播放处理好的数据，将客户机输入操作直接给服务器，服务器再次运算对游戏的处理结果，返回给客户机。有点类似于远程桌面的形态，只是目前的远程桌面还没有基于多媒体运算结果做优化，通常还不怎么好使用。<br/><br/>云，本该如此，根本就不是现在这些互联网公司忽悠的那样，简单存储一下数据了事。<br/><br/>试想一下，将来的电子设备没有硬件升级这一说，你可能只需要花费几十块买一个客户机（当然，如果你真觉得几十块的客户机样子不好看，那么你可以去购买大品牌做的很酷的客户机），对于客户机来说，硬件设备根本无需再去升级什么的，因为本来就不需要过多的运算能力。<br/><br/>那么升级这块就落到服务器端了，用户可以定制购买一定的运算能力的服务，那么和目前相比，运行魔兽3和运行纵横四海2的配置肯定是不同的，你随时可以按你的需要去在线购买或按时租用运算能力服务。<br/><br/>其他的任何软件应用，视频媒体什么的，根本就无需下载，都是服务器和服务器间的数据交互问题。<br/>这样做的好处是对于用户来说都是按需购买，不存在浪费。客户机更新不需要那么频繁，这样对于环境来说也是非常有好处的。至少电子消费类的垃圾变少了。<br/><br/>再有，基本这个时候盗版还有生存空间吗？服务器间的数据交互，就意味着任何应用都是需要客户与服务端都授权才能使用的，盗版已经从根本上消失。<br/><br/>但是，这样的云绝非私营企业可以运作的，不是说在资金上面，而是安全方面，这种数量级别的产品只能由国家垄断控制。因为最终这样的成品发展到最后，就是黑客帝国描述的那样，如果任由私营企业来运作，那么对于整个社会来说都是灾难性的。<br/><br/>仅以此文为云正名，也希望有志同道合的朋友讨论真正云发展的未来方向。<br/><br/>我是一个技术控，同时也非常清楚只有拥有了技术，才能更好地实现我对产品设计理念的追求，互联网产品的变革也即将开始。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=263" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=263</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[中国不能说的秘密]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=17" label="创业管理" /> 
	  <updated>2011-05-20T19:39:23+08:00</updated>
	  <published>2011-05-20T19:39:23+08:00</published>
		  <summary type="html"><![CDATA[今天算是见识了我们国家教授们的水平，一群连互联网服务是什么都搞不清楚的人，在那讨论数据的大规模并发，先不说他们究竟在研究什么，最有水平的一句话就是：“主流的java技术”。<br/><br/>他们研究那些大规模并发都用哪里去了，我是很疑惑的，探了下究竟，是他们研究的某某ERP产品使用了他们的底层研究成果，我又多嘴问了句压力测试怎么做的，回答：这是我们的核心技术，不能透露。最后我狠了狠心，问了他们的产品现在最多有多少人使用？回答：成千上万。<br/><br/>这就是他们眼中的大规模并发。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=262" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=262</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[中国互联网创业新潮即将来临]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=17" label="创业管理" /> 
	  <updated>2011-03-26T22:05:28+08:00</updated>
	  <published>2011-03-26T22:05:28+08:00</published>
		  <summary type="html"><![CDATA[中国的民间组织自古以来都没有出现过的一种现象，可能就是垄断。<br/><br/>中国讲究的是中庸之道，易经八八六十四卦无头无尾，否极泰来，物极必反。可能很多人都没有意识到这样一种情况，在你无力对抗某件事情的时候，最好的办法就是坐等其自我膨胀，直到灭亡。<br/><br/>准不准确我下不了结论，但是看看最近我们身边发生的一些事情，腾讯与360互咬，360暗算网秦（这个是我的主观推断），文协死磕百度，阿里巴巴丑闻等等。估计网易，新浪也差不多要卷进去了。<br/><br/>表面上可能这些事情没有什么大的关联，但是在最近短短一年，这些在中国来说属于航母级别的互联网公司开始出问题了，不得不让人产生某种联想，也许有那么一张隐形的网正在编织，并且按照某种不为人知的计划开始对这些已经形成垄断态势的互联网企业展开了狙击。也许是这些互联网公司为了利益，不择手段，所作所为让这个行业另外一部分人没水喝，于是大家开始反感，并且开始厌恶，同时开始抵触，最后促成这目前这个局面的产生。<br/><br/>或许，或许还有很多或许。不过我们可以知道的事情是，这些互联网公司不是没人去碰他们的，也不是没有办法去撼动的。<br/><br/>我一个杭州的朋友，本来公司不大，这个业内可能都知道杭州是电子商务之城，在那里做互联网理应很不错。可是在那里就是好比是一把双刃剑，生意好做人不好找。我那朋友公司的人硬生生地给阿里巴巴挖没了。可能很多人会说是我朋友公司不好，留不住人。我却跟他说，他是在与狼共舞，与虎谋皮。时间越长，可能他连从阿里巴巴分一勺渣的机会都没了。<br/><br/>这样的现象在大公司周围的小公司应该自己有亲身体会。如果这个行业是平等的，那么我无话可说，我们还能够使点劲，努力一把。可惜，这个行业最缺乏的可能就是竞争力了，因为这个行业是无需竞争的，甚至于在这个行业里面到处充斥着秒杀。<br/><br/>你很有能力，你也很有头脑，更有运营的手腕。可是因为互联网产品的可复制性实在太强，这些航母只要拿出钱轻轻地砸一下，那些中小型互联网企业可能就给震熄火了。<br/><br/>最后大家都不创新了，都开始互相抄袭了，因为这个行业里面已经有了潜规则，第一个做的肯定死，第一个抄的未必死，第一个大互联网公司抄的一定火，这就是这个行业的真实写照。<br/><br/>在中国，除了国企，其他类型的企业最好别和垄断有一点点关系，否则再大也得玩完。树大招风，在中国这样一个内敛的社会里面，仇富并不是一种情结，而是被仇的一定做了什么破坏和谐的事情。中国讲究的是你好，我好，大家都好。你好，我不好，大家都不好的时候问题就会出现了。<br/><br/>腾讯，360，百度，网秦，阿里巴巴都不见得是什么好鸟，他们一定会垄断，我们也没必要去和他们硬碰什么，出现在他们身上的问题只会越来越多，中国的互联网只会越来越乱，所以呢...<br/><br/>呵呵聪明的你想一想，乱会带来什么，放手一搏吧，失去这次机会，那么中国的互联网就正式走进了有序发展时代，到那个时候互联网传奇，估计只能在历史书里面找到了，也就真成了传奇。人多力量大，墙倒众人推。但是要记住，那堵墙不是一般的墙，他是阻碍行业发展的一堵墙。<br/><br/>互联网新的泡沫破灭已经近在眼前，行业内要发展的公司需要扎实地做好自己的本分，切忌浮夸，否则自己将成为泡沫的一份子。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=261" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=261</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[从电脑城看市场生态环境]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=1" label="心情随笔" /> 
	  <updated>2010-11-26T20:16:25+08:00</updated>
	  <published>2010-11-26T20:16:25+08:00</published>
		  <summary type="html"><![CDATA[我已经很长时间没有去过电脑城买那些高档的电子产品了（超过1000块，嘿嘿），至于原因其实玩电子产品的人应该身同感受，这地方变的越来越忽悠了，全国要是评最大忽悠集散地，应当首选各地的电脑城。<br/><br/>今天一个朋友急着要买SONY的XR550E摄像机，于是迫不得已走了一趟广埠屯。走了一圈发现只要是SONY卖场，好像统一都是美承在经营了。当我坐下来谈价格的时候，我深刻地感觉到，这些人，这些店在充分地藐视人民币的价值。这台摄像机官方价格12990，这些卖场统一最低价10300裸机，最后10800加了点只值200块的配件买下了。<br/><br/>这才只是个开始，然后那朋友又想买个IPAD，反正美承也是做苹果的，于是把他们的销售人员叫过来让他拿台16G的，开始他很和蔼地说好的，没问题，结果过会开始了网上流传多时，国内卖苹果的经销商（非旗舰店）忽悠客户的闹剧。开始让我们买他的套餐，我的个去啊，什么这个套餐可以优惠600块，结果一看里面有哪些啊，299的膜，599的套子，99的清洁件，最离谱的是399的软件服务。<br/><br/>于是我问他们，这个399的软件服务是什么啊，他说这个是帮你破解系统，装你想要的游戏。要不你就要在苹果的商店花最少9块9美金去买一个软件，我听后无语了。。。<br/><br/>然后我说算了，只要个裸机好了，他说好的，然后跑出去了一会，回来跟我说，不好意思，现在IPAD货源紧张，经理说非要买套餐给让出。我里个去啊。。。这套路上过网的人都看过了，怎么还这样。后来我很坚定地走了。<br/><br/>当时在美承里面有个巴比禄的500G移动硬盘，标价988，我记得我刚买的一个西数套装移动硬盘才480。还有他那卖的微软ACE的折叠鼠标，标价488，我记得2年前我买的时候才340.<br/><br/>好了说回正题，那个摄像机因为要的急，所以我没怎么说，可是当我让销售员送我一根HDMI线的时候，我彻底愤怒了，情不自禁地把那销售员和我以前养的可卡放的屁做了比较。他说那送不起的，我们品牌的HDMI线最便宜的要大几百，您说，这不是找抽了吗？<br/><br/>话说2个月前我在香港，也是我那朋友的妹妹当时买那个摄像机才8300港币，折合人民币7300多吧。然后我买的IPAD，这个价格优势不大，但是——那个原装套，才299港币，折合人民币才250块，结果美承这家黑良心，藐视人民币价值的黑店，那个套要599人民币。更离谱的是那所谓299的膜，我让他拿来看，然后我问他那膜为什么这么贵，他说磨砂的，很好，不反光。我真的想骂他了，如果用过IPHONE4和IPAD的人，应该都知道用磨砂膜有什么后果，这个我就不说了。然后我说你看我这IPAD贴的膜好不好，他看了半天也看不出来。我说在香港丰泽贴的，高清膜，45块港币。<br/><br/>然后那销售说买原装IPAD套餐吧，附带的都是原装配件：套子，键盘，读卡器。我一看那读卡器写的599，我真想动手打人了。我在苹果官网上买的，229港币。<br/><br/>好吧，我们抛开汇率，关税说话吧，那你美承基本每个东西都在官价上乘以了一个2，好像在武汉，至少在武昌这边搞成了垄断，转这么大一圈都是美承家的店。我想说，这电脑城真不是我们这种玩电子产品的人该去的地方。如果真想跑去找气受，那就带着四个字去吧——难得糊涂。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=259" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=259</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[辨别互联网信息真伪]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=17" label="创业管理" /> 
	  <updated>2010-08-16T15:38:27+08:00</updated>
	  <published>2010-08-16T15:38:27+08:00</published>
		  <summary type="html"><![CDATA[当下互联网最热的几件事情中，有Iphone 4天线问题，Gtx465与Gtx460性价比。很巧这两件事我刚刚经历，结合目前网络中的言论做一下分析。<br/><br/>Iphone 4天线问题：<br/><br/>这个新产品在全球范围内相当的火爆，可惜好景不长，没过几天就爆出了天线问题，于是互联网上铺天盖地的IP4缺陷，最后美国消费者杂志上刊登出不宜购买的提示，乔布斯妥协了，发出了应急IP4保护套得以解决该问题。<br/><br/>其实这件事情可以说明几个问题，首先是媒体的炒作，因为苹果最近几年的成功，让太多竞争者失利，所以在IP4天线问题出现后，被这些别有用心的同行推波助澜，将一个极其细微的问题放大了数百万倍。而媒体工作者看到苹果终于给抓到一点点问题后，开始大做文章，争取曝光率。<br/><br/>接着就是美国消费者杂志，看到如此多的媒体披露IP4问题，自己不跟上，好像对不去美国权威消费指南这个名号，于是在最后匆匆地上了不宜购买这个TIPS。很多人将消费者杂志的作为解读为先捧后杀，实则为市场经济利益在背后作祟。<br/><br/>还有所谓乔布斯的妥协，实则为如此大的媒体舆论，如果苹果官方不做点什么，那么可能就会淹死在口水之中。想想富士康事件吧，从第七个跳楼者开始，到后面的几个跳楼者的出现，都是媒体在里面起到推波助澜的作用，如果媒体不大力分析解剖所谓的事实真相，那么后面几个跳楼者未必会出现。这个应该属于是涟漪效应。所以郭台铭站出来，求媒体们高抬贵手，放过富士康。<br/><br/>美国是一个很较真的民族，一点点细微的事情，他们也可能会坚持到底，这个是好事情。所以IP4的那一握，信号减少，那些美国人开始惊讶了，因为苹果在他们心中是神，作为神是一点点错误也不能犯的，于是对这个神的要求也上升了无数倍。<br/><br/>最后就要摆事实了，我受朋友所托，买了5台Iphone 4，我先用了别人的一台，做了实验，按照网络上的死亡握法，发现信息的确有时候有一格会减退，然后我把我的里程碑，3GS，天翼三星S359用手捂实，也有这个现象存在，再简单点，把这几天电话丢荷包或包里面，都有不同程度的信号衰减，但是这4个电话没有出现所谓的信息中断。如果非要中断的话，找个信号刁角，那么4台都会没信号，根本不用握。<br/><br/>以苹果这样一个精益求精的企业，对于质量的控制是相当的严格，你可以看看苹果产品的外壳模具，他的接缝精细程度基本属于业界领先的。而且按照IP4的销售情况--300W台，那么这么用户都是傻子？<br/><br/>最后的结论是：这个天线门事件，是一场有计划，有组织的互联网市场策划，至于策划者是谁，那大家去猜吧。<br/><br/>Gtx465与Gtx460性价比：<br/><br/>这个问题应该是电脑硬件领域里面经常出现的了。从最早的赛扬266超333，到ATI9800改PRO，还有最近的开核等等。<br/><br/>其实这种问题根本不用争论，因为永远记得一分钱一分货，商家不蠢，不会做亏本的买卖。而这些伎俩无非就是商业营销的一种手段而已。<br/><br/>昨天我去买酸梅膏，一堆的牌子供选择，结果我选择了最靓丽包装的红色某个品牌。然后我对我老婆说，看这就是广告包装的重要性。接着我又转了一个圈，发现了另外一个牌子的酸梅膏，买大送小，包装很普通，价格差不多的，于是我果断地把靓丽包装换成了买大送小，于是我又对我老婆说，看这就是市场营销手段的重要性。<br/><br/>而这些硬件产品同样如此，在性能，价格无法有所突破的时候，营销手段就开始发威了，买硬件送包包，硬盘盒什么的屡见不鲜，而当这些大家都在做的时候，于是就想到了开核，超频，破解这些招数。<br/><br/>Gtx460是基于gf104的，而Gtx465是基于gf100，互联网上大多数媒体报道，gf104是去除了一些游戏不重要的东西，减小了CPU的负载，所以理论上应该比GF100强。<br/><br/>看出这句话的问题没？对游戏不重要，究竟什么东西对游戏不重要，数值运算吗？按照我的估计，gf104的物理加速一定没有gf100的强，而物理加速现在对于游戏来说真没用了吗？<br/><br/>刚巧，这几天抽奖，抽到一块翔升的GTX465，然后又找我一个朋友借了一块翔升的Gtx460 1G版本。自己回家测试了一下，结果说真的，这些媒体收了钱之后很卖力地在掩盖事实，GTX465比起Gtx460要强上不少，绝对不是媒体所说，理论上比GF100强，那真要看看是在什么情况下了。<br/><br/>继续推断：因为GTX465的定位比较尴尬，所以Nvidia决定用GTX460来抢占中端市场，所以有意营造出gf104比gf100在游戏性上更好的氛围。而Gtx465占了Gtx470的位置，所以必须要这样做了。<br/><br/>最后就是性价比，我这块奖品是10颗显存gf-100-a3芯片的卡，所以很顺利地刷了gtx470的BIOS,然后我们再拿这块卡和gtx460去比，那么性价比相对来说是不是这个GTX470更优秀？<br/><br/>目前1G的GTX460价格普遍在1300-1600之间，而一般可改的Gtx465价格目前在1700-2100之间，当然这个要拼人品了。至于2者改版之后的性能提升，明白硬件的人都应该知道谁的更大。<br/><br/>当然，这个GTX465也是Nvidia的营销手段之一，只是他们自己发现抢了GTX470太多的风头，所以就搞出了Gtx460。<br/><br/>经过对上面两件事的亲身经历，让我越发觉得互联网信息的，特别是产品信息的真实程度，这个就需要大家用实际的使用经验来分辨了。总之，现实互联网的情况很不好，对于公众的可信程度越来越低，慢慢地变成了一个广告网络。那么将来我们大家可能要说了：请不要在网络广告中穿插偷菜。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=257" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=257</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Silverlight PPTV 功能改进]]></title>
	  <author>
		 <name>Clear</name>
		 <uri>http://www.cnrui.cn/blog/</uri>
		 <email>Clearhu@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnrui.cn/blog/default.asp?cateID=20" label=".NET经验" /> 
	  <updated>2010-08-09T00:07:40+08:00</updated>
	  <published>2010-08-09T00:07:40+08:00</published>
		  <summary type="html"><![CDATA[最近一段时候我终于明白武汉腾翔软件开发有限公司，在我心目的定位。<br/><br/>一直以来很多人问我，包括我的天使都问这家公司究竟是做什么的。其实我真的不怎么好回答，对于业内的朋友我一般都说做互联网应用服务的，其他人说这个他们也不明白，索性就说是做网站的了。其实打从心底我就不怎么想说自己的公司是搞企业建站之类，可是这个说法，我还真没想好。<br/><br/>我记得我的2个师傅：Elnino(PPLive首席架构师)，Jerry(Blume HR)都说过：技术只是为市场服务的。而究竟要多好多优秀的技术才能更好的为市场服务呢？这个问题一直都困扰着我，直到我再次回到PPlive的开发，终于明白技术的无关性。<br/><br/>这次Silverlight pptv的开发从我接到设计稿开始，大概花了两个礼拜搞出了现在互联网上到处传的第一版，然后我休息了2个礼拜，思考了很多问题：<br/><br/>现在技术牛人一抓一大把，基本上这些人心里都想做点什么，可是很多人在做的时候就想到了腾讯，于是就放弃了，或者继续等，等着腾讯死掉。在我看来腾翔确实如现在媒体炒作那般，对于行业的危害程度大于他对行业的推进。不是这些人没有本事，或者做的不如腾讯好，只是做技术的狂人和古代文人一般，极其鄙视一些违反规则的事情，所以索性就都不搞了。<br/><br/>现在互联网一群的喷子，我只能说有能力做事情的人没时间去喷别人。我自问自己真不是一个做生意的材料，所以对于我的公司从来没有过任何宣传，我的表达能力也很差，所以也表达不出我这个公司究竟是做什么的。中国的市场的大环境决定了如果你不吹嘘，那么没人会认识你，你就只好等着挨饿吧。可是花那么多精力去吹，迟早有天牛皮也会破的啊。<br/><br/>腾翔软件能做什么，帮客户实现他对互联网的理想，从设计，开发，到推广，维护都不是很难的事情。为什么说不是很难的事情呢？因为我曾经跑遍武汉这个地方大大小小的软件，网站建设公司，不是去谈生意，而是跑去面试，只为看看这个地方我能不能找志同道合的人。结果发现大部分人面试的时候吹的天花烂醉，总被我一两个简单问题搞的无话可说。还有另外一小部分人，开口就是一切为了钱，所以才做那么多很垃圾的企业建站。<br/><br/>这是我们需要的行业吗？那个在大城市上海，北京，杭州极其浓郁的行业环境，怎么到了这个也不算小城市的地方完全被物质化了呢？<br/><br/>这里提一下武汉本土最大的软件公司，武汉捷讯信息技术有限公司。我不是说这个公司不行，而是因为这个公司我认识了一个很重要的朋友，他找捷讯做了一个项目，交付后发现这个项目运行非常缓慢，每隔几天就死掉了，然后要手动重启服务器。后来他让我帮忙看看，我看过后得出的结论是，他们应该是不重视这个项目，找的几个很新的新手写的，低级错误一堆一堆。<br/><br/>其他的一些公司也发生过这些问题。其实质量问题只是其次，我也不想多说，我从这些因素里面发现了我自己的公司究竟是做什么的了。<br/><br/>质量保证应该是项目开发所必须的，这个我比较有自信。其次就是腾翔软件不同于其他同行的特点，就是设计环节，这里的设计包含很广，界面设计只是其中的一小部分，其他的还包括：交互设计，行为设计，架构设计，框架设计，数据库设计等。这可能就是腾翔软件所能提供有别于他的特色服务了。<br/><br/>当然不少人也会说这些我们公司都有，那很好，接下来就是最重要的一环，基于这些设计元素，将他进行完美结合，最后发挥你的小宇宙，加上那画龙点睛之笔-创新思想。一个很不错的项目就诞生了。如果看到这里你很肯定的说自己的公司也是如此，那么恭喜你，这是一家值得尊敬的高水准公司，你应该以你自己为荣。<br/><br/>Silverlight PPTV是一个不错的项目，我对于这个项目本身是非常感兴趣的，也很感谢我的那些PP的朋友们还记得我，让我领悟到腾翔软件应该怎么表达给他的顾客，他是一家创意性设计开发公司，他所能提供的服务就是帮助你实现对互联网的梦想，前提条件是你不惧怕腾讯这样的Copyer，同时请相信这家公司有能力让这个害人的企鹅无法在产品上超越你，而你也有能力在运营上与企鹅同场共舞。<br/><br/>如果我有足够的资金，那么腾翔软件会实现一整条腾讯所无法超越的产品线，前提是我还需要一个有马荣誉市长那样非常有思想的合作伙伴，呵呵，YY了。<br/><br/>最后结合一下题意，做PPTV这个项目，现在的PPTV CEO说让我自由发挥，所以我会一直自由发挥，很好，他很信任我，我也要对得起人家的那份信任，当然也不忘记给我的武汉腾翔软件开发有限公司顺便做个宣传，我们是一家有思想的互联网服务开发公司。<br/><br/>公司网站：<a target="_blank" href="http://www.1stcore.com" rel="external">www.1stcore.com 英文站点 </a> / <a target="_blank" href="http://www.1stcore.cn" rel="external">www.1stcore.cn 中文站点</a><br/>公司电话：+86 27 8729 0350<br/><br/>最近我们公司要改版网站了，因为目前的这个网站是我以一个程序员的角色开发的，所以不怎么符合市场的口味，希望公司的新网站再次能和yeeoh.net与PPtv Silverlight一样成为行业中的一个里程碑。<br/><br/><br/>下面是目前倒数第四个版本的截图，应该在最近几天就会发布了：<br/><img src="http://www.cnrui.cn/blog/download.asp?id=5" border="0" alt=""/><br/><br/>忘记说了，我的公司好像和腾讯一样都是腾字辈的哦，YY。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnrui.cn/blog/article.asp?id=256" /> 
	  <id>http://www.cnrui.cn/blog/default.asp?id=256</id>
  </entry>	
		
</feed>

