Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Scheme: SDL_ttf ja tekstin rivitys

arcatan [16.06.2006 14:47:02]

#

Minulle tuli tarve tulostaa rivitettyä tekstiä SDL_ttf:n avulla. Oheinen draw-text -funktio hoitaa homman. Teksti tulostetaan sana sanalta siten, että tekstin leveys on aina pienempi kuin annettu leveys pikseleinä paitsi silloin, jos jokin sana on pidempi kuin leveys. Tällöin tämä sana piirretään omalle rivilleen niin pitkänä kuin se nyt sitten on.

Kieli on Scheme ja kääntäjänä käytin Chickeniä. Lisäksi tarvitaan Chickenin SDL-laajennus. Koodi ei tämän takia varmaankaan toimi suoraan muilla implementaatioilla. Myöskään string-splitiä ei välttämättä ole suoraan tarjolla (eräs versio). Älkää olko minulle kovin ankaria, tämä on ensimmäisestä Scheme-ohjelmastani!

Listaus

(require-extension sdl)

;; Kopioitu Ohjelmointiputkan SDL-oppaasta

(define blit-image
  (lambda
    (screen image x y)
    (sdl-blit-surface image #f screen (make-sdl-rect x y 0 0))))

;; Pieni apufunktio draw-textin helpottamiseksi, palauttaa annetun
;; tekstin leveyden kyseisellä fontilla.

(define text-width
  (lambda
    (font text)
    (let ((rect (make-sdl-rect 0 0 0 0)))
      (ttf-size-text! font text rect)
      (sdl-rect-w rect))))

;; Piirtää tekstiä rivitetysti, leveys korkeintaan width

(define draw-text
  (lambda
    (screen font text start-x start-y width color)
    (let ((space (text-width font " ")))
      (let draw-words ((words (string-split text)) (x start-x) (y start-y) (first? #t))
        (if (null? words) 'done
            (let* ((surface (ttf-render-text-blended font (car words) color))
                  (w (text-width font (car words)))
                  (wrap? (and (> (+ x w) (+ start-x width)) (not first?)))
                  (neu-x (if wrap? start-x x))
                  (neu-y (if wrap? (+ y (ttf-font-height font)) y)))
              (blit-image screen surface neu-x neu-y)
              (sdl-free-surface surface)
              (draw-words (cdr words) (+ neu-x w space) neu-y #f)))))))

;; Esimerkki

(sdl-init SDL_INIT_VIDEO)
(define naytto (sdl-set-video-mode 640 480 0 (+ SDL_HWSURFACE SDL_DOUBLEBUF)))

(ttf-init)
(define fontti (ttf-open-font "VeraSe.ttf" 48))

(define max-width 260)  ; piirretään korkeintaan 260 pikseliä leveä teksti

(sdl-fill-rect naytto (make-sdl-rect 10 10 max-width 470)
               (make-sdl-color 100 100 100))

(draw-text naytto fontti "Muutosmielinen hassu majava nautti ison punaisen tomaatin."
           10 10 max-width (make-sdl-color 255 200 200))

(sdl-flip naytto)

(sdl-delay 5000)

(sdl-free-surface naytto)
(ttf-close-font fontti)

(sdl-quit)

ZcMander [20.06.2006 23:29:48]

#

SDL-laajennus osoittaa samaan linkkiin, onko tämä tarkoitus? Ei tuolta sivuilta löytynyt mitään SDL:llään liittyvää

Olisikohan oikeampi linkki tämä: http://www.call-with-current-continuation.org/eggs/sdl.html

arcatan [03.07.2006 08:44:48]

#

Aivan, kiitos. Korjasin linkin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta