Cocos2d中用手指旋转精灵

2023-12-23

我需要帮助用手指计算精灵的旋转。精灵旋转得很好,但在我手指第一次触摸时,它不知何故自行旋转了几度。

此外,只有当手指围绕精灵中心旋转时,旋转才起作用。

我正在尝试模拟自行车车轮,并有一个齿轮精灵和一个踏板精灵作为齿轮精灵的子级。我希望当我触摸踏板并旋转它时自行车车轮也旋转。我还没到那一步。现在我正在尝试找出如何消除齿轮的初始变速。

这是完整的代码

#import "BicycleScene.h"

@implementation BicycleScene

+(id) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    BicycleScene *layer = [BicycleScene node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

-(id) init
{
    if ((self=[super init])) {

        CGSize winSize = [[CCDirector sharedDirector] winSize];

        //place the bicycle sprite
        bicycleSprite = [CCSprite spriteWithFile:@"bike_gear.png"];
        bicycleSprite.position = ccp(bicycleSprite.contentSize.width/2 + 100, winSize.height/2);
        [self addChild:bicycleSprite z:1];

        //place the pedal sprite
        pedalSprite = [CCSprite spriteWithFile:@"bike_pedal.png"];
        [bicycleSprite addChild:pedalSprite z:1];

        pedalSprite.position = ccp(150, 15);

        //enable touch
        self.isTouchEnabled = YES;

        [self schedule:@selector(gameLoop:) interval:.1/100];

    }

    return self;
}

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    NSLog(@"Touch begun");

}

-(void)gameLoop:(ccTime) dt{

    bicycleSprite.rotation = cocosAngle;
}

-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    NSLog(@"Touch moved");

    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    CGPoint previousLocation = [touch previousLocationInView:[touch view]];

    CGPoint touchingPoint = [[CCDirector sharedDirector] convertToGL:location];
    CGPoint previousTouchingPoint = [[CCDirector sharedDirector] convertToGL:previousLocation];

    CGPoint vector = ccpSub(touchingPoint, bicycleSprite.position);
    CGFloat rotateAngle = -ccpToAngle(vector);

    previousAngle = cocosAngle;
    cocosAngle = CC_RADIANS_TO_DEGREES( rotateAngle);

    //bicycleSprite.rotation = cocosAngle;
}

@end

如果该行我有点困惑:

CGPoint vector = ccpSub(touchingPoint, bicycleSprite.position);

实际上应该是:

CGPoint vector = ccpSub(touchingPoint, previousTouchingPoint );

我也尝试过,但没有成功。

我还将完整的 xcodeproj 上传到 4shared,供任何想在这里查看的人使用:http://www.4shared.com/file/5BaeW4oe/Healthy.html http://www.4shared.com/file/5BaeW4oe/Healthy.html


@interface MainScene : CCLayer {
    CCSprite *dial;

    CGFloat dialRotation;

}

+ (id)scene;

@end
---------------------------------
@implementation MainScene

+ (id)scene
{
    CCScene *scene = [CCScene node];
    CCLayer *layer = [MainScene node];
    [scene addChild:layer];

    return scene;
}

- (id)init
{
    if((self = [super init])) {
        CCLOG(@"MainScene init");

        CGSize size = [[CCDirector sharedDirector]winSize];

        dial = [CCSprite spriteWithFile:@"dial.png"];
        dial.position = ccp(size.width/2,dial.contentSize.height/2);
             [self addChild:dial];

        self.isTouchEnabled = YES;
        [self scheduleUpdate];

    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (void)update:(ccTime)delta
{
    dial.rotation = dialRotation;
}

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

}

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    //acquire the previous touch location
    CGPoint firstLocation = [touch previousLocationInView:[touch view]];
    CGPoint location = [touch locationInView:[touch view]];

    //preform all the same basic rig on both the current touch and previous touch
    CGPoint touchingPoint = [[CCDirector sharedDirector] convertToGL:location];
    CGPoint firstTouchingPoint = [[CCDirector sharedDirector] convertToGL:firstLocation];

    CGPoint firstVector = ccpSub(firstTouchingPoint, dial.position);
    CGFloat firstRotateAngle = -ccpToAngle(firstVector);
    CGFloat previousTouch = CC_RADIANS_TO_DEGREES(firstRotateAngle);

    CGPoint vector = ccpSub(touchingPoint, dial.position);
        CGFloat rotateAngle = -ccpToAngle(vector);
    CGFloat currentTouch = CC_RADIANS_TO_DEGREES(rotateAngle);

    //keep adding the difference of the two angles to the dial rotation
    dialRotation += currentTouch - previousTouch;
}

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

}

编辑:很抱歉我无法让它保持在代码模式。但这就是解决方案,并且应该很容易在您的代码中实现。干杯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cocos2d中用手指旋转精灵 的相关文章

  • 获取 UIView 的当前角度/旋转/弧度?

    如何获取 UIView 当前的角度 旋转 弧度 你可以这样做 CGFloat radians atan2f yourView transform b yourView transform a CGFloat degrees radians
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 翻转旋转和图像

    我正在用 Java 编写一个平台游戏 并且正在手动编码玩家动画 我分别为每个肢体设置动画 改变位置和旋转 当玩家面向右时 这工作得很好 但是当玩家面向左时 我不知道如何处理旋转 以使它们在玩家向左转时看起来相同 每个身体部位的位置都是相对于
  • 横向 xib 显示为纵向

    我有一个视图控制器和单独的纵向和横向笔尖文件 旋转时 我加载相应的笔尖 方法 shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation 接到电话
  • Unity Transform.LookAt 仅在一个轴上

    我一直在开发一款游戏 进展非常顺利 从这里得到了一些帮助 我再次需要它 所以我正在制作一个 2D 自上而下的射击游戏 我需要我的敌人看着玩家 显然敌人会在所有轴上旋转 因此是无敌的 或者看起来很奇怪 那么 如何让它只在Z轴上旋转呢 另外 如
  • 使用 jQuery 对 CSS 变换进行动画处理

    我正在尝试为 div 制作动画 并让它绕 y 轴旋转 180 度 当我调用以下代码时 出现 jQuery 错误 my div animate transform rotateY 180deg webkit transform rotateY
  • 当设备方向改变时以编程方式更新约束的正确方法?

    我在用着storyboard and autolayout 并将 IB 中的约束设置为IBOutlet在相应的视图控制器中 我正在阅读几篇关于如何将纵向和横向的约束更新为不同的帖子 但我仍然不确定应该如何执行此操作 我应该设置新的限制吗 v
  • cocos2d 2.0-rc2:结束director并重新启动

    我有一款由 cocos2d 驱动的游戏 它使用 UIKit 菜单 所以我只使用一个视图控制器的框架 即游戏本身 而且 它只有一个场景 从cocos2d 2 0开始 director本身就是一个UIViewController子类 所以我只是
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 在 Chrome 中使用 webkit-transform 旋转时出现不稳定的文本抗锯齿效果

    我正在使用旋转元素 webkit transform rotate 在 Chrome 14 0 835 2 dev m 中 它对元素内的文本做了一些非常奇怪的事情 它让我想起了在 Photoshop 中使用 平滑 抗锯齿而不是 清晰 旋转文
  • 通用cocos2d游戏支持iPad3

    通用应用程序中的 ipad 和 ipad HD 版本的图像资源如何命名 当支持 iPhone 的普通图像和高清图像时 我们使用图片名称 png 图片名称 hd png 但如果我制作一个通用的 我假设我必须重命名图像并使用图片名称iPad p
  • 如何在iOS中获得旋转UIView的完美X,Y位置

    我正在使用 CABasicanimation 来旋转 UIView 我正在使用这段代码 CABasicAnimation rotationAnimation CABasicAnimation animationWithKeyPath tra
  • 如何在启用抗锯齿的情况下旋转可绘制对象

    我需要将 ImageView 旋转几度 我通过子类化 ImageView 和重载来做到这一点onDraw Override protected void onDraw Canvas canvas canvas save canvas sca
  • 具有轴和角度的 3D 旋转

    我知道 3D 旋转在 SO 和许多其他网站上都有详细记录 但尽管阅读了无数的解释 我仍然没有弄清楚我哪里出错了 我的背景是艺术和设计 而不是数学和编程 而且我从来都不确定我的攻击角度 没有双关语 是否正确 我没有粘贴我那令人沮丧的代码的拼凑
  • 是否可以旋转 R 中的绘图(基本图形)?

    我搜索了这个 发现使用 grid 有多种方法可以旋转图像 并且对于某些绘图 您可以使用它们的旋转 例如plot x y 而不是plot y x 不过我想知道是否有R 中旋转绘图的通用方法 适用于基础图形中生成的任何绘图 您可以导出图形 将其
  • 编程界面方向更改不适用于 iOS

    因此 我有一个项目 当用户按下按钮时 我需要强制改变方向 我创建了一个github 上的示例应用程序 https github com vradenburg ForcedOrientationChange来演示这个问题 interface
  • 使用 Javascript 旋转图像

    首先 我目前正在使用 JQuery 因此 JQuery 解决方案可行 我想将图像旋转动态 X 度 每秒计算一次 现在我用这个完美地工作了Jquery旋转插件 http code google com p jqueryrotate 图像每秒完
  • Pygame 中可以改变精灵颜色吗?

    我正在使用 Pygame 在 Python 中制作一个游戏 其中在游戏开始前包括一个小型头像制作器 但不是创建一个包含 88 种不同发型和颜色组合的大精灵表 有没有一种方法可以让我只使用通用的 每个发型的 png 图像并在游戏中为其应用颜色
  • Java 旋转图像

    Override public void paintComponent Graphics g super paintComponent g Graphics2D g2 Graphics2D g create rotation of play
  • Libgdx SpriteBatch.draw() 指定 4 个顶点

    我正在使用 libGdx 创建一个 2d 游戏 并尝试使用这个特殊的方法来绘制一个简单的 2d 纹理 分别指定 4 个顶点 draw Texture texture float spriteVertices int offset int l

随机推荐

  • GCC 3.4.6 中与模板函数相关的错误

    今天我在办公室遇到了一个奇怪的编译错误 我怀疑它是我们的 GCC 版本 3 4 6 中的一个错误 我已经能够将其归结为几行代码 如下 我得到的编译错误是 test cpp 26 error expected primary expressi
  • 如何在Python中解析data-uri?

    HTML 图像元素有this http www w3schools com tags tag img asp简化格式 img src something 那东西可以是data uri https www rfc editor org rfc
  • 修改Android的seekbar小部件以垂直操作

    我正在尝试让模拟器使用垂直搜索栏 但我 有点卡住了 我可以让搜索栏按照我想要的方式显示 我可以获得做我想做的事情的进度 并且我可以修改 onTouchEvent 让拇指垂直移动而不是 水平地 我不能做的就是让拇指移到外面 默认 29 水平像
  • 确定时间是否在两个时间之间,无论日期如何

    我创建了一个自定义TimePicker我对 Android Wear 表盘的偏好 用户选择一个时间 它会返回当前时间 以毫秒为单位 代码可以在我的GitHub 仓库 https github com Nxt3 IO Classic Watc
  • 自定义 Jersey 错误处理,如何在客户端捕获响应?

    我正在我的网络服务上尝试一些自定义错误处理 在我的 web 服务中 我创建了一个扩展 WebApplicationException 的自定义异常类 如中所述JAX RS Jersey如何自定义错误处理 https stackoverflo
  • 更新 Python3 pip AttributeError 时出错:模块“lib”没有属性“OpenSSL_add_all_algorithms”

    我在 python3 中安装 更新任何 pip 模块时遇到错误 清除并重新安装pip我能想到的每一个包裹都没有帮助 这是我响应运行时收到的错误python m pip install upgrade pip具体来说 但尝试安装或更新任何 p
  • .NET 的顶级缓存库

    您认为哪些缓存库对 NET 最重要或最有用 我这么问是因为我需要联系他们以了解他们计划支持 NET 4 0 的缓存框架 应用架构 http msdn microsoft com en us windowsserver ee695849 as
  • while 循环读取文件提前结束

    最终目标是让我的 bash 脚本在多个服务器上执行命令 我差不多已经设置好了 我的 SSH 身份验证工作正常 但是这个简单的 while 循环快要我的命了 当我执行 while 循环 读取文件中的主机名时 当我运行 ssh HOST una
  • 在 mac osx 中反汇编 g++ 创建的可执行文件

    如何在 Mac OSx 上查看 C 程序的可执行文件 例如 a out 的反汇编版本 这不完全是你所要求的 但是g S从源代码生成汇编 预计比反汇编版本更具可读性 如果你不能重新编译 S 例如没有源代码 那么gdb让你可以拆卸 就像objd
  • dart - 使用空安全时订阅的正确编码模式?

    我已经启用了 dart 2 8 实验性空安全性 我有以下退出代码 StreamSubscription
  • 增强 python 链接

    我正在为我的游戏添加 boost python 我为我的类编写包装器以在脚本中使用它们 问题在于将该库链接到我的应用程序 我在用着cmake构建系统 现在我有一个简单的应用程序 包含 1 个文件和 makefile PYTHON usr i
  • 如何在AWS-Glue脚本中编写用户定义函数?

    我们如何在动态框架或数据框架上使用 PySpark Python 在 AWS Glue 脚本中编写用户定义的函数 Dynamicframe 并不像 Dataframe API 支持 UDF 那样完全支持它 您将获得的最好结果是 MAP ap
  • 应用程序如何使用 Android 4+ 的 Google 离线地图?

    Android 版本 4 引入了离线地图 我可以在手机上选择要缓存的区域 然后 Google 地图会将该地图数据下载到手机上 正如我收到的评论 我想使用我的设备上已有的数据 如果用户之前已经下载了离线地图使用 并且不要打开与 Google
  • 如何知道Python中海龟图形上特定文本的像素大小?

    如标题所示 当我执行以下代码时 import turtle turtle write some text 我想知道字符串的整体大小 包括高度和宽度 some text画布上的乌龟图形 我怎样才能做到这一点 字体大小只能告诉你half您需要知
  • 将名字和姓氏标记为一个标记

    是否可以对标记中的文本进行标记 以便将名字和姓氏组合在一个标记中 例如 如果我的文本是 text Barack Obama is the President Then text split 结果是 Barack Obama is the P
  • 未找到隧道错误 Pyngrok Streamlit 协作

    我正在开发一个用户界面streamlit并使用pyngrok来自科拉布 一切都工作正常 直到几天前开始出现隧道未找到错误 我正在使用下面的代码 我也升级了pyngrok并尝试过 但同样的问题仍然存在 对于整个 UI 构建和 Colab 来说
  • 在没有中间过程的情况下,如何在 Python 调试器中查看函数的返回值?

    PDB 和其他 Python 调试器 有一种简单的方法来查看任何当前变量的值 只需输入它即可 但是 有时我使用的库不将其返回值存储在中间变量中 这是一个示例函数 def do stuff args kwds return f args kw
  • 使用ARAnchor插入节点和直接插入节点有什么区别?

    在ARKit中 我发现了两种在hitTest之后插入节点的方法 插入 ARAnchor 然后在中创建节点renderer renderer SCNSceneRenderer nodeFor anchor ARAnchor gt SCNNod
  • Zend Framework:该行已标记为只读

    这是我第一次遇到这个问题 保存我的模型之一时 我收到错误消息 此行已标记为只读 不知道为什么我会收到此错误以及如何解决它 堆栈跟踪对我没有帮助 如何解决此问题以便保存记录 将行标记为只读可能是以下任一操作的结果 The Zend Db Se
  • Cocos2d中用手指旋转精灵

    我需要帮助用手指计算精灵的旋转 精灵旋转得很好 但在我手指第一次触摸时 它不知何故自行旋转了几度 此外 只有当手指围绕精灵中心旋转时 旋转才起作用 我正在尝试模拟自行车车轮 并有一个齿轮精灵和一个踏板精灵作为齿轮精灵的子级 我希望当我触摸踏