Salut !
Cela fait quelques temps que j'apprend Haskell, le plus dur étant de se débarasser de son style impératif . Je voulais, pour l'expérience, faire un système de sélection de groupe (comme dans les jeux de stratégies à la Age Of Empire) : en gros, un rectangle qui se dessine selon une sélection faite à la souris. Mon code est le suivant (très court) :
(désolé pour la structure du module peu travaillée, mais je voulais faire ça rapidement [avant de tomber sur mon problème] ).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 module Main where import Graphics.HGL import Control.Concurrent(forkIO,killThread) rect :: Point -> Point -> Graphic rect (x,y) (x1,y1) = polygon [(x,y),(x1,y),(x1,y1),(x,y1)] waitMove w s = do e <- getWindowEvent w case e of MouseMove{pt=p} -> do drawInWindow w $ rect s p waitMove w s Button{pt=p,isLeft=left,isDown=down} | not down -> return () -- button released _ -> waitMove w s waitPress w = do e <- getWindowEvent w case e of Button{pt=p,isLeft=left,isDown=down} | down -> waitMove w p _ -> waitPress w loop :: Window -> IO () loop w = do waitPress w loop w main :: IO () main = runGraphics $ withWindow_ "Select" (600,600) $ \w->do id <- forkIO (loop w) getKey w killThread id
Si je n'utilise pas forkIO, aucun problème : le rectangle se dessine selon les mouvements de la souris, et s'arrête dès que je relâche le bouton. Mais si j'utilise le threading (ce qui serait le cas si un jour je voulais inclure ce module dans un logiciel), rien ne va plus : les clics sont rarement pris en compte, le relâchement de la souris presque jamais, etc...
Alors de deux choses l'une :
- soit le multithreading n'est pas adapté à ce que je veux faire, auquel cas je me demande bien comment les développeurs font pour que le jeu continue pendant la sélection
- soit je ne sais pas me servir du multithreading, ce qui est probable puisque je n'ai aucune expérience en la matière
Notez également que j'ai tenté d'utiliser forkOS à la place, mais sans succès.
J'espère que vous pourrez m'aider,
<Zer0>
Partager