Virhekohdan visualisointi oli wanhassa versiossa kohtuullisen huono, mutta olen koittanut siihen nyt panostaa enemmän. Debug loki vastaa paremmin koodia ja käyttäjän ei tarvitse lukea läpi monta kertaa samoja rivejä löytääkseen virhekohdan lokitiedostosta.
Esimerkiksi tälläisellä koodilla:
Code: Select all
//debugger messes up default directory
'DEBUG chdir("..")
SCREEN 500, 400
Dim Colour(10,10,2,1)//kuvien tiedot
Smooth2D ON
katto = LoadImage("media/map.bmp")
ResizeImage katto, 202,152
runko = MakeImage(200,150)
MaskImage runko, 255,0,255
DrawToImage runko //piirretään talo
Color 255,0,255
Box 0,0,200,150
Color 0,0,0
Box 0,0,75,5
Box 120,0,80,5
Box 0,145,80,5
Box 120,145,80,5
Box 0,0,5,150
Box 196,0,5,150
DrawToScreen
ruoho = MakeObjectFloor ()
nurmikko = LoadImage ("Media\grass.bmp")
lehmä = LoadImage("media\cow.bmp")
Color 123,90,0
Box 50,50,200,150 //piirretään lattia
Color 0,0,0
For i =1 To 250 Step 10 //lattia viivat
Line i,50,i, 200
Next i
DrawImage runko, 50,50
DrawImage lehmä, 70,70
DrawImage lehmä, 170,120
ExploreImage(katto,49,49) //analysoidaan rakennusta
Cls
Color 255,255,255
CenterText 250,200, "20%",2 // merkitään lataus
DrawScreen
Cls
Dim Talo(10)
a# = 0.0
For i=0 To 10
talo(i) = OpacityImage(katto,a) //eri näkyvyysarvot
CenterText 250,200, (20 + i*7) + "%",2 // merkitään lataus
DrawScreen
a = a+0.1
Next i
MaskImage talo(0), 255, 0, 255
PaintObject ruoho, nurmikko
mUkko = LoadImage("media/soldier.bmp")
Dim ukko(3)
For i= 0 To 360 Step 90
ukko(i/90) = CloneImage(mUkko)
RotateImage ukko(i/90), i
Next i
posX = 450
posY = 350
u = 2
Repeat
DrawGame
If KeyDown(205) //könkkö liikutettavuus =D
posX = posX + 1
u = 0
ElseIf KeyDown(203)
posX = posX - 1
u = 2
ElseIf KeyDown(200)
posY = posY - 1
u = 3
ElseIf KeyDown(208)
posY = posY + 1
u =1
EndIf
If posX > 45 And posX < 260 And posY > 45 And posY < 205 //talon sisällä
i = 0
Else
i = Min(Distance(posX, posY, 150, 125)/39,10) //näkyvyysarvo
EndIf
DrawImage talo(i), 49,49
DrawImage ukko(u), posX, posY
DrawScreen
Forever
//esivalmistellaan kuvaa...
Function ExploreImage(pic,picX,picY)
picW = ImageWidth(pic)
picH = ImageHeight(pic)
ReDim Colour(picW,picH-10,2,1)//laitettaan taulukko uuten kokoon
Lock()
For x = 1 To picW
For y = 1 To picH+5
pixel = GetPixel2(pixel *12 + x +2, picY + y -55) //otettaan tausta talteen
Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
Next y
Next x
Unlock()
DrawToImage pic
Lock()
For x = 1 To picW
For y = 1 To picH
pixel = GetPixel2(x,y) //otetaan itse kuva talteen
Colour(x,y,0,1) = ((pixel Shl (1*8)) Shr 24)
Colour(x,y,1,1) = ((pixel Shl (2*8)) Shr 24)
Colour(x,y,2,1) = ((pixel Shl (3*8)) Shr 24)
Next y
Next x
Unlock()
DrawToScreen
EndFunction
//luodaan kuva
Function OpacityImage(pic,op#)
op = 1-op
picW = ImageWidth(pic)
picH = ImageHeight(pic)
newPic = MakeImage(picW,picH)
DrawToImage newPic
Lock()
For x = 1 To picW
For y=1 To picH
R = Colour(x,y,0,1)
G = Colour(x,y,1,1)
B = Colour(x,y,2,1)
ColorR = R+(Colour(x,y,0,0) -R)*op //yhdistetään värit
ColorG = G+(Colour(x,y,1,0) -G)*op
ColorB = B+(Colour(x,y,2,0) -B)*op
PutPixel2 x,y, (ColorB + ColorR Shl 16 + ColorG Shl 8) //pistettään se kasaan
Next y
Next x
Unlock()
DrawToScreen
Return newPic
EndFunction
tuottaa debugger tälläisen lokitiedoston:
Code: Select all
3: ´DEBUG chdir(¨..¨)
4: SCREEN 500, 400
6: Dim Colour(10,10,2,1)//kuvien tiedot
8: Smooth2D ON
10: katto = LoadImage(¨media/map.bmp¨)
11: ResizeImage katto, 202,152
13: runko = MakeImage(200,150)
14: MaskImage runko, 255,0,255
15: DrawToImage runko //piirretään talo
16: Color 255,0,255
17: Box 0,0,200,150
18: Color 0,0,0
19: Box 0,0,75,5
20: Box 120,0,80,5
21: Box 0,145,80,5
22: Box 120,145,80,5
23: Box 0,0,5,150
24: Box 196,0,5,150
25: DrawToScreen
27: ruoho = MakeObjectFloor ()
28: nurmikko = LoadImage (¨Media\grass.bmp¨)
29: lehmä = LoadImage(¨media\cow.bmp¨)
31: Color 123,90,0
32: Box 50,50,200,150 //piirretään lattia
33: Color 0,0,0
34: For i =1 To 250 Step 10 //lattia viivat
35: Line i,50,i, 200
36: Next i
37: DrawImage runko, 50,50
38: DrawImage lehmä, 70,70
39: DrawImage lehmä, 170,120
109: Function ExploreImage(pic,picX,picY)
110: picW = ImageWidth(pic)
111: picH = ImageHeight(pic)
112: ReDim Colour(picW,picH-10,2,1)//laitettaan taulukko uuten kokoon
114: Lock()
115: For x = 1 To picW
116: For y = 1 To picH+5
Error! 117: pixel = GetPixel2(pixel *12 + x +2, picY + y -55) //otettaan tausta talteen
118: Colour(x,y,0,0) = ((pixel Shl (1*8)) Shr 24)
119: Colour(x,y,1,0) = ((pixel Shl (2*8)) Shr 24)
120: Colour(x,y,2,0) = ((pixel Shl (3*8)) Shr 24)
121: Next y
'DEBUG merkkijono koodirivin alussa kertoo että tämä rivi suoritetaan vain debugatessa.
'DEBUGSTART ja 'DEBUGEND aloittavat/jatkavat ja lopettavat debuggauksen siitä kohtaa koodia. Tällöin voidaan debugata vain kohtia
jotka ovat virheherkkiä. Debuggaus kuitenkin verottaa jonkinverran suorituskykyä joten siinäkin mielessä on järkevää valita missä kohtaa koodia debuggausta käytetään. Oletuksena debuggaus kuitenkin tehdään koko koodille, alusta loppuun.
Käyttö:
1. Pura tiedostot paketin IDE kansiosta CoolBasicin IDE kansioon.
2. Mikäli CoolBasic on asennettu johonkin muuhun polkuun kuin C:\Program Files\ niin joudut muokkaamaan plugins.ini tiedoston polut vastaaviksi.
3. Aja koodi normaalisti (F5).
4. Sulje ohjelma.
5. Aja Debugger eli valitse Tools -> Debugger.
6. Odota MAVia tai muuta virhettä tai sulje ohjelma halutessasi.
7. Avaa lokitiedost eli valitse Tools -> Debug Log
8. Aloita tarvittaessa uudelleen kohdasta 3.
Jatkokehitys:
Koska oikean rivin tietäminen ei aina ole tarpeeksi vaan halutaan tietää mikä virheeseen johti olisi tarkoituksena myöhemmin jalostaa Debuggeria siten että se osaisi näyttää vaikkapa muuttujien arvot suoritetuilla riveillä tai näin mahdollisesti suoraan kertoa esim. että "objektin/muistipalan/kuvan arvo on nolla, oletkohan poistanut sen?" Tai jopa suoraan kertoa missä sitä on muokattu.
Kehitysideoita otetaan vastaan ja jos innostusta riittää niin paketista löytyy nykyisen version koodi ja sitähän voi aina vain parantaa.
EDIT: Päivitin versiota 8.1.2011:
- Osaa nyt hakea ohjelman polun automaattisesti, kiitos mainiosta vinkistä misthema!
- Varattujen sanojen (If, Return, Function, yms..) tuki on parempi, kaikki suorittamatta jääneet rivit eivät jää nyt erroriksi ja rivin lokiinkirjoituskohtaa on muutettu hieman