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