Yayınlama: 25 Temmuz 2020
Güncelleme: 13 Ağustos 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.
Sonuç = 169 bayt.
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.
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
Ç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.
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
'©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