需要安装的软件:
1.cygwin
2.perl 5.8.8
3.RVDS2.2.1
4.svn
5.python2.6.4(7x30平台需要)
6.msxml6_x64.msi(64位系统要安装相应64位的安装包)
安装cygwin
Cygwin的安装步骤如下:
1、选择Local Directory
选择Install from Local Directory
2、设置安装路径和选项(必须是这个目录)
C:\Utils\cygwin
Install For项里选择 AAll Users(RECOMMENDED)
5、选择Local Directory路径,可以将网络上的路径映射到本地,如Z:默认下载过来的cygwin目录即可,
6、选择全部安装(点击all后面的环形箭头,将状态改为install)
7、执行下一步,开始安装。
8、当安装完后,如果需要使用cygwin下的命令可以将安装目录添加到系统环境变量path中。
安装perl5.8.8
1.安装perl只需要注意一点,就是perl必须安装到c:\utils\perl目录下。
安装python2.6.4
1.安装python2.6.4只需要注意一点,就是将python2.6.4安装到c:\python26目录下
安装svn
1.默认安装即可。2个svn,一个是命令行的svn,另一个是图形界面的svn。
安装SSH
在安装之前一定要把cygwin sshd服务关闭
安装 F-SecureSSHServer软件(windows版本ssh)(一直点”下一步”就可以)
设置svn的环境变量(放在path环境变量的最前面)
RVDS安装
1.安装
modem编译环境\RVCT\RVDS2.2\RVDS_2_2_SP_1\dist_237_win_32-pentium\setup.exe
将工具安装到:C:\apps\RVDS221
2.安装license时,使用modem编译环境\RVCT\Arm license(important)目录下的license-merge5x.dat文件。
3.将modem编译环境\RVCT\RVDS2.2下的593目录copy到C:\apps\RVDS221\RVCT\Programs\2.2目录下。
4.将modem编译环境\RVCT\RVDS2.2\RVCT-pj.rar解压到C:\apps\RVDS221目录下。
5.执行c:\apps\RVDS221\crack.bat脚本。
6.修改c:\apps\RVDS221\license-merge5x.dat文件,将文件中的xxxxxxxxxxxx替换为:本机的MAC地址,然后用将此文件拷贝到C:\apps\RVDS221\Licenses目录下。如文件存在直接替换。
7.建立目录c:\flexlm,拷贝C:\apps\RVDS221\Licenses下的license-merge5x.dat到c:\flexlm中。
8.重新安装license,运行license wizard 4.0 重新安装license,安装时使用c:\apps\RVDS221\license-merge5x.dat。
9.验证:执行armcc,如果不提示错误即安装成功。
安装TI平台的arm工具
将rvct22_616_windows.zip中文件加压到C:\apps\RVDS221\RVCT\Programs\2.2\503\win_32-pentium替换原来的文件。
进入C:\apps\RVDS221\RVCT\Programs\2.2\503\win_32-pentium目录中,执行一下命令。
copy armcc.exe tcc.exe
copy armcc.exe tcpp.exe
copy armcc.exe armcpp.exe
TI平台modem工具安装检查
armcpp --vsn
tcc --vsn
tcpp --vsn
armlink --vsn
armasm --vsn
fromelf --vsn
显示内容如下代表成功:
ARM /Thumb C/C++ Compiler, RVCT2.2 [Build 616]
Softwar supplied by: mammoth//ZWTiSO 2005
一个游戏中可以有很多个场景,每个场景里面又可能包含有多个图层,这里的图层一般就是CCLayer对象。CCLayer本身几乎没什么功能,对比CCNode,CCLayer可用于接收触摸和加速计输入。其实,cocos2d对图层并没有严格的要求,图层不一定要使用CCLayer类,它也可以是一个简单的CCNode,为什么呢?我们新建一个图层不就是为了能够容纳更多的子节点么,CCNode也可以添加子节点啊。所以,如果你的图层不需要接收触摸和加速计输入,就尽量使用CCNode表示图层,CCLayer因为能够接收触摸和加速计输入会增加不必要的开销。移动、缩放、旋转整个图层,图层上的所有节点也会跟着一起移动、缩放、旋转。
1.接收触摸输入
CCLayer默认情况是不接收触摸输入的,需要显示地设置isTouchEnabled为YES
self.isTouchEnabled = YES;设置isTouchEnabled为YES后,就会调用图层相应的方法来处理触摸输入:
这些都是在CCStandardTouchDelegate协议中定义的方法
1> 当单指接触到屏幕时
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
2> 当手指在屏幕上移动时
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
3> 当单指离开屏幕时
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
4> 当触摸被取消时
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;很少会发生触摸被取消的情况,所以大多数情况下可忽略,或用ccTouchesEnded代替,因为ccTouchesCancelled和ccTouchesEnded类似
大部分情况下,我们需要知道触摸发生在什么位置。这里的触摸事件是由UIKit框架接收的,因此需要把触摸位置转换为OpenGL坐标。
比如在手指移动过程中:
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // 获取触摸对象 UITouch *touch = [touches anyObject]; // 获取触摸在UIView视图上的位置 CGPoint uiPoint = [touch locationInView:touch.view]; // 转换为OpenGL坐标 CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint]; }
下面利用一个小例子来综合使用上述的方法,假设图层上有个精灵,我手指触摸到哪,这个精灵的位置就在哪
首先在图层初始化的时候添加精灵
// 图层的init方法 -(id) init { if( (self=[super init])) { // 初始化一个精灵 CCSprite *lufy = [CCSprite spriteWithFile:@"lufy.png"]; CGSize size = [[CCDirector sharedDirector] winSize]; lufy.position = ccp(size.width * 0.5f, size.height * 0.5f); // 添加精灵,并设置标记 [self addChild: lufy z:0 tag:kLufyTag]; self.isTouchEnabled = YES; } return self; }
接下来是在图层中接收触摸输入
// 计算触摸在图层中的位置(OpenGL坐标) - (CGPoint)locationInLayer:(NSSet *)touches { // 获取触摸对象 UITouch *touch = [touches anyObject]; // 获取触摸在UIView视图上的位置 CGPoint uiPoint = [touch locationInView:touch.view]; // 转换为OpenGL坐标 CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint]; return glPoint; } // 由于ccTouchesBegan、ccTouchesMoved、ccTouchesEnded中的做法都是一样,所以抽成一个方法 - (void)dealTouches:(NSSet *)touches { // 计算触摸的位置 CGPoint point = [self locationInLayer:touches]; // 根据标记获取精灵 CCSprite *lufy = (CCSprite *)[self getChildByTag:kLufyTag]; // 设置精灵的位置 lufy.position = point; } - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self dealTouches:touches]; } - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [self dealTouches:touches]; } - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self dealTouches:touches]; }
图层的触摸输入暂时讲到这里,其他高级的用法在后面会提及
CCLayer默认情况是不接收加速计输入的,需要显示地设置isAccelerometerEnabled为YES
self.isAccelerometerEnabled = YES;设置isAccelerometerEnabled为YES后,就会调用图层相应的方法来处理加速计输入:
这是在UIAccelerometerDelegate协议中定义的方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { // typedef double UIAccelerationValue; UIAccelerationValue x = acceleration.x; UIAccelerationValue y = acceleration.y; UIAccelerationValue z = acceleration.z; // x,y,z代表三维中任意方向的加速度 }
有时候,我们想给整个图层设置一种背景颜色,那么就需要用到CCLayerColor了,CCLayerColor是CCLayer的子类
// 红色:#ffff0000 ccColor4B color = ccc4(255, 0, 0, 255); // 初始化一个颜色图层 CCLayerColor *layerColor = [CCLayerColor layerWithColor:color]; // 添加到场景中 [scene addChild:layerColor];效果图:
CCLayerGradient是CCLayerColor的子类,可以给图层设置渐变色
// 红色:#ffff0000 ccColor4B red = ccc4(255, 0, 0, 255); // 蓝色:#ff0000ff ccColor4B blue = ccc4(0, 0, 255, 255); // 初始化一个渐变图层,从红色渐变到蓝色 CCLayerGradient *layerGradient = [CCLayerGradient layerWithColor:red fadingTo:blue]; // 添加到场景中 [scene addChild:layerGradient];效果图:
CCLayerMultiplex继承自CCLayer,称为"多重图层"。它可以包含多个CCLayer对象,但在任意时刻只可以有一个CCLayer处于活动状态,用switchTo:和switchToAndReleaseMe:方法可以让某个图层处于活动状态,区别在于switchToAndReleaseMe:方法会先释放当前处于活动状态的图层,再让参数中要求的图层处于活动状态
// 创建2个图层 CCLayer *layer1 = [CCLayer node]; CCLayer *layer2 = [CCLayer node]; // 创建一个多重图层,包含了layer1和layer2 CCLayerMultiplex *plex = [CCLayerMultiplex layerWithLayers:layer1, layer2, nil]; // 让layer1处于活动状态(layer2还在内存中) [plex switchTo:0]; // 让layer2处于活动状态(layer1还在内存中) [plex switchTo:1]; // 释放当前处于活动状态的layer2(layer2从内存中移除),然后让layer1处于活动状态 [plex switchToAndReleaseMe:0];
图层之间的切换是没有过渡效果的
最近在学习服务器,而对JAVA又比较熟悉的我就开始了学习服务器了。可能很多人会说还是用c++吧,不错现在很多大型游戏公司都是用C++的。这里我不得不说我的C++ 真的很一般了。所以这里先学java吧,其实语言也在学习的时候没必要太纠结了!废话太多了,开始入正题了。
本节目录
1 :有用网站
2 :准备资源
3 :环境搭建
4 :Demo测试
首先说一下为什么我这里要选择Mina ,1:Mina是开源的(我一般都会选择开源的框架的)
2:Apache 用了很多他的框架,一般来说还是很稳定的。 所以我选择了Mina 。横向比较现在用的比较多的还有netty ,XSocket 等等。
Mina 的作用: 它是封装了JavaNIO(如果对JavaNIO不了解的可以再网上找一些资料来看一下,如果这个都没弄明白的话后面就很难继续了,所以建议先打好基础)
的一个开源框架,更利于我们开发java 服务器。
1 :有用网站
. 官方网站http://mina.apache.org/
2 :准备资源
. 搭建Mina 环境必备的资源有 : mina-core-2.0.7.jar , slf4j-api.jar , log4j.jar , slf4j-simple.jar (分别去官网下载吧,版本号这里可能不同以最新的为准,如果实在不知道下载的可以私聊我给你)
3 :环境搭建
. java 环境
学习java 的都应该清楚的,JDK 下载 ; 环境变量配置 ; Eclipse 下载
. Mina 环境
以外部包的方式导入上面准备的4个资源(右键项目:build path / configuare build path / add external jars ) 导入后如下结构图,表明我们的环境搭建好了。
- Referenced Libraries
-mina-core-2.0.7.jar
- slf4j-api.jar
- log4j.jar
- slf4j-simple.jar
4 :Demo测试
Server 端
. 创建Server
public class MinaServer { public static void main(String[] args) { //创建ServerScoket SocketAcceptor acceptor = new NioSocketAcceptor(); //设置传输方式(这里设置成对象传输模式,还有很多的类型后面会具体讲到 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); ProtocolCodecFilter filter = new ProtocolCodecFilter( new ObjectSerializationCodecFactory()); chain.addLast("objectFilter", filter); // 添加消息处理 acceptor.setHandler(new MinaServerHanlder()); // 开启服务器 int bindPort = 9988; try { acceptor.bind(new InetSocketAddress(bindPort)); } catch (IOException e) { e.printStackTrace(); } } }
. 创建消息处理类
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession;
public class MinaServerHanlder extends IoHandlerAdapter { private int count = 0;
// 由底层决定是否创建一个session public void sessionCreated(IoSession session) { System.out.println("新客户连接"); }
// 创建了session 后会回调sessionOpened public void sessionOpened(IoSession session) throws Exception { count++; System.out.println("第 " + count + " 个 client 登陆!address: : " + session.getRemoteAddress()); }
// 当收到了客户端发送的消息后会回调这个函数 public void messageReceived(IoSession session, Object message) throws Exception { System.out.println("服务器收到客户端发送指令 :" + message);
}
// 发送成功后会回调的方法 public void messageSent(IoSession session, Object message) { System.out.println("message send to client"); }
// session 关闭调用 public void sessionClosed(IoSession session) { System.out.println("one client disconnect"); }
// session 空闲的时候调用 public void sessionIdle(IoSession session, IdleStatus status) { System.out.println("connect idle"); }
// 异常捕捉 public void exceptionCaught(IoSession session, Throwable cause) { System.out.println("throws exception"); } }
Client 端
Client 端的创建方式和服务器类似的
创建客户端
import java.net.InetSocketAddress; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; public class MinaClient { public static void main(String[] args) { // TODO Auto-generated method stub // 创建Socket NioSocketConnector connector = new NioSocketConnector(); //设置传输方式 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory()); chain.addLast("objectFilter", filter); //设置消息处理 connector.setHandler(new MinaClientHanlder()); //超时设置 connector.setConnectTimeoutCheckInterval(30); //连接 ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988)); cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connector.dispose(); } }
创建客户端消息处理
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession;
public class MinaClientHanlder extends IoHandlerAdapter { public void sessionOpened(IoSession session) throws Exception { System.out.println("客户端登陆"); session.write("hello world"); } public void sessionClosed(IoSession session) { System.out.println("client close"); } public void messageReceived(IoSession session , Object message)throws Exception { System.out.println("客户端接受到了消息") ; } }
运行结果
server :
新客户连接
第 1 个 client 登陆!address: : /127.0.0.1:55497
服务器收到客户端发送指令 :hello world
client :
客户端登陆
后记 :本来想上传图片的,可惜CSDN 这个上传图片那叫一个慢啊。无奈了....如果有什么问题可以回复我。
2楼pdw_jsp鏄ㄥぉ 20:47CSDN 涓婇潰鐨勪唬鐮佹帓鐗堬紝涓轰粈涔堜細閭f牱鐨勫憿 锛熷ソ鎭跺績鍟婏紝杩樻湁灏辨槸鍥剧墖涓婁紶鐪熷績鎱㈠晩1楼fire_work鏄ㄥぉ 17:26椤朵竴涓�,"ParentId