13 Ağustos 2020 Perşembe

QuickBasic - 19: Grafik işlemleri-7

Yayınlama: 25 Temmuz 2020
Güncelleme: 13 Ağustos 2020

GET

Dosya işlemlerinde kullanılan GET komutundan farklı olarak grafik işlemlerinde kullanılan farklı bir GET komutu vardır. Kullanımları farklıdır.
Kullanımı:
GET [STEP] (x1-y1)-[STEP](x2,y2),değişkenadı[(indeks)]
Ekran üzerinde x1,y1 ile x2,y2 dikdörtgeni içinde kalan görüntü bilgisi belirtilen boyutlu değişkenadı'na aktarılır. Değişkene aktarılan görüntü PUT komutu ile ekranın istenilen konumuna basılır(aktarılır).

STEP : Göreceli koordinat kullanmak içindir. Bir önceki komutun aktif noktası 0,0 kabul edilir.
(x1,y1) : seçim alanı başlangıç köşe noktası
(x2,y2) : seçim alanı bitiş karşı köşe noktası
değişkenadı : Görüntü bilgilerinin aktarılacağı çok boyutlu değişken. Değişken boyutu görüntü bilgilerini aktaracak büyüklükte olmalıdır aksi halde GET komutu çalıştırılmaz. Illegal function call hatası verir.

Boyutun ne kadar olacağını hesaplamak için kullanılan formül QuickBasic yardım'da verilmiştir.
4+INT(((x2-x1+1)*(düzlemdeki pikselin bit sayısı)+7)/8)*düzlem*((y2-y1)+1)
Ekran

Modu
Bir düzlemdeki bir

pikselin bit sayısı
Düzlem

(Ekran sayfası)
1 2 1
2 1 1
7 1 4
8 1 4
9 1 2
10 1 2
11 1 1
12 1 4
13 8 1
Örneğin, SCREEN 2, sol üst köşe (0,0) sağ alt köşe (32,32) için değişkenin bayt cinsinden gerekli boyutu:
= 4 + INT ((33 * 1 + 7) / 8) * 1 * (33)
Sonuç = 169 bayt.

Bu 85 elemanlı INTEGER(2 bayt) bir değişken görüntüyü aktarmak için yeterli olacaktır.
INTEGER değişken yerine LONG, SINGLE veya DOUBLE değişken türü de kullanılabilir. Değişkenin türünün bellekte kapladığı bayt miktarına göre eleman sayısı değişir. Formülden çıkan sonuç değişken türü bayt miktarına bölünür.

INTEGER için Sonuç / 2
LONG için Sonuç / 4
SINGLE için Sonuç / 4
DOUBLE için için Sonuç / 8

Örnek:
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
SCREEN 1
' bayt sayısı = 4+int(((32-0+1)*2+7)/8)*1*((32-0)+1)
' bayt sayısı = 301
' integer için 301/2 = 151
' DIM a(150) AS INTEGER '0 dahil toplam 151
' long için 301/4 = 76
' DIM a(75) AS LONG
' single için 301/4 = 76
' DIM a(75) AS SINGLE
' double için 301/8 = 38
DIM a(37) AS DOUBLE

CIRCLE (16, 16), 16, 2, , , 1
PAINT STEP(0, 0), 1, 2
CIRCLE (16, 16), 10, 0, , , 1
PAINT STEP(0, 0), 2, 0
CIRCLE (12, 13), 4, 3, , , 1
PAINT STEP(0, 0), 3, 3
GET (0, 0)-(32, 32), a
PUT (40, 0), a
PUT (73, 0), a
PUT (40, 0), a, XOR

PUT

Dosya işlemlerinde kullanılan PUT komutunun grafik işlemlerinde kullanılan farklı bir kullanımı daha vardır.

Kullanımı:
PUT [STEP](x,y), değişkenadı[(indeks)], baskıyöntemi
GET komutu ile değişkene aktarılan görüntü PUT komutu ile (x,y) koordinatına basılır.
STEP : Göreceli koordinat kullanmak içindir. Bir önceki komutun aktif noktası 0,0 kabul edilir.

baskıyöntemi: 5 değişik baskı yöntemi vardır
XOR : Bellekteki görüntü piksel bayt değeri ekran üzerinde bulunan piksel bayt değeri ile XOR işlemine tabi tutulur. baskıyöntemi belirtilmediğinde varsayılan olarak XOR kullanılır.
XOR ile basılan görüntü üzerine tekrar XOR ile baskı yapıldığında görüntü silinmiş olur. Oyunlarda görüntü hareket ettirileceğinde eski konumdaki görüntüyü silmek için de kullanılır.
OR: Görüntü bayt değeri ile ekran bayt değeri OR işlemine tabi tutulur
AND: Görüntü bayt değeri ile ekran bayt değeri AND işlemine tabi tutulur.
Mantıksal karşılaştırma tablosu için Bölüm 4: Kontrol blokları sayfasına bakınız.
PSET: Görüntü olduğu gibi basılır.
PRESET: Renkler ters çevrilerek basılır.

Örnek 1: PUT ile görüntü döşeme
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DEFINT A-Z
DIM top(222)
SCREEN 13
FOR n = 10 TO 3 STEP -1
    r = n + 280
    CIRCLE (10, 10), n, r, , , 1
    PAINT (10, 10), r, r
NEXT
GET (0, 0)-(20, 20), top

CLS
WHILE x < 300
  FOR y = 0 TO 170 STEP 36
    PUT (x, y), top
    PUT (x + 11, y + 18), top
  NEXT
  x = x + 20
WEND

Örnek 2:
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DEFINT A-Z
DIM top(222)
SCREEN 13
FOR n = 10 TO 3 STEP -1
    r = n + 280 'renk belirle
    CIRCLE (10, 10), n, r, , , 1 'daire çiz
    PAINT (10, 10), r, r 'daire içini boya
NEXT
GET (0, 0)-(20, 20), top 'oluşan görüntü bilgisini değişkene aktar
CLS 'ekranı sil
COLOR 11
LOCATE 12, 12: PRINT "Bir tuşa basınız"
COLOR 12
LOCATE 14, 13: PRINT "Çıkış için ESC"
LINE (84, 80)-(220, 120), 14, B
x = 160: y = 50 ' top başlangıç konumu
xa = 1 'x yönünde artış/azalış
ya = 1 'y yönünde artış/azalış
DO
    x = x + xa
    y = y + ya
    IF x >= 299 OR x <= 0 THEN xa = -xa
    IF y >= 179 OR y <= 0 THEN ya = -ya
    PUT (x, y), top, XOR 'görüntüyü bas
    SLEEP
    PUT (x, y), top, XOR
LOOP UNTIL INKEY$ = CHR$(27) 'ESC

Örnek 3: Yön tuşları ile görüntü hareket ettirme
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DEFINT A-Z
DIM top(222)
DIM tus AS STRING
CONST Asagi = "P", Yukari = "H", Sola = "K", Saga = "M"
CONST maxX = 299, maxY = 179
SCREEN 13
FOR n = 10 TO 3 STEP -1
    r = n + 290
    CIRCLE (10, 10), n, r, , , 1
    PAINT (10, 10), r, r
NEXT
GET (0, 0)-(20, 20), top
CLS
COLOR 14
PRINT "Yön tuşları ile hareket ettirin"
COLOR 12
PRINT "Çıkış için ESC"
x = RND * 200: y = RND * 100
xa = 5 'x yönünde ilerleme mesafesi
ya = 5 'y yönünde ilerleme mesafesi
DO
    no = 1
    tus = RIGHT$(INKEY$, 1)
    SELECT CASE tus
        CASE Sola 'Sol yön tuşu
            x = x - xa
            IF x < 0 THEN x = 0
        CASE Saga 'Sağ yön tuşu
            x = x + xa
            IF x > maxX THEN x = maxX
        CASE Asagi 'Aşağı yön tuşu
            y = y + ya
            IF y > maxY THEN y = maxY
        CASE Yukari 'Yukarı yön tuşu
            y = y - ya
            IF y < 0 THEN y = 0
        CASE CHR$(27) 'ESC tuşu
            EXIT DO
        CASE ELSE  'Diğer tuşlar
            no = 0
    END SELECT
    IF no = 1 THEN
        CLS
        PUT (x, y), top, XOR
    END IF
LOOP

BSAVE

Bellekte tutulan değişken içeriğini bir dosyaya kaydeder.

Kullanımı:
BSAVE dosyaadı, ofset, uzunluk
dosyaadı: Kaydedilecek dosyanın konumu, dosya adı ve uzantısı belirtilir. Konum belirtilmezse varsayılan konuma kaydedilir.
ofset : Varsayılan bellek segmentinin ofset(pointer) adresi. BSAVE kullanılmadan önce DEF SEG komutu ile kaydedilecek değişkenin segment adresi ayarlanmalıdır.
uzunluk : kaç bayt uzunluğunda veri kaydedilecekse o belirtilir.

Örnek:
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DEFINT A-Z 'türü belirtilmemiş tüm değişkenler INTEGER
DIM top(222) '0 dahil 223 elemanlıdır. integer(2 bayt)
SCREEN 13
FOR n = 10 TO 3 STEP -1
    r = n + 290
    CIRCLE (10, 10), n, r, , , 1 'iç içe daire
    PAINT (10, 10), r, r ' daire içini boya
NEXT
GET (0, 0)-(20, 20), top 'top değişkenine ekran verileri aktarılır
DEF SEG = VARSEG(top(0)) 'segment, top değişkeninin segmentine ayarlanır
BSAVE "c:\top.grf", VARPTR(top(0)), 223 * 2
' top değişkeni 223 elemanlıdır
' integer veri 2 bayt yer kapladığı için
' 223 * 2 = 446 baytlık veri saklar
DEF SEG 'varsayılan segment

BLOAD

BSAVE ile kaydedilmiş görüntü dosyası içeriği bellekte yer açılmış değişkene aktarılır(yüklenir)

Kullanımı:
BLOAD dosyaadı, [,ofset]
dosyaadı: Yüklenecek dosyanın konumu, adı ve uzantısı belirtilir. Konum belirtilmezse dosya varsayılan konumda aranır.
ofset: Varsayılan bellek segmentinin ofset(pointer) adresi. BLOAD kullanılmadan önce DEF SEG komutu ile kaydedilecek değişkenin segment adresi ayarlanmalıdır.

Örnek:
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DIM top(222) AS INTEGER
SCREEN 13
DEF SEG = VARSEG(top(0)) 'segment, top değişkeninin segmentine ayarlanır
BLOAD "c:\top.grf", VARPTR(top(0)) 'dosya içeriği top değişkenine aktarılır
DEF SEG 'varsayılan segment
PUT (50, 50), top 'dosyadan top değişkenine aktarılan görüntüyü ekran bas
PUT (80, 80), top

Ekran görüntüsünü kaydetme ve yükleme

' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
DEFINT A-Z
CONST dosya$ = "ekran.img"
SCREEN 13
FOR n = 1 TO 350
    r = RND * 15 + 1
    LINE (160, 200)-(RND * 320, RND * 200), r
    CIRCLE STEP(0, 0), 4, r, , , 1
    CIRCLE STEP(0, 0), 6, RND * 5 + 10, , , 1
    CIRCLE STEP(0, 0), 7, r, , , 1
NEXT
DEF SEG = &HA000 'Ekran bellek segment adresi
BSAVE dosya$, 0, 64000 '320*200 = 64000 bayt
PRINT "Ekran kaydedildi"
SLEEP
PRINT "Ekran silinecek"
SLEEP: CLS
PRINT "Kaydedilen ekran yüklenecek"
SLEEP
BLOAD dosya$ 'dosyadaki görüntü ekrana
DEF SEG 'varsayılan segment
SLEEP

PCOPY

Çoklu sayfaya sahip ekran modlarında bir sayfa görüntüsünü diğerine kopyalar.

Kullanımı:
PCOPY kaynaksayfa, hedefsayfa
SCREEN 0, 7, 8, 9 ve 10 çoklu sayfa özelliğine sahiptir.
Çizim ve yazım işlemlerinin görünmeyen bir ekran sayfasında hazırlanıp PCOPY ile görünen ekrana kopyalanması görüntülemede hız kazandırır.

Ayrıca çizim veya yazım işlem basamakları görünmeyen ekranda hazırlayıp sonuç ekran görüntüsünü ekranda göstermek daha hoş olacaktır.

Örnek 1:
SCREEN 0, , 7, 0 ' 8 sayfa
SCREEN 7, , 7, 0 ' 8 sayfa
SCREEN 8, , 3, 0 ' 4 sayfa
SCREEN 9, , 1, 0 '2 sayfa
SCREEN 10, , 1, 0 '2 sayfa
Örnek 2:
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DEFINT A-Z
CLS
PRINT "Ekranlar hazırlanıyor"
SCREEN 0, , 1, 0 'aktif sayfa:1, görünen sayfa:0
FOR n = 1 TO 2000
    COLOR RND * 15 + 1
    PRINT "X";
NEXT
LOCATE 1: COLOR 29: PRINT "Sayfa 1"

SCREEN 0, , 2, 0 'aktif sayfa:2, görünen sayfa:0
FOR n = 1 TO 2000
    COLOR RND * 15 + 1
    PRINT CHR$(219);
NEXT
LOCATE 1: COLOR 30: PRINT "Sayfa 2"

SCREEN 0, , 3, 0 'aktif sayfa:3, görünen sayfa:0
FOR n = 1 TO 2000
    COLOR RND * 15 + 1
    PRINT "A";
NEXT
LOCATE 1: COLOR 28: PRINT "Sayfa 3"

SCREEN 0, , 4, 0 'aktif sayfa:4, görünen sayfa:0
FOR n = 1 TO 2000
    COLOR RND * 15 + 1
    PRINT "*";
NEXT
LOCATE 1: COLOR 28: PRINT "Sayfa 4"

SCREEN 0, , 0, 0 'aktif sayfa:0, görünen sayfa:0
PRINT "Ekranlar hazır. Bir tuşa basınız"
SLEEP
PCOPY 1, 0 '1. sayfayı 0. sayfaya kopyala
SLEEP
PCOPY 2, 0 '2. sayfayı 0. sayfaya kopyala
SLEEP
PCOPY 3, 0 '3. sayfayı 0. sayfaya kopyala
SLEEP
PCOPY 4, 0 '4. sayfayı 0. sayfaya kopyala
SLEEP

Örnek 3:
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
DEFINT A-Z
DIM halka(127), halkaZemin(127)
SCREEN 7, , 0
LOCATE 12, 14: PRINT "Bekleyiniz..."
SCREEN 7, , 1, 0 ' çizim ekranı:1, görüntü ekranı:0
COLOR , 1
FOR n = 1 TO 1000
    LINE (160, 100)-(RND * 320, RND * 200), n MOD 15
NEXT

SCREEN 7, , 2, 0' çizim ekranı:2, görüntü ekranı:0
FOR n = 15 TO 10 STEP -1 'halka çizimi
    r = n - 1
    IF n = 10 THEN r = 0
    CIRCLE (10, 10), n - 5, r, , , 1
    PAINT (10, 10), r, r
NEXT
LINE (21, 0)-(41, 20), 15, BF 'zemin çizimi
CIRCLE (31, 10), 10, 0, , , 1
CIRCLE (31, 10), 6, 0, , , 1
PAINT (31, 2), 0, 0

GET (0, 0)-(20, 20), halka
GET (21, 0)-(41, 20), halkaZemin

x = RND * 200: y = RND * 100
hiz = 4
xa = hiz 'x yönünde değişim
ya = hiz 'y yönünde değişim
DO
    x = x + xa 'x konumunu değiştir
    IF x >= 300 - hiz THEN x = 300 - hiz: xa = -hiz
    IF x <= 0 THEN x = 0: xa = hiz
   
    y = y + ya 'y konumunu değiştir
    IF y >= 180 - hiz THEN y = 180 - hiz: ya = -hiz
    IF y <= 0 THEN y = 0: ya = hiz

    PCOPY 1, 2 '1 numaralı ekranı 2 numaralı ekrana kopyala
    SCREEN 7, , 2, 0' çizim ekranı:2, görüntü ekranı:0
    PUT (x, y), halkaZemin, AND
    PUT (x, y), halka, XOR
    PCOPY 2, 0 '2 numaralı ekranı 0 numaralı ekrana kopyala
    
    FOR n = 1 TO 1000: NEXT
    IF INKEY$ <> "" THEN SLEEP 'Bir tuş ile duraklat
LOOP UNTIL INKEY$ = CHR$(27) 'ESC = Çıkış



Önceki Bölüm: 18: Grafik işlemleri-6 Sonraki Bölüm: 20: Fare (mouse) kullanımı-1

Hiç yorum yok:

Yorum Gönder