- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可以通过触摸旋转的箭头。我想知道是否可以沿曲线旋转箭头?我做了一些研究,我认为它被称为贝塞尔路径?是否可以使用此代码在贝塞尔曲线路径上旋转 Sprite ,如果可以,我将如何合并它?
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, _arrow.position);
CGFloat firstRotateAngle = -ccpToAngle(firstVector);
CGFloat previousTouch = CC_RADIANS_TO_DEGREES(firstRotateAngle);
CGPoint vector = ccpSub(touchingPoint, _arrow.position);
CGFloat rotateAngle = -ccpToAngle(vector);
CGFloat currentTouch = CC_RADIANS_TO_DEGREES(rotateAngle);
//keep adding the difference of the two angles to the dial rotation
arrowRotation += currentTouch - previousTouch;
例如,
我有一个球放在地上,上面有一个箭头。当您触摸屏幕并移动箭头时,箭头将沿半圆轴移动。
曲线看起来像这样 Half Circle并且箭头将绕轴旋转。
如果我需要更清楚,请告诉我。我真的需要一些帮助。
最佳答案
几天来遇到同样的问题。这个答案中的大多数链接都已损坏,因此我找到了 Material here和 here并制作了这段代码。就像魔术一样。希望它会对某人有所帮助。
小说明:我有一个对象( self )女巫用手指围绕另一个对象(self.target)旋转,并且我有一些动画 Sprite ,例如 self 运动指南,它通过贝塞尔函数围绕 self.target 旋转。算法相当快,我有 100 多个指南的永久初始化,并且它可以在没有 CPU 过载的情况下工作。
/**
Each bezier curve is an array with 8 floats, x1, y1, x2, y2, x3, y3, x4, y4., where x1,y1 and x4,y4 are the arc's end points and x2,y2 and x3,y3 are the cubic bezier's control points.
@note adapted for xCode by Valentine Konov valentine\@konov.su 2013
@return a array of objects that represent bezier curves which approximate the circular arc centered at the origin.
@param startAngle to endAngle (radians) with the specified radius.
*/
-(NSArray*)createArcWithRadius:(float)radius_ withStartAngle:(float)startAngle_ withEndAngle:(float)endAngle_;
{
// OMLog(@"radius:%.2f startAngle:%.2f endAngle:%.2f",radius_,startAngle_,endAngle_);
// normalize startAngle, endAngle to [-2PI, 2PI]
float twoPI = M_PI * 2;
float startAngle = startAngle_;
float endAngle = endAngle_;
// float startAngle = fmodf(startAngle_,twoPI);
// float endAngle = fmodf(endAngle_,twoPI);
// Compute the sequence of arc curves, up to PI/2 at a time. Total arc angle
// is less than 2PI.
NSMutableArray* curves = [NSMutableArray array];
float piOverTwo = M_PI / 2.0;
float sgn = (startAngle < endAngle) ? 1 : -1;
float a1 = startAngle;
for (float totalAngle = fminf(twoPI, fabsf(endAngle - startAngle)); totalAngle > 0.00001f /*FLT_EPSILON*/; nil) {
float a2 = a1 + sgn * min(totalAngle, piOverTwo);
[curves addObject: [self createSmallArc:radius_ a1:a1 a2:a2]];
totalAngle -= fabsf(a2 - a1);
a1 = a2;
}
return curves;
}
/**
Cubic bezier approximation of a circular arc centered at the origin,
This algorithm is based on the approach described in:
A. Riškus, "Approximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa,"
Information Technology and Control, 35(4), 2006 pp. 371-378.
@note adapted for xCode by Valentine Konov valentine\@konov.su 2013
@param from (radians) a1 to a2, where a2-a1 < pi/2
@return an array with 8 floats, x1, y1, x2, y2, x3, y3, x4, y4. where x1,y1 and x4,y4 are the arc's end points and x2,y2 and x3,y3 are the cubic bezier's control points.
*/
-(NSArray*)createSmallArc:(float)r a1:(float)a1 a2:(float)a2
{
// Compute all four points for an arc that subtends the same total angle
// but is centered on the X-axis
float a = (a2 - a1) / 2.0; //
float x4 = r * cosf(a);
float y4 = r * sinf(a);
float x1 = x4;
float y1 = -y4;
float k = 0.5522847498;
float f = k * tan(a);
float x2 = x1 + f * y4;
float y2 = y1 + f * x4;
float x3 = x2;
float y3 = -y2;
// Find the arc points actual locations by computing x1,y1 and x4,y4
// and rotating the control points by a + a1
float ar = a + a1;
float cos_ar = cosf(ar);
float sin_ar = sinf(ar);
return [NSArray arrayWithObjects: //
[NSNumber numberWithFloat:(r * cosf(a1))], //startPoint.x
[NSNumber numberWithFloat:(r * sinf(a1))], //startPoint.y
[NSNumber numberWithFloat:(x2 * cos_ar - y2 * sin_ar)], //ctrlPoint1.x
[NSNumber numberWithFloat:(x2 * sin_ar + y2 * cos_ar)], //ctrlPoint1.y
[NSNumber numberWithFloat:(x3 * cos_ar - y3 * sin_ar)], //ctrlPoint2.x
[NSNumber numberWithFloat:(x3 * sin_ar + y3 * cos_ar)], //ctrlPoint2.y
[NSNumber numberWithFloat:(r * cosf(a2))], //endPoint.x
[NSNumber numberWithFloat:(r * sinf(a2))], //endPoint.y
nil];
}
/**
Bezier approximation example
@note adapted for xCode by Valentine Konov valentine\@konov.su 2013
@param inSprite_ is sprite, angle_ signed angle radiants
@return CCSequence of [CCSpawns of (CCBezierTo and CCRotateBy)]
*/
-(id)calcBezierCircle:(CCSprite*)inSprite_ withAngle:(float)angle_
{
double speed = 100; //points per second
CGPoint positionOffset = ccpSub(((CCNode*)self.target).position, self.position);
//((CCNode*)self.target).position is circle center
double startAngle = [self calcAngle:inSprite_.position ownerRelated:false];
while (startAngle<0) startAngle += 2*M_PI;
while (startAngle>=2*M_PI) startAngle -= 2*M_PI;
double endAngle = startAngle + angle_;
float radius = [self calcRadius];
NSArray* curves = [self createArcWithRadius:radius withStartAngle:startAngle withEndAngle:endAngle];
NSMutableArray* bezierActions = [NSMutableArray array];
for (NSArray* curve in curves) {
CGPoint startPoint = ccpAdd(ccp([[curve objectAtIndex:0] floatValue], [[curve objectAtIndex:1] floatValue]), positionOffset);
CGPoint controlPoint1 = ccpAdd(ccp([[curve objectAtIndex:2] floatValue], [[curve objectAtIndex:3] floatValue]), positionOffset);
CGPoint controlPoint2 = ccpAdd(ccp([[curve objectAtIndex:4] floatValue], [[curve objectAtIndex:5] floatValue]), positionOffset);
CGPoint endPoint = ccpAdd(ccp([[curve objectAtIndex:6] floatValue], [[curve objectAtIndex:7] floatValue]), positionOffset);
ccBezierConfig bezier;
bezier.controlPoint_1 = controlPoint1;
bezier.controlPoint_2 = controlPoint2;
bezier.endPosition =endPoint;
float bezierAngle = ccpAngleSigned(ccpSub(startPoint, positionOffset), ccpSub(endPoint, positionOffset));
float bezierDuration = radius*fabsf(bezierAngle)/speed;
id bezierTo = [CCBezierTo actionWithDuration:bezierDuration bezier:bezier];
id rotateBy = [CCRotateBy actionWithDuration:bezierDuration angle:CC_RADIANS_TO_DEGREES(-bezierAngle)];
CCAction * bezierToAndRotateBy = [CCSpawn actions:bezierTo, rotateBy, nil];
[bezierActions addObject:bezierToAndRotateBy];
}
if ([bezierActions count]<1) {
return nil;
}
return [CCSequence actionWithArray:bezierActions];
}
/**
Calculates angle
@param position_ current position of sprite on sircle, ownerRelated boolean, wich is startPoint is {1,0} or owner.position
@return angle (radiant)
*/
-(float)calcAngle:(CGPoint)position_ ownerRelated:(bool)ownerRelated {
if (ownerRelated) {
CGPoint v1 = ccpSub(((CCNode*)self.target).position, self.position);
CGPoint v2 = ccpSub(ccpSub(((CCNode*)self.target).position, self.position),position_);
return ccpAngleSigned(v1, v2);
}
else {
CGPoint v1 = ccp([self calcRadius], 0.0f);
CGPoint v2 = ccpSub(position_,ccpSub(((CCNode*)self.target).position, self.position));
return ccpAngleSigned(v1, v2);
}
}
/**
Calculates radius
@return radius
*/
-(float)calcRadius;
{
return sqrt(pow(self.position.x-((CCSprite*)self.target).position.x, 2)+pow(self.position.y-((CCSprite*)self.target).position.y, 2));
}
关于iphone - 通过触摸在贝塞尔曲线路径上旋转 Sprite - Cocos2D/Box2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7494795/
我该怎么做 touch R 中的文件(即更新其修改时间而不更改其内容)?我正在寻找一个跨平台的内置(或打包)等效于: system2("touch", file_name) 最佳答案 我找到了 an
我想在 android 中实现 body 部位选择。我的要求是,当我点击特定部分时,图像应用程序应该能够识别 body 部位并且所选部分的颜色应该改变。附上示例图像以供引用。 如有任何想法或建议,我们
我需要将3D模型加载到我的应用程序中(不是游戏,它没有任何区别),并检测用户何时触摸此模型的特定部分以采取不同的操作。 我怎样才能做到这一点?可能吗? 最佳答案 我不熟悉Rajawali,但GitHu
似乎连续触摸总是被它起源的控件捕获。是否有标准方法将触摸/手势传递给当前触摸结束的控件? 最佳答案 控件显示在 UIView 对象内部的屏幕上。 iOS 使用第一响应者的概念来处理 UIView 对象
我有一个 UIScrollView 实例,允许用户放大/缩小。我已经根据文档实现了一个委托(delegate)来处理这个问题。但是,我想知道用户触摸 ScrollView 的位置(相对于 Scroll
我正在创建一款射击游戏,您可以触摸屏幕,玩家可以射击。我遇到的问题是,当你触摸屏幕并按住它并拖动它时,它会快速射击。处理这个问题的最佳方法是什么? 我希望玩家能够按住手指并以稳定的速度射击,而手指向上
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typ
这是我从触摸事件中获得的返回数据。明显缺少任何有用的触摸 X/Y 坐标 ( https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/ch
因此,我有一个屏幕,其中包含 0 到 6 个通过 XML 包含的相同用户界面组件。类似这样的东西: ...等等 每个包含的 UI 都是我重复使用的几个小部件和自定义组件的集
我希望能够更改文件的修改日期以便在 Web 应用程序中使用。目前我直接在命令行上测试这个。在我的 Mac 上工作正常,但是当我在 Linux 服务器上执行此操作时出现错误。 命令:/bin/touch
概念问题: 我在使用 touches 时遇到了一个非常简单的问题属性,自动更新依赖模型的时间戳;它正确地这样做了,但也应用了全局范围。 有什么办法可以关闭这个功能吗?或专门询问自动 touches忽略
我很难在一个简单的等距 Sprite Kit 游戏中实现点击处理。 我有一个包含多个 Tile 对象(SKSpriteNode)的 map (SKNode)的游戏场景(SKScene)。 这是 map
有没有办法在触摸事件后恢复 Flexslider 幻灯片的自动播放?现在看来,一旦我滑动导航,幻灯片就会停止...... 最佳答案 FLEXISLIDER 2 更新 resume()事件不再存在,正确
有些游戏有一些小图片作为 Sprite ,可以通过触摸来移动。如果 Sprite 是较大的图片,触摸是很正常的。我们可以使用函数CGRectContainsPoint检查 Sprite 。但是当 Sp
我有一个 View 覆盖到 iPhone 的相机 View 上。在此 View 中,我有一些 uibuttons,它们显示的位置取决于加速度计/指南针的值。当用户在 View 内触摸但没有在 uibu
我有一个 UIView 和一个 UIWebView。 UIWebView 是 UIView 的 subview 。 UIWebView 包含 YouTube 视频,并设置为让视频适合 UIWebVie
我是通过 XCode 使用 SDK 版本 5.0 进行 iOS 开发的新手。在我的应用程序中,我需要在按下按钮时更改按钮的标题。 假设在正常状态下它是“未推送”的。我所需要的是,当我按下按钮时,按钮标
我需要防止我的网络应用程序中的水平滚动。我尝试在 touchmove 事件上使用 PreventDefault(),但它也阻止垂直滚动。 有什么想法吗?^^ 我的尝试: $(document)
对于完全适合动画组方法的动画效果,如Brad Larson's answer here所示,我需要动画根据输入进行。特别是触摸和检测到的触摸的位置。处理 TouchMoved: 并为每次触摸设置元素的
我在屏幕上散布了一系列硬币。我想在触摸硬币时添加声音。 private Music coinSound; 在 show() 中: coinSound=assetManager.get(Assets.c
我是一名优秀的程序员,十分优秀!