2011-06-19 42 views
5

Tôi có một trò chơi đơn giản làm cho đồ hoạ 2D thành bộ đệm khung (không sử dụng bất kỳ OpenGL nào). Tôi sẽ sử dụng một CVDisplayLink để có được một khung hình sạch sẽ, tuy nhiên hầu hết các ví dụ về thỏa thuận web với OpenGL hoặc QuickTime.Làm thế nào để vẽ một bối cảnh đồ họa NSView từ bên trong một cuộc gọi lại CVDisplayLink?

Cho đến nay tôi có một lớp con của NSView:

@interface GameView : NSView { 
@private 
    CVDisplayLinkRef displayLink; 
} 

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime; 
@end 

Và tôi thiết lập callback CVDisplayLink:

CVDisplayLinkSetOutputCallback(displayLink, MyDisplayLinkCallback, self); 

Và tôi có chức năng gọi lại:

Phần mà tôi đang mắc kẹt là phải làm gì trong getFrameForTime: để vẽ đến bối cảnh đồ họa trong GameVi ew. đoán đầu tiên của tôi là phải làm bản vẽ giống như cách bạn sẽ trong drawRect:

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime 
{ 
    CGContextRef ctxCurrent = [[NSGraphicsContext currentContext] graphicsPort]; 

    //.. Drawing code follows 
} 

Nhưng ctxCurrentnil mà tôi nghĩ tôi hiểu - thường có một số thiết lập điều đó xảy ra trước khi drawRect: mà làm cho cái nhìn của bạn bối cảnh hiện nay. Tôi nghĩ đây là phần tôi đang thiếu. Làm thế nào để có được bối cảnh cho quan điểm của tôi?

Hoặc tôi sẽ thực hiện điều này theo mọi cách sai?

Trả lời

2

Bạn có thể để mã vẽ của mình ở ‑drawRect: và sau đó trong số MyDisplayLinkCallback() đặt một thanh ivar theo thời gian hiện tại và gọi ‑display trên chế độ xem của bạn. Điều này sẽ buộc chế độ xem của bạn phải tự vẽ lại ngay lập tức.

Trong phương thức ‑drawRect: của bạn, chỉ cần sử dụng giá trị của thời gian ivar để thực hiện bất kỳ bản vẽ nào là cần thiết để cập nhật chế độ xem phù hợp cho khung hoạt ảnh hiện tại.

+0

Cảm ơn, điều này có hiệu quả và dường như là sạch nhất mà tôi đã tìm thấy từ trước tới nay. – John

0

Bạn nên tạo phương thức -draw: riêng và gọi từ số MyDisplayLinkCallback() cũng như từ -drawRect:.

Tôi tìm thấy Rob Keniger's response theo ý thích của tôi và dùng thử; thật đáng buồn, nếu bạn gọi -display từ liên kết hiển thị gọi lại, ứng dụng của bạn có thể bị treo trong bế tắc khi bạn chấm dứt ứng dụng, để bạn buộc thoát ứng dụng (đối với tôi điều đó xảy ra thường xuyên hơn không).

+1

Vui lòng thêm liên kết tới phản hồi của Rob Keniger. Thật thú vị khi thấy điều đó. – SalmonKiller

+0

@SalmonKiller: Làm cách nào để liên kết? Đó là câu trả lời hiện được chấp nhận ngay phía trên của tôi. – placeitintheblob

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