2009-03-12 32 views
11

Tôi đang phát triển trò chơi 2d dành cho iPhone bằng cách sử dụng cocos2d.Làm cách nào để phát hiện cảm ứng trong cocos2d?

Tôi sử dụng nhiều hình ảnh nhỏ (hình ảnh) trong trò chơi của mình. Tôi muốn chạm vào hai loại sprite tương tự (hình ảnh) và sau đó cả hai sprite (hình ảnh) sẽ bị ẩn đi.

Làm cách nào tôi có thể phát hiện cảm ứng trong một hình ảnh cụ thể (hình ảnh)?

Trả lời

16

Trong lớp của bạn có chứa ma của bạn, bạn cần phải nói:

self.isTouchEnabled = YES; 

sau đó bạn có thể sử dụng các sự kiện tương tự mà bạn sẽ sử dụng trong một UIView, nhưng họ đang có tên là một chút khác nhau:

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    //in your touchesEnded event, you would want to see if you touched 
    //down and then up inside the same place, and do your logic there. 
} 
+0

đây không phải là câu trả lời của tôi. Tôi muốn phát hiện một liên lạc cụ thể. – Nasir

+5

Tôi không chắc ý bạn là gì ... liên lạc đặc biệt nào? – Jonas

23

Theo hướng dẫn Jonas, và thêm vào đó nhiều hơn một chút ...

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint location = [[[Director sharedDirector] convertCoordinate: touch.location]; 
    CGRect particularSpriteRect = CGMakeRect(particularSprite.position.x, particularSprite.position.y, particularSprite.contentSize.width, particularSprite.contentSize.height); 
    if(CGRectContainsPoint(particularSpriteRect, location)) { 
    // particularSprite touched 
    return kEventHandled; 
    } 
} 

Bạn ma y cần phải điều chỉnh x/ya ít vào tài khoản cho 'vị trí trung tâm trong Quần đảo Cocos

+2

+1 để dạy tôi rằng CGRectContainsPoint hoạt động trong CocosLand. – Genericrich

+0

Cocos2D, kể từ 0.7.1 (hoặc 0.7.2?) Hiện sử dụng CCP (CGPoint) thay vì CPV (Chipmunk Vector) cho các tọa độ của nó. Họ có thể hoán đổi cho nhau, tuy nhiên - afaik, họ đã luôn luôn được kể từ khi họ được xác định theo cùng một cách. Hầu hết mọi phương thức CG * đều hoạt động. –

+0

Nó không có vẻ như thế này sẽ xử lý sprites đã được thu nhỏ kể từ khi Sprite.contentSize là toàn bộ nội dung unscaled ... Mặc dù tôi đã không thử nó được nêu ra. – Dad

0

@Genericrich: CGRectContainsPoint làm việc trong CocosLand vì cuộc gọi 2 dòng trên:

[[Director sharedDirector] convertCoordinate:] 

Đối tượng Cocos2D sẽ bằng cách sử dụng hệ tọa độ OpenGL, trong đó 0,0 là góc dưới bên trái và tọa độ UIKit (như vị trí chạm xảy ra) có 0,0 là góc trên bên trái. convertCoordinate: đang chuyển từ UIKit sang OpenGL cho bạn.

+1

đó là một tuyên bố không chính xác - nó không chuyển đổi từ OpenGL sang UIKit ... nhưng thay vì từ OpenGL View Space sang Screen Space vì các tọa độ không được chuyển đổi có giá trị khá lố bịch. Ngoài ra, các đối tượng CocosNode được neo trong trung tâm theo mặc định (0,0 == trung tâm của đối tượng) Giá trị được trả về chỉ đơn giản là một điểm trên màn hình, so với không gian Cocos2D. convertCoordinate được viết là: int newY = openGLView_.frame.size.height - p.y; int newX = openGLView_.frame.size.width - p.x; CGPoint ret; switch (deviceOrientation_) {// các trường hợp khác nhau để hoán đổi xung quanh vì lý do định hướng} return ret; –

7

@david, mã của bạn có một số lỗi chính tả cho cocos 0.7.3 và 2.2.1, cụ thể là CGRectMake thay vì CGMakeRect và [touch location] hiện là [touch locationInView: touch.view].

đây là những gì tôi đã làm:

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

    CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]]; 
    CGRect myRect = CGRectMake(sprite.position.x, sprite.position.y, sprite.contentSize.width, sprite.contentSize.height); 


    if(CGRectContainsPoint(myRect, location)) { 
     // particularSprite touched 
     return kEventHandled; 
    } 
} 
+0

Giám đốc không tồn tại. Nên được CCDirector, nhưng mã này không hoạt động anyway. Quá già? (sử dụng cocos2d 2.x) – Jonny

+0

Vâng, điều này đã làm việc trong năm 2009 nhưng tôi nghĩ rất nhiều đã thay đổi. Điều bạn cần trong dòng vị trí là chuyển đổi tọa độ thành một CGPoint, không chắc chắn về điều đó. Điều này có vẻ như tài liệu tham khảo cập nhật: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Coordinate_System – John

0

Sau đây là cách nó làm việc cho tôi ... đâu spriteSize rõ ràng là kích thước của ma ...: P

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

    CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]]; 
    CGRect myRect = CGRectMake(sprite.position.x-spriteSize/2, sprite.position.y-spriteSize/2, spriteSize, spriteSize); 


    if(CGRectContainsPoint(myRect, location)) { 
     // particularSprite touched 
     return kEventHandled; 
    } 
} 
+0

lý do bạn chỉnh sửa sau 1 năm – Srinivas

0

Tôi đã cố gắng để tìm hiểu làm thế nào để có được giữ của các chạm của một sprite đã cho và tìm thấy chủ đề này.

Đây có phải là cách chính xác để phát hiện thấy sprite nào được chạm vào không? Điều này có vẻ là một cách khá kỳ quặc để làm điều đó so với cách thức phụ lớp thông thường trong obj-c?

Vì vậy, tất cả mã phát hiện cảm ứng nằm trong lớp lớp?

Cám ơn con trỏ

27

Một cách tốt hơn để làm điều này là để thực sự sử dụng hộp bounding trên sprite bản thân (mà là một CGRect). Trong đoạn mã mẫu này, tôi đặt tất cả các sprites của mình trong NSMutableArray và tôi kiểm tra đơn giản nếu chạm sprite nằm trong hộp giới hạn. Hãy chắc chắn rằng bạn bật phát hiện cảm ứng trong init.Nếu bạn nhận thấy tôi cũng chấp nhận/từ chối chạm trên lớp bằng cách quay YES (nếu tôi sử dụng cảm ứng) hoặc NO (nếu tôi không làm)

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 

    for (CCSprite *station in _objectList) 
    { 
    if (CGRectContainsPoint(station.boundingBox, location)) 
    { 
     DLog(@"Found sprite"); 
     return YES; 
    } 
    } 

    return NO; 
} 
+0

Quan tâm giải thích tại sao đây là "cách tốt hơn "? – kizzx2

+2

Tôi đồng ý điều này là tốt hơn vì nó rất sạch sẽ –

+0

Đây là trang duy nhất trên trang này có vẻ như đang phát triển với cocos2d gần đây. (2.x) – Jonny

0

đây là một hướng dẫn tốt giải thích các hệ thống liên lạc cơ bản http://ganbarugames.com/2010/12/detecting-touch-events-in-cocos2d-iphone/

đầu tiên, hãy viết

self.isTouchEnabled = YES; 

sau đó, bạn cần phải thực hiện các chức năng ccTouchesEnded, ccTouchesBegan, vv

từ w chiếc mũ tôi hiểu, bạn muốn có thể 'ghép' hai sprites có thể nằm trên các tọa độ khác nhau trên màn hình.

một phương pháp để làm điều này ..: (im chắc chắn có nhiều phương pháp khác)

xem xét có 2 biến toàn cục.

vì vậy mỗi lần chạm một lần chạm vào một hình ảnh, bạn sử dụng hàm CGRectContainsPoint được đề cập nhiều lần để tìm thấy sprite nào đã được chạm vào. sau đó, bạn có thể lưu 'thẻ' của sprite đó vào một trong các biến toàn cầu.

Bạn làm tương tự cho lần chạm thứ hai, sau đó bạn so sánh 2 biến toàn cầu.

bạn sẽ có thể tìm ra phần còn lại nhưng nhận xét nếu bạn gặp sự cố.

Các vấn đề liên quan