Warning: strpos() [function.strpos]: needle is not a string or an integer in /home/wahyukur/public_html/blog/index.php on line 41

Warning: strpos() [function.strpos]: needle is not a string or an integer in /home/wahyukur/public_html/blog/index.php on line 48

Warning: strpos() [function.strpos]: needle is not a string or an integer in /home/wahyukur/public_html/blog/index.php on line 61
Welcome to Wahyu Kurniawan's Blog - Membuat Program Bel Sekolah dengan VB (Bag I)
Membuat Program Bel Sekolah dengan VB (Bag I) 
Jika dulu waktu kita masih di SMP/SMA, bel masuk sekolah ataupun istirahat masih berupa lonceng yang dipukul, ataupun bel elektronik yang harus dipencet, sekarang bel sekolah sudah bisa diautomatisasi dengan komputer. Dalam kesempatan ini, kita akan mencoba membuat program bel musik sekolah dari Visual Basic. Untuk tampilan awal programnya adalah sebagai berikut:



jadi dalam keadaan running, kita akan memanfaatkan object timer dari VB untuk mengecek atau memeriksa waktu yang ada. Jika sama dengan waktu yang sudah didefinisikan sebelumnya, maka program akan memainkan musik, yang jika disambungkan ke amplifyer dan speaker, akan berbunyi ke seluruh lingkungan sekolah.
Untuk definisi waktu ganti jam pelajaran, jam masuk ataupun jam pulang, dianjurkan menyimpan data-datanya ke dalam database agar mudah dicustomisasi. hal ini sangat penting dilakukan karena musik yang digunakan sebagai pertanda masuk, ganti jam, istirahat ataupun jam pulang bisa jadi adalah musik yang berbeda. Jika kita perhatikan, menu utama program ini ada empat tombol, yaitu:
1. Pause - untuk menghentikan program sementara
2. Time Schedule - untuk mengubah nilai jam yang tersimpan di dalam database
3. Adjustment - untuk mengubah jam
4. Exit - keluar program

untuk time schedule, akan menampilkan tampilan sebagai berikut:



jika kita perhatikan, ada perbedaan jam antara hari biasa dan jumat, dimana hari jumat siswa akan pulang lebih awal. Untuk kasus-kasus tertentu, program dapat dengan mudah dicustomisasi, yang nantinya akan dicek harinya, dan akan mengikuti jadwal hari yang bersesuaian.
Sedangkan untuk adjustment, kita akan dapat mengubah jamnya jika tidak cocok atau perlu diubah.



by: Wahyu Kurniawan

[ add comment ] ( 1052 views )   |  permalink  |   ( 3 / 276 )
Solusi: SQL Server does not exist or access denied 
Anda programmer VB? Pastilah anda familiar dengan MS SQL Server sebagai database untuk program aplikasi anda. Untuk keperluan multi user, MS SQL dapat digunakan sebagai salah satu alternatif database.
Sayangnya, dalam beberapa kasus, saya menjumpai bahwa ada terminal yang tidak dapat melakukan koneksi dengan SQL Server. ERROR yang keluar adalah "SQL Server does not exist or access denied"
Ini bisa jadi adalah sebuah bug di MS SQL yang dikenal dengan SQL Slammer Worm.
Sewaktu searching di internet ternyata banyak juga yang mengalami hal yang sama. Solusinya ternyata sederhana, buka website Microsoft.com dan download SQL Critical Update (SQLCritUpdPkg_ENU.exe). Ini semacam patch untuk memproteksi kita dari SQL Slammer Worm. Download filenya disini http://www.microsoft.com/downloads/deta ... laylang=en

[ add comment ] ( 949 views )   |  permalink  |   ( 3.2 / 219 )
Capture Sprite dari Game (Bag III) 
Akhirnya kita dapat sprite yang bisa kita pakai dan kita gunakan dalam program kita. Dengan cara yang sama, kita dapat mengambil object2 untuk sprite kita dari bermacam2 source. Sebagai percobaan saya mengambil beberapa sprite Marle… temennya si Chrono dalam game Chrono
Trigger. Berikut programnya:

‘Load Gambar Marle
‘Taken from CHRONO TRIGGER

CLEAR
DEFINT A-Z

CONST Path$ = “”

‘11 x 32
OPEN Path$ + “Marle1.shp” FOR INPUT AS #1
DIM SHARED Marle1(200): FOR i = 0 TO 200: INPUT #1, Marle1(i): NEXT: CLOSE #1
‘40 x 11
OPEN Path$ + “Marle2.shp” FOR INPUT AS #1
DIM SHARED Marle2(248): FOR i = 0 TO 248: INPUT #1, Marle2(i): NEXT: CLOSE #1
‘14 x 24
OPEN Path$ + “Marle3.shp” FOR INPUT AS #1
DIM SHARED Marle3(189): FOR i = 0 TO 189: INPUT #1, Marle3(i): NEXT: CLOSE #1
‘20 x 24
OPEN Path$ + “Marle4.shp” FOR INPUT AS #1
DIM SHARED Marle4(264): FOR i = 0 TO 264: INPUT #1, Marle4(i): NEXT: CLOSE #1
‘10 x 31
OPEN Path$ + “Marle5.shp” FOR INPUT AS #1
DIM SHARED Marle5(178): FOR i = 0 TO 178: INPUT #1, Marle5(i): NEXT: CLOSE #1
‘15 x 28
OPEN Path$ + “Marle6.shp” FOR INPUT AS #1
DIM SHARED Marle6(234): FOR i = 0 TO 234: INPUT #1, Marle6(i): NEXT: CLOSE #1
‘14 x 31
OPEN Path$ + “Marle7.shp” FOR INPUT AS #1
DIM SHARED Marle7(242): FOR i = 0 TO 242: INPUT #1, Marle7(i): NEXT: CLOSE #1
‘14 x 31
OPEN Path$ + “Marle8.shp” FOR INPUT AS #1
DIM SHARED Marle8(242): FOR i = 0 TO 242: INPUT #1, Marle8(i): NEXT: CLOSE #1
‘18 x 22
OPEN Path$ + “Marle9.shp” FOR INPUT AS #1
DIM SHARED Marle9(220): FOR i = 0 TO 220: INPUT #1, Marle9(i): NEXT: CLOSE #1
‘17 x 27
OPEN Path$ + “Marle10.shp” FOR INPUT AS #1
DIM SHARED Marle10(254): FOR i = 0 TO 254: INPUT #1, Marle10(i): NEXT: CLOSE #1

‘15 x 32
OPEN Path$ + “Marler.shp” FOR INPUT AS #1
DIM SHARED marler(266): FOR i = 0 TO 266: INPUT #1, marler(i): NEXT: CLOSE #1
‘17 x 32
OPEN Path$ + “Marler1.shp” FOR INPUT AS #1
DIM SHARED marler1(299): FOR i = 0 TO 299: INPUT #1, marler1(i): NEXT: CLOSE #1
‘18 x 30
OPEN Path$ + “Marler2.shp” FOR INPUT AS #1
DIM SHARED marler2(296): FOR i = 0 TO 296: INPUT #1, marler2(i): NEXT: CLOSE #1
‘18 x 32
OPEN Path$ + “Marler3.shp” FOR INPUT AS #1
DIM SHARED marler3(315): FOR i = 0 TO 315: INPUT #1, marler3(i): NEXT: CLOSE #1
‘17 x 32
OPEN Path$ + “Marler4.shp” FOR INPUT AS #1
DIM SHARED marler4(299): FOR i = 0 TO 299: INPUT #1, marler4(i): NEXT: CLOSE #1
‘18 x 31
OPEN Path$ + “Marler5.shp” FOR INPUT AS #1
DIM SHARED marler5(306): FOR i = 0 TO 306: INPUT #1, marler5(i): NEXT: CLOSE #1
‘19 x 32
OPEN Path$ + “Marler6.shp” FOR INPUT AS #1
DIM SHARED marler6(332): FOR i = 0 TO 332: INPUT #1, marler6(i): NEXT: CLOSE #1

SCREEN 13
CLS
PUT (10, 30), Marle2
PUT (55, 17), Marle3
PUT (75, 17), Marle4
PUT (100, 13), Marle6
PUT (120, 9), Marle1
PUT (140, 10), Marle5
PUT (160, 10), Marle7
PUT (180, 10), Marle8
PUT (200, 19), Marle9
PUT (220, 10), Marle10

PUT (10, 50), marler
PUT (30, 50), marler1
PUT (50, 50), marler2
PUT (70, 50), marler3
PUT (90, 50), marler4
PUT (110, 50), marler5
PUT (130, 50), marler6

a$ = INPUT$(1)
‘ Buat Animasi Marle meloncat-loncat
CLS
DO
PUT (150, 29), Marle9
FOR j = 1 TO 1000: FOR k = 1 TO 6000: NEXT: NEXT
PUT (150, 29), Marle9
PUT (160, 10), Marle10
FOR j = 1 TO 1000: FOR k = 1 TO 6000: NEXT: NEXT
PUT (160, 10), Marle10
LOOP UNTIL INKEY$ = CHR$(13)

‘Animasi berjalan

x.pos = 10: y.pos = 50
x.old = x.pos: y.old = y.pos
x.ofset = 4: y.ofset = 4
delay = 1800

PUT (x.pos, y.pos), marler

main:
a$ = INKEY$
IF a$ = “” THEN GOTO main
IF LEN(a$) <> 2 THEN GOSUB not.arrow
keyb = ASC(RIGHT$(a$, 1))
‘IF keyb = 72 THEN GOSUB atas
‘IF keyb = 75 THEN GOSUB kiri
IF keyb = 77 THEN GOSUB kanan
‘IF keyb = 80 THEN GOSUB bawah

‘clean the keyboard buffer before go back to main loop
DEF SEG = &H40
POKE &H1A, PEEK(&H1C)

GOTO main

kanan:
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler1
FOR z = 1 TO delay: FOR y = 1 TO delay: NEXT: NEXT
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler1
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler2
FOR z = 1 TO delay: FOR y = 1 TO delay: NEXT: NEXT
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler2
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler3
FOR z = 1 TO delay: FOR y = 1 TO delay: NEXT: NEXT
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler3
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler4
FOR z = 1 TO delay: FOR y = 1 TO delay: NEXT: NEXT
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler4
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler5
FOR z = 1 TO delay: FOR y = 1 TO delay: NEXT: NEXT
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler5
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler6
FOR z = 1 TO delay: FOR y = 1 TO delay: NEXT: NEXT
‘hapus spritenya
oldx.pos = x.pos: oldy.pos = y.pos
PUT (oldx.pos, oldy.pos), marler6
x.pos = x.pos + x.ofset
‘letakkan di posisi baru
PUT (x.pos, y.pos), marler
‘RETURN

not.arrow:
‘Jika ditekan tombol q maka program akan berhenti
IF a$ = “q” THEN
WIDTH 80
SCREEN 0
COLOR 7, 0
CLS
END
END IF
RETURN


Pada scene pertama, saya hanya meletakkan semua sprite secara statis, istilahnya diPUT aja, tanpa animasi. Lalu scene berikutnya, saya gambarkan animasi Marle meloncat2, sprite ini saya dapatkan sewaktu Marle menang melawan musuh2nya.
Sekarang bagian animasi berjalannya… kalo diperhatikan satu kali dia berjalan, terdiri dari 6 buah sprite.semakin banyak sprite
untuk sebuah gerakan, maka gerakannya akan keliatan bagus dan asli, kalo di game rosetta, saya hanya menggunakan 2 buah sprite, itupun sprite yang sama, hanya kakinya aja yang letaknya berbeda. jadi kurang bagus …
Penggunaan INKEY$ sebagai fungsi pembacaan keyboard tidak direkomendasikan oleh pakar2nya game, tapi saya rasa saya akan coba memakai INKEY$. Nah, sekarang yang jadi masalah neh… pada saat kita menekan tombol kanan, program akan lari ke subrutin memPUT sprite sebanyak 6 buah. Jika user menekan tombol kanan terus menerus, hal ini akan mengakibatkan keyboard buffer penuh, sehingga hasil animasi tidak akan sesuai dengan yang diharapkan user, yaitu pada saat user sudah
melepas tombol, sprite akan tetap berjalan. kenapa bisa gitu? karena pada saat itu, masih ada sisa instruksi yang disimpan di buffer keyboard. trus caranya gimana? pemikiran saya gini… kita harus memberikan perintah untuk mengosongkan buffer keyboard pada saat kembali ke looping utama. Dan ternyata bisa dilakukan dengan memberikan perintah ini;
DEF SEG = &H40
POKE &H1A, PEEK(&H1C)
Lega deh… akhirnya ketemu solusinya, walaupun ngga bagus2 amat, tapi lumayanlah. untuk mengaplikasikan animasi ini untuk deteksi tubrukan, mungkin akan timbul masalah baru dengan pembersihan keyboard buffernya…

[ add comment ] ( 393 views )   |  permalink  |   ( 2.9 / 187 )
Capture Sprite dari Game (Bag II) 
Berbicara ttg game memang ngga ada habis2nya. Beberapa game yang sempat populer pada jaman DOS dulu diantaranya adalah serial King’s Quest buatan SIERRA yang sampe sekarang melegenda (bener enggak sih?). Ada juga game Quest for Glory, juga dari Sierra. Grafiknya sangat memukau (untuk masa itu tentunya…). Saya jadi inget pertama kali main King’s Quest III, saya main di Disket aja, waktu itu masih ada disket ukuran 5.25&#8243;, sekarang disket model gini keliatannya dah pensiun deh… pinjem dari temen saya sebangku waktu SMA. wah asyik deh pokoknya…
Ok jadi saya sampai pada satu pertanyaan, kenapa gambar hasil konversi BMP kok bisa berubah total ancur2an saat dijadikan SHP di QBasic. Jawabannya adalah karena sistem palet yang dipakai tidak sama… wah apa sih palet itu? Palet itu bisa digambarkan seperti seorang pelukis. Nah pelukis biasanya kan pake kanvas kalo melukis, selain itu dia juga butuh sebuah wadah untuk mengoleskan cat2nya yang nantinya dicampur untuk lukisannya. wadah ini biasa disebut palet.

Dalam pengertian program kita, palet itu suatu sistem warna yang digunakan dalam game kita. Pengertian 256 warna sebenarnya bukan berarti hanya maksimal 256 warna saja yang dapat kita pakai. Melainkan, lebih dari itu! Kita dapat menggunakan warna2 yang beraneka ragam. Hanya saja, dalam satu waktu, kita hanya diijinkan menggunakan warna sebanyak 256 saja.

Berikut ini program untuk menampilkan sistem palet default:

SCREEN 13 ‘ Set graphics mode

j% = 0
FOR i% = 0 TO 255
COLOR i%
PRINT “Color ” + STR$(i%)
IF j% MOD 20 = 0 THEN key$ = INPUT$(1)
j% = j% + 1
NEXT


disini kita nanti akan liat warna2 dari 0 sampai dengan 255 dengan menggunakan sistem palet default. Untuk file BMP yang kita habis capture, kita liat dulu statistiknya, baik informasi file BMPnya maupun informasi paletnya. Pertama2 kita intip dulu informasi2 di file BMPnya, tujuannya kita akan membuat statistik dari kode warna yang digunakan. Karena masing2 disimpan di dalam byte, maka nilainya pasti antara 0 sampai 255. berikut adalah program Informasi BMP-nya …

‘Read Information from BMP

TYPE BMPHeaderType
ID AS STRING * 2 ‘Should be “BM”
size AS LONG ‘Size of the data
rr1 AS INTEGER ‘
rr2 AS INTEGER ‘
Offset AS LONG ‘Position of start of pixel data
horz AS LONG ‘
wid AS LONG ‘Image width
hei AS LONG ‘Image height
Planes AS INTEGER ‘
bpp AS INTEGER ‘Should read 8 for a 256 colour image
pakbyte AS LONG ‘
imagebytes AS LONG ‘Width*Height
xres AS LONG ‘
yres AS LONG ‘
colch AS LONG ‘
ic AS LONG ‘
pal AS STRING * 1024 ‘Stored as
END TYPE

DIM BmpHeader AS BMPHeaderType

filename$ = “marlex.bmp”
OPEN filename$ FOR BINARY AS #1

GET #1, , BmpHeader

COLOR 15, 0
SCREEN 0
CLS

PRINT “File .BMP Information”
PRINT “Filename : “, filename$
PRINT “BMP ID : “, BmpHeader.ID
PRINT “Size in bytes : “, BmpHeader.size
PRINT “RR1 : “, BmpHeader.rr1
PRINT “RR2 : “, BmpHeader.rr2
PRINT “Horz : “, BmpHeader.horz
PRINT “Start Offset : “, BmpHeader.Offset
PRINT “Total Planes : “, BmpHeader.Planes
PRINT “BitPerPlanes : “, BmpHeader.bpp
PRINT “X-Res : “, BmpHeader.xres
PRINT “Y-Res : “, BmpHeader.yres
PRINT “Width : “, BmpHeader.wid
PRINT “Height : “, BmpHeader.hei
PRINT “Image Bytes : “, BmpHeader.imagebytes
PRINT “Pak Bytes : “, BmpHeader.pakbyte
PRINT “Colch : “, BmpHeader.colch
PRINT “IC : “, BmpHeader.ic

key$ = INPUT$(1)

a$ = BmpHeader.pal

CLS
PRINT “Palette Information”

j% = 1
FOR I% = 1 TO 1024 STEP 4
PRINT “Pallete ” + STR$(j%) + ” : “;
b% = ASC(MID$(a$, I%, 1)) \ 4 ‘blue
PRINT b%;
g% = ASC(MID$(a$, I% + 1, 1)) \ 4 ‘green
PRINT g%;
r% = ASC(MID$(a$, I% + 2, 1)) \ 4 ‘red
PRINT r%
j% = j% + 1
IF j% MOD 20 = 0 THEN key$ = INPUT$(1)
NEXT

key$ = INPUT$(1)

DIM warna(255) AS INTEGER

DIM pixel AS STRING * 1 ‘ Our pixel “byte”.

iHeight% = BmpHeader.hei - 1 ‘ Subtract 1 for actual screen position
iWidth% = BmpHeader.wid - 1 ‘

cnt = 1

FOR y% = iHeight% TO 0 STEP -1 ‘ Countdown for upsidedown image
FOR x% = 0 TO iWidth%

GET #1, , pixel ‘ read pixel ‘ Read one pixel (byte)
warna(ASC(pixel)) = warna(ASC(pixel)) + 1

PRINT cnt; ” ” + pixel + ” “; ASC(pixel) ‘ Pixel is actually a string so we get the pixel
‘ number by requesting the “ASC” value
cnt = cnt + 1

NEXT x%, y%

CLOSE #1

key$ = INPUT$(1)

CLS
PRINT “Image Statistics”
m = 0
n = 1
FOR l = 0 TO 255
IF warna(l) <> 0 THEN
PRINT “Total Byte for color ” + STR$(l) + “: “, warna(l)
m = m + 1
END IF
n = n + 1
IF n MOD 20 = 0 THEN key$ = INPUT$(1)
NEXT
PRINT “Total used color : “; m

hehehe… output dari program ini akan menghasilkan nilai2 atau angka2 yang digunakan untuk membuat suatu sprite. jadi alasan kenapa gambar kita ancur sebenarnya sederhana. Karena sistem palet default berbeda dengan palet yang digunakan dalam file BMP. Oleh karena itu, jika didapatkan suatu nilai, warna yang dirujuk oleh nilai tersebut pada file BMP, akan berbeda dengan warna yang dirujuk pada palet yang default. Saya perlu menulis program lagi untuk membaca info palette dari file BMP kita:

TYPE BMPHeaderType
id AS STRING * 2 ‘Should be “BM”
size AS LONG ‘Size of the data
rr1 AS INTEGER ‘
rr2 AS INTEGER ‘
offset AS LONG ‘Position of start of pixel data
horz AS LONG ‘
wid AS LONG ‘Image width
hei AS LONG ‘Image height
planes AS INTEGER ‘
bpp AS INTEGER ‘Should read 8 for a 256 colour image
pakbyte AS LONG ‘
imagebytes AS LONG ‘Width*Height
xres AS LONG ‘
yres AS LONG ‘
colch AS LONG ‘
ic AS LONG ‘
pal AS STRING * 1024 ‘Stored as
END TYPE

DIM BmpHeader AS BMPHeaderType

OPEN “marler6.bmp” FOR BINARY AS #1

GET #1, , BmpHeader

SCREEN 13 ‘ Set graphics mode

a$ = BmpHeader.pal ‘ Pal is stored in a 1024 character string

OUT &H3C8, 0 ‘ Start writing from Colour 0
FOR i% = 1 TO 1024 STEP 4
B% = ASC(MID$(a$, i%, 1)) \ 4 ‘blue
g% = ASC(MID$(a$, i% + 1, 1)) \ 4 ‘green
r% = ASC(MID$(a$, i% + 2, 1)) \ 4 ‘red
‘ I% + 3 is set to zero.
OUT &H3C9, r% ‘ Set the colour.
OUT &H3C9, g%
OUT &H3C9, B%
NEXT
CLOSE #1

j% = 0
FOR i% = 0 TO 255
COLOR i%
PRINT “Color ” + STR$(i%)
IF j% MOD 20 = 0 THEN key$ = INPUT$(1)
j% = j% + 1
NEXT

dari sini akan keliatan semua warna2 yang digunakan. kalo saya bandingkan dengan warna2 pada palet default, akan keliatan berbeda. Nah, disini saya mengalami dilema, gimana yah? kalo saya mempertahankan palet default, gambarnya ancur2an deh. tapi kalo misalnya saya pake sistem palet dari BMP, saya hanya akan bisa mengambil sprite dari 1 source saja.
gini aja deh, pikir saya. Saya akan tetep pake palet yang default, tapi saya harus cari warna alternatif yang sama atau mendekati warna dari file BMP kita.

Saya lihat kembali program InfoBMP dan InfoPal, lalu saya buat list dari masing2 nilai warnanya, misal untuk warna kulit tubuh, warna rambut, warna baju dan sebagainya. Saya buka lagi Default Palette-nya dan saya cari nilai warna yang bersesuaian dari list saya.
Berikutnya saya tulis program untuk mengubah nilai2 di file BMP;

‘Edit BMP Files per pixel

TYPE BMPHeaderType
ID AS STRING * 2 ‘Should be “BM”
size AS LONG ‘Size of the data
rr1 AS INTEGER ‘
rr2 AS INTEGER ‘
Offset AS LONG ‘Position of start of pixel data
horz AS LONG ‘
wid AS LONG ‘Image width
hei AS LONG ‘Image height
Planes AS INTEGER ‘
bpp AS INTEGER ‘Should read 8 for a 256 colour image
pakbyte AS LONG ‘
imagebytes AS LONG ‘Width*Height
xres AS LONG ‘
yres AS LONG ‘
colch AS LONG ‘
ic AS LONG ‘
pal AS STRING * 1024 ‘Stored as
END TYPE

DIM BmpHeader AS BMPHeaderType

filename$ = “marler.bmp”
OPEN filename$ FOR BINARY AS #1

GET #1, , BmpHeader

COLOR 15, 0
SCREEN 0
CLS

a$ = BmpHeader.pal

j% = 1
FOR I% = 1 TO 1024 STEP 4
b% = ASC(MID$(a$, I%, 1)) \ 4 ‘blue
g% = ASC(MID$(a$, I% + 1, 1)) \ 4 ‘green
r% = ASC(MID$(a$, I% + 2, 1)) \ 4 ‘red
NEXT

INPUT “Please Enter Bytes Value : “, SeekByte
INPUT “Please Enter New Value : “, ChangeByte

DIM pixel AS STRING * 1 ‘ Our pixel “byte”.
cnt = 0

iHeight% = BmpHeader.hei - 1 ‘ Subtract 1 for actual screen position
iWidth% = BmpHeader.wid - 1 ‘

‘Check Bytes
Byte.Remind = BmpHeader.imagebytes - (BmpHeader.wid * BmpHeader.hei)
IF Byte.Remind > 0 THEN
‘This will applied if the image size = 640 bytes
iHeight% = 31
iWidth% = 19
END IF

FOR y% = iHeight% TO 0 STEP -1 ‘ Countdown for upsidedown image
FOR x% = 0 TO iWidth%

GET #1, , pixel ‘ read pixel ‘ Read one pixel (byte)

IF ASC(pixel) = SeekByte THEN
cnt = cnt + 1
PRINT cnt; ” Old Value : “; ASC(pixel)
’save old current pointer
oldpointer = SEEK(1)
PRINT “Byte Position : “; oldpointer
SEEK #1, oldpointer - 1
pixel = CHR$(ChangeByte)
PUT #1, , pixel
SEEK #1, oldpointer

END IF

NEXT x%, y%
PRINT “Has made ” + STR$(cnt) + ” Replacement…”

CLOSE #1


mudah2an ga seberapa rumit… sebenarnya programnya sama aja kok, saya perlu menggabung fungsi membuka file BMP ke dalam satu function biar ga repot.

Ok, pada dasarnya saya menggunakan perintah SEEK untuk memindah pointer pada file bertipe binary dan mencari value pada sebuah file binary. Tinggal dimasukkan saja nilai lamanya berapa, dan mau diganti berapa…
sampe disini, saya sudah bisa mengganti nilai2 file BMP untuk selanjutnya saya konversi pake BMP2SHP. Dan… file SHP-nya sudah bisa dipakai…

[ add comment ] ( 867 views )   |  permalink  |   ( 2.9 / 151 )
Capture Sprite dari Game (Bag I) 
Berbicara soal game selalu menyenangkan. Sebuah game, selain dari sisi pemrograman harus bagus, juga harus didukung dengan design world ato character yang bagus, supaya user yang main jadi seneng… apalagi kita yang bikin, wah puas deh. bermain game ama ngebuat game, emang lebih asyik ngebuatnya ok, trus kadang2 kita kan susah juga kalo musti gambar2 sendiri? apalagi pake sprite editor… untuk program Quest of Rosetta yang saya bikin, saya gambar spritenya langsung dengan sprite editor, makanya hasilnya kurang maksimal deh…
Nah, ada satu cara gimana kita bisa dapet sprite yang bagus2, kita bisa capture dari beberapa game lawas yang pernah ada. Yang kita perlukan hanyalah shapenya dan komposisi warnanya, yang nantinya akan kita konversi ke format gambar QBasic.
Apa aja yang kita butuhkan???
Tentunya butuh game yang akan dicapture yah… ada beberapa game yang lumayan grafiknya dan tentunya sesuai dengan kebutuhan yang akan kita pakai, mode 13 heksa… dan yang pasti bukan game yang jalan di windows. contohnya, kita bisa pake game2 dari SNES, salah satunya adalah game
Chrono Trigger yang terkenal itu. Nah untuk menjalankan SNES, kita butuh program emulatornya. Saya menggunakan program ZSNES untuk mengemulasi ROM SNES.
Kemudian, kita butuh suatu TSR program (Terminate and Stay Resident) yang bisa capture screen. Untuk program ini, saya menggunakan program GRAB, keluaran WordPerfect yang bisa residen di memory, trus hot-keynya pake Shift+Alt+F9, dan ENTER untuk proses capturenya
Keempat, proses capture akan disimpan di file berformat WPG (WordPerfect Graphic), jadi kita butuh file converter lagi untuk mengubah format gambar WPG ke format gambar BMP 256 warna, saya memakai file WPG2BMP, menghasilkan output file yang akurat…
Kelima, setelah jadi BMP, kita perlu convert lagi file ini ke SHP / file format gambar QBasic. Saya membuat file BMP2SHP untuk keperluan ini. Algoritmanya gampang sja… Kita akan meload file BMP-nya dulu, trus kita GET gambarnya dan save langsung ke format SHP.
Programnya seperti ini…

TYPE BMPHeaderType
id AS STRING * 2 ‘Should be “BM”
size AS LONG ‘Size of the data
rr1 AS INTEGER ‘
rr2 AS INTEGER ‘
offset AS LONG ‘Position of start of pixel data
horz AS LONG ‘
wid AS LONG ‘Image width
hei AS LONG ‘Image height
planes AS INTEGER ‘
bpp AS INTEGER ‘Should read 8 for a 256 colour image
pakbyte AS LONG ‘
imagebytes AS LONG ‘Width*Height
xres AS LONG ‘
yres AS LONG ‘
colch AS LONG ‘
ic AS LONG ‘
pal AS STRING * 1024 ‘Stored as
END TYPE

INPUT “Enter File name : “, file.name$

DIM BmpHeader AS BMPHeaderType

OPEN “marlex.bmp” FOR BINARY AS #1

GET #1, , BmpHeader

SCREEN 13 ‘ Set graphics mode

a$ = BmpHeader.pal ‘ Pal is stored in a 1024 character string

OUT &H3C8, 0 ‘ Start writing from Colour 0
FOR I% = 1 TO 1024 STEP 4
b% = ASC(MID$(a$, I%, 1)) \ 4 ‘blue
g% = ASC(MID$(a$, I% + 1, 1)) \ 4 ‘green
r% = ASC(MID$(a$, I% + 2, 1)) \ 4 ‘red
‘ I% + 3 is set to zero.
OUT &H3C9, r% ‘ Set the colour.
OUT &H3C9, g%
OUT &H3C9, b%
NEXT

DIM Pixel AS STRING * 1 ‘ Our pixel “byte”.

iHeight% = BmpHeader.hei - 1 ‘ Subtract 1 for actual screen position
iWidth% = BmpHeader.wid - 1 ‘

‘Check Bytes
Byte.Remind = BmpHeader.imagebytes - (BmpHeader.wid * BmpHeader.hei)
IF Byte.Remind > 0 THEN
‘This will applied if the image size = 640 bytes
iHeight% = 31
iWidth% = 15
END IF

key$ = INPUT$(1)

FOR y% = iHeight% TO 0 STEP -1 ‘ Countdown for upsidedown image
FOR x% = 0 TO iWidth%

GET #1, , Pixel ‘ read pixel ‘ Read one pixel (byte)
PSET (x%, y%), ASC(Pixel) ‘ Pixel is actually a string so we get the pixel
‘ number by requesting the “ASC” value
NEXT x%, y%

CLOSE #1

key$ = INPUT$(1)

‘Conversion Begin Here…
total.bytes = 4 + INT(((BmpHeader.wid + 1) * 8 + 7) / 8) * (BmpHeader.hei + 1)
ima.dim = INT(total.bytes / 2)
DIM main.ima(ima.dim) AS INTEGER
GET (0, 0)-(BmpHeader.wid - 1, BmpHeader.hei - 1), main.ima
file.shp$ = file.name$ + “.SHP”
OPEN file.shp$ FOR OUTPUT AS #1
FOR init = 0 TO ima.dim
WRITE #1, main.ima(init)
NEXT
CLOSE #1
PRINT “Conversion to .SHP has been applied successfully”


walaupun sudah jadi file SHP dan siap kita gunakan dalam program game ato animasi kita di QBasic, tapi kita mesti cek dulu apa gambar spritenya sesuai dengan yang kita harapkan? Untuk gambar BMPnya sudah cocok dan bagus… trus bagaimana dengan hasil konversinya? wowww kok ancur2an gitu? apa ada yang salah ya dari proses konversinya?
sebelum melangkah lebih jauh, kiat mestinya belajar dulu apa yang disebut dengan Palette…



[ add comment ] ( 877 views )   |  permalink  |   ( 2.9 / 154 )

<<First <Back | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | Next> Last>>