2013-10-30 26 views
5

這裏是我的一個小模式的代碼,看起來像這樣。 (不是我知道的最有效的代碼)。現在,我想讓stars使用animate進行旋轉。但我不知道如何在一個程序中同時使用displayanimate。任何幫助,將不勝感激。謝謝。在Haskell中使用光澤進行動畫製作

Gloss Image

import Graphics.Gloss 

main = display (InWindow "Gloss" (700,700) (0,0)) 
      black (picture 100) 
picture :: Float -> Picture 
picture 0 = text "Value cannot be 0" 
picture number = scale 6.5 6.5 (color rose $ drawpicture number) 

orangered, orangered2, orangered3 :: Color 
orangered = makeColor 1.0 0.251 0.0 0.7 
orangered2 = makeColor 1.0 0.251 0.0 0.5 
orangered3 = makeColor 1.0 0.251 0.0 0.3 

intervalsmall = [0,11.25,22.5,33.75,45,56.25,67.5,78.75] 
intervalbig = [0,22.5,45,67.5,90,112.5,135,157.5,180,202.5,225,247.5,270,292.5,315,337.5] 
xlist = [2,4..50] 
ylist = [0,2..48] 

squares = pictures[rotate x (line [(-50,0),(0,50),(50,0),(0,-50),(-50,0)]) | x <- intervalsmall] 
stars = pictures[rotate x ((pictures [line [(-8.5,0),(0,50),(8.5,0)],line[(0,50),(0,0)]])) | x <- intervalbig] 
grid = pictures[line [(0,y),(x,50)] | x <- xlist, y <- ylist, x-y==2] 
insidegrid = pictures[ 
    translate 0 (-50) grid, 
    rotate 90 (translate 0 (-50) grid), 
    rotate 180 (translate 0 (-50) grid), 
    rotate 270 (translate 0 (-50) grid)] 

drawpicture :: Float -> Picture 
drawpicture number = pictures [ 
    color red (pictures [circle 50,circle 8.5]), 
    line [(-50,-50),(-50,50),(50,50),(50,-50),(-50,-50)], 
    squares, 
    scale 0.7 0.7 squares, 
    scale 0.49 0.49 squares, 
    scale 0.347 0.347 squares, 
    scale 0.242 0.242 squares, 
    color orange stars, 
    color orange (scale 0.178 0.178 stars), 
    rotate 11.25 (scale 0.178 0.178 stars), 
    translate (-50) 0 grid, 
    rotate 90 (Translate (-50) 0 grid), 
    rotate 180 (Translate (-50) 0 grid), 
    rotate 270 (Translate (-50) 0 grid), 
    color orangered insidegrid, 
    color orangered2 (rotate 45 insidegrid), 
    color orangered3 (rotate 22.5 insidegrid), 
    color orangered3 (rotate 67.5 insidegrid) 
    ] 

回答

4

它很容易,如果你必須爲每個視覺元素單獨抽獎功能,但是基本的答案是:動畫,它只是使用animate功能和rotate圖像組件,你的願望「移動」:

import Graphics.Gloss 

main = animate (InWindow "Gloss" (700,700) (0,0)) 
      black picture 

picture :: Float -> Picture 
picture 0 = text "Value cannot be 0" 
picture number = scale 6.5 6.5 (color rose $ drawpicture number) 

orangered, orangered2, orangered3 :: Color 
orangered = makeColor 1.0 0.251 0.0 0.7 
orangered2 = makeColor 1.0 0.251 0.0 0.5 
orangered3 = makeColor 1.0 0.251 0.0 0.3 

intervalsmall = [0,11.25,22.5,33.75,45,56.25,67.5,78.75] 
intervalbig = [0,22.5,45,67.5,90,112.5,135,157.5,180,202.5,225,247.5,270,292.5,315,337.5] 
xlist = [2,4..50] 
ylist = [0,2..48] 

squares = pictures[rotate x (line [(-50,0),(0,50),(50,0),(0,-50),(-50,0)]) | x <- intervalsmall] 
stars = pictures[rotate x ((pictures [line [(-8.5,0),(0,50),(8.5,0)],line[(0,50),(0,0)]])) | x <- intervalbig] 
grid = pictures[line [(0,y),(x,50)] | x <- xlist, y <- ylist, x-y==2] 
insidegrid = pictures[ 
    translate 0 (-50) grid, 
    rotate 90 (translate 0 (-50) grid), 
    rotate 180 (translate 0 (-50) grid), 
    rotate 270 (translate 0 (-50) grid)] 

rotVal :: Float -> Float 
rotVal x = x - (x/(2*pi)) 

drawpicture :: Float -> Picture 
drawpicture number = pictures [ 
    rot $ color red (pictures [circle 50,circle 8.5]), 
    line [(-50,-50),(-50,50),(50,50),(50,-50),(-50,-50)], 
    rot $ squares, 
    rot $ scale 0.7 0.7 squares, 
    rot $ scale 0.49 0.49 squares, 
    rot $ scale 0.347 0.347 squares, 
    rot $ scale 0.242 0.242 squares, 
    rot $ color orange stars, 
    rot (color orange (scale 0.178 0.178 stars)), 
    rot (rotate 11.25 (scale 0.178 0.178 stars)), 
    translate (-50) 0 grid, 
    rotate 90 (Translate (-50) 0 grid), 
    rotate 180 (Translate (-50) 0 grid), 
    rotate 270 (Translate (-50) 0 grid), 
    rot $ color orangered insidegrid, 
    rot $ color orangered2 (rotate 45 insidegrid), 
    rot $ color orangered3 (rotate 22.5 insidegrid), 
    rot $ color orangered3 (rotate 67.5 insidegrid) 
    ] 
    where rot = rotate (rotVal number) 
0

實在是太多了,以寫出所有你,而你只需要添加其他參數您的圖片功能,這是一個Float並表示時間。所以display將被替換爲animate。所以。

main = animate (InWindow "Gloss" (700,700) (0,0)) 
      black (picture 100) 

picture :: Float -> Float -> Picture 
picture number time = -- whatever you have to do 

你必須改變你的幫助繪圖功能,把這個時間參數。假設你想旋轉整個想法一次5秒,你可以乘上這次來獲得一個角度angle = time*(pi*2/5)然後你可以使用這個角度來計算三角函數從中心計算新的x和y位置。

相關問題