次の簡単な方法はありますか?
ビューを 2 本の対角線で 4 つに分割したい:
したがって、上の三角形の領域は「上」に対応します。残りの 3 つは、それぞれ「左」、「下」、「右」に対応します。
これを行うための最も簡単または最も効率的な方法は何ですか? 三角形を4つ作ってその中のタッチを検出することも考えたのですが、これは不要ではないでしょうか?
コンテキスト:マップ内でスプライトを移動するため。
ありがとう!
次の簡単な方法はありますか?
ビューを 2 本の対角線で 4 つに分割したい:
したがって、上の三角形の領域は「上」に対応します。残りの 3 つは、それぞれ「左」、「下」、「右」に対応します。
これを行うための最も簡単または最も効率的な方法は何ですか? 三角形を4つ作ってその中のタッチを検出することも考えたのですが、これは不要ではないでしょうか?
コンテキスト:マップ内でスプライトを移動するため。
ありがとう!
私のコメントの後、私は自分自身のために簡単な実装をモックアップしたかったので、画面の中心に対するタッチ位置に基づいて枢機卿のような方向を決定するシンプルな全画面ジョイスティックを次に示します。
(フルスクリーンジョイスティック)
私はまだ cocos2d-iphone 1.1 を使用しているので、v2 に必要な mod があるかどうかはわかりません。
FSJoy.h
#import "cocos2d.h"
// Up, Down, Left, Right - directions
typedef enum
{
DIR_NONE = 0,
DIR_UP,
DIR_LEFT,
DIR_DOWN,
DIR_RIGHT
} ULDR;
// UpLeft, UpRight, DownLeft, DownRight - boundaries
typedef enum
{
UL = 135,
UR = 45,
DL = 225,
DR = 315
} ULDR_BOUNDS;
@interface FSJoy : CCLayer
{
CGPoint origin;
float angleCurrent;
BOOL isActive;
}
@property CGPoint origin;
@property float angleCurrent;
@property BOOL isActive;
@end
FSJoy.m
#import "FSJoy.h"
@implementation FSJoy
@synthesize origin, angleCurrent, isActive;
-(id) init
{
if( (self = [super init]) )
{
self.isTouchEnabled = YES;
CGSize screenSize = [[CCDirector sharedDirector] winSize];
angleCurrent = 0.0f;
origin = ccp(screenSize.width / 2.0f, screenSize.height / 2.0f);
isActive = NO;
}
return self;
}
-(void) registerWithTouchDispatcher
{
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:(INT_MIN - 4) swallowsTouches:YES];
}
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint touchCurrent = [touch locationInView:[touch view]];
touchCurrent = [[CCDirector sharedDirector] convertToGL:touchCurrent];
angleCurrent = [self determineAngleFromPoint:origin toPoint:touchCurrent];
[self determineDirectionFromAngle: angleCurrent];
isActive = YES;
return YES; // full screen controller, so always return YES
}
-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint touchCurrent = [touch locationInView:[touch view]];
touchCurrent = [[CCDirector sharedDirector] convertToGL:touchCurrent];
angleCurrent = [self determineAngleFromPoint:origin toPoint:touchCurrent];
[self determineDirectionFromAngle: angleCurrent];
}
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
isActive = NO;
}
-(void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
{
[self ccTouchEnded:touch withEvent:event];
}
-(float) determineAngleFromPoint:(CGPoint)from toPoint:(CGPoint)to
{
float angle = ccpToAngle(ccpSub(to, from));
if (angle <= 0.0f)
{
angle += M_PI * 2.0f;
}
angle = CC_RADIANS_TO_DEGREES(angle);
// NSLog(@"angle is %f", angle);
return angle;
}
-(ULDR) determineDirectionFromAngle:(float) angle
{
ULDR dir = DIR_NONE;
dir = ((angle >= UR) && (angle <= UL)) ? DIR_UP : dir;
dir = ((angle >= DL) && (angle <= DR)) ? DIR_DOWN : dir;
dir = ((angle > UL) && (angle < DL)) ? DIR_LEFT : dir;
dir = ((angle > DR) || (angle < UR)) ? DIR_RIGHT : dir;
NSLog(@"direction is %d", dir);
return dir;
}
@end
使い方は、ジョイスティックをシーン/レイヤーに追加するだけです:
FSJoyTest.h
#import "cocos2d.h"
@interface FSJoyTest : CCLayer
@end
FSJoyTest.m
#import "FSJoyTest.h"
#import "FSJoy.h"
@implementation FSJoyTest
-(id) init
{
if( (self=[super init]) )
{
[self addChild: [FSJoy node]];
}
return self;
}
@end
ただのアイデア:
上記のビューのサイズでイメージを作成します (ビューに追加しないで、どこかに保存してください)。画像ファイルには、必要に応じて 4 つの三角形が含まれますが、各三角形に異なる色が付けられます (グラデーションはありません! :))。
ビューをタップすると、タッチ位置の座標が取得され (必要に応じて画像座標に変換されます)、同じ場所で画像のピクセルの色がテストされます。色は、どの三角形が押されたかを示します。