52700.fb2
windowTitle $= title
clearColor $= Color4 1 1 1 1
windowCloseCallback $= exitWith ExitSuccess
loop
loop = do
display
loop
display = do
clear [ColorBuffer]
swapBuffers
Мы инициализируем GLFW, задаём параметры окна. Устанавливаем цвет фона. Цвет имеет четыре пара-
метра это RGB-цвета и параметр прозрачности. Затем мы говорим, что программе делать при закрытии окна.
Мы устанавливаем функцию обратного вызова (callback) windowCloseCallback. В самом конце мы входим в
цикл, который только и делает, что стирает окно цветом фона и делает рабочий буфер видимым. Что такое
буфер? Буфер – это место в котором мы рисуем. У нас есть два буфера. Один мы показываем пользователю,
а в другом в это в время рисуем, когда приходит время обновлять картинку мы просто меняем их местами
командой swapBuffers.
Посмотрим, что у нас получилось:
$ ghc --make HelloOpenGL.hs
$ ./HelloOpenGL
Нарисуем упрощённое начальное положение нашей игры: прямоугольную рамку и в ней – красный шар:
290 | Глава 20: Императивное программирование
module Main where
import Graphics.UI.GLFW
import Graphics.Rendering.OpenGL
import System.Exit
title = ”Hello OpenGL”
width, height :: GLsizei
width
= 700
height
= 600
w2, h2 :: GLfloat
w2 = (fromIntegral $ width) / 2
h2 = (fromIntegral $ height)
/ 2
dw2, dh2 :: GLdouble
dw2 = fromRational $ toRational w2
dh2 = fromRational $ toRational h2
main = do
initialize
openWindow (Size width height) [] Window
windowTitle $= title
clearColor $= Color4 1 1 1 1
ortho (-dw2-50) (dw2+50) (-dh2-50) (dh2+50) (-1) 1
windowCloseCallback $= exitWith ExitSuccess
windowSizeCallback
$= (\size -> viewport $= (Position 0 0, size))
loop