Tôi có câu hỏi nhanh về việc theo dõi chạm trên iPhone và dường như tôi không thể đi đến kết luận về điều này, vì vậy bất kỳ đề xuất/ý tưởng nào được đánh giá cao:iPhone: Theo dõi/Xác định các chạm riêng lẻ
I muốn có thể theo dõi và xác định các chạm trên iphone, tức là. về cơ bản mọi liên lạc đều có vị trí bắt đầu và vị trí hiện tại/được di chuyển. Chạm được lưu trữ trong một std :: vector và chúng sẽ được loại bỏ khỏi container, một khi chúng đã kết thúc. Vị trí của họ sẽ được cập nhật khi họ di chuyển, nhưng tôi vẫn muốn theo dõi vị trí ban đầu của họ (nhận dạng cử chỉ).
Tôi nhận được sự cố từ [allTouches sự kiện], có nghĩa là, NSSet bị hủy và dường như tôi không thể xác định các chạm đã được lưu trữ trong std :: vector và tham khảo các thao tác trong NSSet (vì vậy tôi biết cái nào đã kết thúc và sẽ bị loại bỏ, hoặc đã bị di chuyển, vv)
Đây là mã của tôi, chỉ hoạt động hoàn hảo với một ngón tay trên màn hình cảm ứng, nhưng với nhiều ngón tay , Tôi nhận được kết quả không thể đoán trước ...
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
[self handleTouches:[event allTouches]];
}
- (void) handleTouches:(NSSet*)allTouches
{
for(int i = 0; i < (int)[allTouches count]; ++i)
{
UITouch* touch = [[allTouches allObjects] objectAtIndex:i];
NSTimeInterval timestamp = [touch timestamp];
CGPoint currentLocation = [touch locationInView:self];
CGPoint previousLocation = [touch previousLocationInView:self];
if([touch phase] == UITouchPhaseBegan)
{
Finger finger;
finger.start.x = currentLocation.x;
finger.start.y = currentLocation.y;
finger.end = finger.start;
finger.hasMoved = false;
finger.hasEnded = false;
touchScreen->AddFinger(finger);
}
else if([touch phase] == UITouchPhaseEnded || [touch phase] == UITouchPhaseCancelled)
{
Finger& finger = touchScreen->GetFingerHandle(i);
finger.hasEnded = true;
}
else if([touch phase] == UITouchPhaseMoved)
{
Finger& finger = touchScreen->GetFingerHandle(i);
finger.end.x = currentLocation.x;
finger.end.y = currentLocation.y;
finger.hasMoved = true;
}
}
touchScreen->RemoveEnded();
}
Cảm ơn!
Tôi đồng ý với bạn. Tôi chia mã của tôi thành các phương thức thích hợp. Tuy nhiên, vấn đề của tôi là tôi cần phải tạo một liên kết giữa Obj-C và C++ và kiến trúc trò chơi của tôi yêu cầu đầu vào được thăm dò thay vì được xử lý một khi các sự kiện được kích hoạt. Đó là lý do tại sao tôi lưu trữ các chạm trong một vector STL. Dù sao, thông tin của bạn về đối tượng UITouch liên tục theo thời gian đã giúp ích rất nhiều. Bây giờ, tôi đang sử dụng địa chỉ cho đối tượng làm chìa khóa để nhận dạng duy nhất một liên lạc. Làm việc như một say mê. Cảm ơn bạn. – FlorianZ
"Nếu bạn nhận được các liên lạc trong touchesBegan, bạn biết liên lạc là trong UITouchPhaseBegan" - thực sự? Điều đó nghe có vẻ sai với tôi - từ tài liệu của Apple, họ dường như nói điều ngược lại: với MultiTouch, một liên lạc từ touchesBegan có thể ở bất kỳ giai đoạn nào. – Adam
@Adam bạn có thể đang hiểu sai. Mặc dù các chạm được chứa trong sự kiện có thể ở trong một pha khác. Tất cả các lần chạm trong thông số "chạm" được đảm bảo ở trong giai đoạn được chỉ định. Từ Hướng dẫn xử lý sự kiện: "Nếu vì một lý do nào đó bạn quan tâm đến việc chạm vào chuỗi multitouch hiện tại không thay đổi kể từ giai đoạn cuối hoặc trong giai đoạn khác với giai đoạn trong tập hợp được truyền, bạn có thể yêu cầu chúng từ đối tượng UIEvent được truyền vào. " –