52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 321

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 321

openWindow (Size width height) [] Window

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