2014-01-29 3 views
1

Я хочу создать игровой цикл в F #, но у меня проблема с этим.F # Windows Forms game loop

let rec gameLoop (gamePanel:Panel) = async { 
    (*redraw gemaPanel *) 
    lock gamePanel (fun() -> 
     let graphics = gamePanel.CreateGraphics(); 
     let rectangle = new System.Drawing.Rectangle(100, 100, 200, 200); 
     graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle); 
    ) 
    return! gameLoop (gamePanel:Panel) 
    } 

let startGame (p:Panel) (p1:Panel) = hide p; Async.StartAsTask(gameLoop p1);() 

Если я добавлю async, этот цикл не будет выполнен. Если я сделаю эту синхронизацию цикла, она будет работать вечно.

Что я хочу, чтобы иметь цикл, который будет работать все время во втором потоке и будет перерисовывать игру каждые 30 мс и обрабатывать ключевые события.

ответ

4

Вы должны использовать Async.RunSynchronously в startGame фактически пнуть асинхр:

let startGame (p:Panel) (p1:Panel) = hide p; Async.RunSynchronously (gameLoop p1) 
+0

ОК ТНХ. Я использовал Async.StartAsTask, потому что у меня был тупик, который выполнялся синхронно. – Luffy

+0

Смысл - я ошибочно предположил, что вы хотите дождаться его завершения в 'startGame'. –