一个基于cocos2d-x 3.0和Box2d的demo小程序
本文參考于http://blog.csdn.net/xiaominghimi/article/details/6776096和http://www.cnblogs.com/liufan9/archive/2013/04/11/3012275.html。
于上面基于cocos2d-x 2.0不一样的地方,本本是基于cocos2d-x 3.0。
首先。当然是下载和安装cocos2d-x 3.0了,网址:http://www.cocos2d-iphone.org/download。
其次,下载Box2d,网址:https://github.com/vegerjiang/Box2d。
创建一个cocos2d的项目(怎么创建这里不重述了),添加Box2d库(直接拖到Libraries文件夹),在Build Settings->Search Paths->Head Search Paths中添加一项"$(SRCROOT)/$(PROJECT_NAME)/Libraries"。
假设能编译执行成功,说明你已经建好了一个空的基于cocos2d-x 3.0和Box2d的ios项目了。
新建一个ooc类HelloLay,这里须要注意亮点:
1.HelloLay必须继承于CCLayout。
2.HelloLay.m改名为HelloLay.mm。
具体代码请从https://github.com/vegerjiang/testBox2d下载,具体的解释请參照http://www.cnblogs.com/liufan9/archive/2013/04/11/3012275.html。
为了方面某些懒童鞋。以下把类HelloLay的.h文件和.mm文件贴出来。
HelloLay.h文件
//
// HelloLayer.h
// testBox2d
//
// Created by JiangHuifu on 14-5-28.
// Copyright (c) 2014年 veger. All rights reserved.
//
#import "cocos2d.h"
#import "cocos2d-ui.h" #import "CCLayout.h" #define PTM_RATIO 32.0
@interface HelloLayer : CCLayout
+(id)scene;
@end
HelloLay.mm文件
//
// HelloLayer.m
// testBox2d
//
// Created by JiangHuifu on 14-5-28.
// Copyright (c) 2014年 veger. All rights reserved.
// #import "HelloLayer.h"
#import "Box2D.h"
@interface HelloLayer(){
b2World* _world;
b2Body* _body;
CCSprite* _ball;
}
@property(nonatomic,strong) CCSprite* ball;
@end
@implementation HelloLayer
@synthesize ball = _ball;
+(id)scene{
CCScene* scene = [CCScene node];
HelloLayer* layer = [HelloLayer node];
[scene addChild:layer];
return scene;
}
-(id)init{
if (self = [super init]) { CGSize winSize = [[CCDirector sharedDirector] viewSize]; //Create sprite and add it to the layout
_ball = [CCSprite spriteWithImageNamed:@"ball.png"];
_ball.scaleX = 52 / _ball.contentSize.width;
_ball.scaleY = 52 / _ball.contentSize.height;
_ball.position = ccp(100, 300);
[self addChild:_ball]; //Create a world
b2Vec2 gravity = b2Vec2(0.0f,-8.0f);
_world = new b2World(gravity); //Create edges around the entire screen
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0, 0); b2Body* groundBody = _world->CreateBody(&groundBodyDef);
b2EdgeShape groundEdge;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundEdge; //wall definitions
groundEdge.Set(b2Vec2(0, 0), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
groundEdge.Set(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundEdge.Set(b2Vec2(0,winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundEdge.Set(b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef); //Create ball body and shape
b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO);
ballBodyDef.userData = (__bridge void*)_ball;
_body = _world->CreateBody(&ballBodyDef); b2CircleShape circle;
circle.m_radius = 26.0/PTM_RATIO; b2FixtureDef ballShapeDef;
ballShapeDef.shape = &circle;
ballShapeDef.density = 1.0f;
ballShapeDef.friction = 0.2f;
ballShapeDef.restitution = 0.8f;
_body->CreateFixture(&ballShapeDef); [self schedule:@selector(tick:) interval:0.017]; [self schedule:@selector(kick) interval:5.0]; self.userInteractionEnabled = YES;
}
return self;
}
-(void)tick:(CCTime) dt{
_world->Step(dt, 10, 10);
for (b2Body* b = _world->GetBodyList(); b; b=b->GetNext()) {
CCSprite* ballData = (__bridge CCSprite*)b->GetUserData();
ballData.position = ccp(b->GetPosition().x*PTM_RATIO,
b->GetPosition().y*PTM_RATIO);
ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
-(void)kick{
b2Vec2 force = b2Vec2(30, 30);
_body->ApplyLinearImpulse(force, _body->GetPosition());
}
-(void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
b2Vec2 force = b2Vec2(-30,30);
_body->ApplyLinearImpulse(force, _body->GetPosition());
} -(void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
NSLog(@"touchEnded");
} -(void)dealloc{
delete _world;
_body = NULL;
_world = NULL;
}
@end
一个基于cocos2d-x 3.0和Box2d的demo小程序的更多相关文章
- 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx
LinFx 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架,遵循领域驱动设计(DDD)规范约束,提供实现事件驱动.事件回溯.响应式等特性的基础设施.让开发者享受到正真意义的面向对象 ...
- 分享一个基于 ABP(.NET 5.0) + vue-element-admin 管理后台
1.前言 分享一个基于ABP(.NET 5.0) + vue-element-admin项目.希望可以降低新手对于ABP框架的学习成本,感兴趣的同学可以下载项目启动运行一下.对于想选型采用ABP框架的 ...
- 基于.Net core3.0 开发的斗图小程序后端+斗图小程序
为啥要写这么一个小程序? 作为互联网的原住民. 90后程序员的我,从高中开始发QQ小表情. 到之后的熊猫头,蘑菇头. 可以说表情包陪伴我从学校到社会,从青少年到中年.. 而且因为斗图厉害,还找到一个女 ...
- 基于c编写的关于随机生成四则运算的小程序
基于http://www.cnblogs.com/HAOZHE/p/5276763.html改编写的关于随机生成四则运算的小程序 github源码和工程文件地址:https://github.com/ ...
- 基于Taro与Typescript开发的网易云音乐小程序
基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...
- 基于Taro与typescript开发的网易云音乐小程序(持续更新)
基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...
- 基于uniapp自定义Navbar+Tabbar组件「兼容H5+小程序+App端Nvue」
uni-app跨端自定义navbar+tabbar组件|沉浸式导航条|仿咸鱼凸起标签栏 在跨端项目开发中,uniapp是个不错的框架.采用vue.js和小程序语法结构,使得入门开发更容易.拥有非常丰富 ...
- 基于wepy和云开发的动漫资讯小程序----233次元
233次元小程序 # 233次元小程序 项目描述- 基于微信小程序的动漫咨询小程序,采用`wepy`框架开发:- 后台数据采用小程序的云开发存储: 线上体验 部分截图 ...
- 一个Accecc_Token生成和缓存和读取类,微信/小程序开发必须学
Access_Token是调用微信和小程序各种接口的临时凭证,有效期2小时(7200秒),很多接口都需要调用access_token接口生成一个access_token的,例如微信支付,微信分享,公众 ...
随机推荐
- ACM_开挂的小G
开挂的小G Time Limit: 2000/1000ms (Java/Others) Problem Description: 小G寒假在家没网络,闲着没事干又看不下书,就玩起了单机游戏ACM_Ga ...
- Zookeeper概念学习系列之zookeeper的数据模型
1.层次化的目录结构,命名符合常规文件系统规范. 2.每个节点在zookeeper中叫做znode,并且有其有一个唯一的路径标识. 3.znode中的数据可以有多个版本,比如某一路径下存有多个数据版本 ...
- Sqoop架构(四)
Sqoop 架构是非常简单的,它主要由三个部分组成:Sqoop client.HDFS/HBase/Hive.Database. 下面是Sqoop 的架构图 (1)用户向 Sqoop 发起一个命令之后 ...
- Linux文件系统inode、block解释权限(三)
利用文件系统的inode和block来分析文件(目录)的权限问题. 为什么读取一个文件还要看该文件路径所有目录的权限? 为什么目录的w权限具有删除文件的能力,而文件w权限不行. inode:记录文件的 ...
- CentOS配置网卡以及克隆
上一篇的虚拟机安装完成后是可以上网的,但是ip地址是动态的,因为后期的需要,我们要配置下网卡,改成静态的IP地址 1.打开终端,输入 ifconfig 查看虚拟机中的网卡,发现时ens33而不是平常见 ...
- Logstash_Apache日志采集
[root@Cagios logstash-]# cat /usr/local/logstash-/logstash_agent.conf input { file { type => &quo ...
- mysql存储过程之遍历多表记录后插入第三方表中
自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正 ...
- python合并多个txt文件成为一个文件
#coding=utf-8 import os import os.path #文件夹遍历函数 #获取目标文件夹的路径 filedir = './data/click_data' #获取当前文件夹中的 ...
- php第十七节课
分页查询 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- do{}while(0)
有时会在源码中或在写代码时在宏定义中用到do...while(0). 采用这种方式进行宏定义, 主要是为了防止出现以下错误 : do{}while(0) 空的宏定义避免出现warnning. #def ...