What is an object?
For an official definition see: http://searchsoa.techtarget.com/definition/object
This sounds like gobblty-gook to a proceedural programmer.
An object is really just a sub-program and group of sub-routines that can be called from the main program.
Yab Being a BASIC language, and therefore to a yab programmer, the idea of objects seems foreign, but as a yab programmer, one uses objects.
All of the GUI bindings in yab are objects.
WINDOW OPEN x1,y1 TO x2,y2, ID$, Title$
This is a call to create a window object, it creates a new window object, gives it its boundries, and identifies it.
WINDOW SET WindowID$, "MoveTo", x,y
Is a call to the window object named WindowID$, this one moves the window object to a new location.
OK, we have established that yab programmers use objects. These are, however part of the yab interpreter. now, lets define and use an object in yab.
Our object will be a di for a game that needs one to roll the dice.
Since objects are often re-used, that is the whole ides of objects, it makes sense to use a yab library file for our object.
First is the class, a definition of what a di object is and what it can do.
a Di:
A di object is usually a representation of a six faced physical object.
The number of faces can be different depending on the need for the particular game, but four is the minimum.
Each face can have a letter, number, word, color, picture, or a number of dots, etc.
A di can:
Show one of the faces.
Be shaken and rolled ( randomly pick another face and show it.)
Be interogated for the number of the face.
now for the code:
name the file di.yab and place it in the yab library folder:
either
/boot/home/config/settings/yab
- (PM Haiku)
or/boot/home/cinfig/lib/yab
- ( pre PM haiku)
//______________________________________________
//copy the lines below for the di object (di.yab)
//______________________________________________
doc an object programmed in yab
doc to demonstrate the idea of programming an
doc object in a proceedural language.
doc
doc by Jim Saxton, April 10, 2014, MIT license
// we need a subroutine to make a new di object
// num, field() and field$() do not need to be known by the calling program.
export sub di_new$(sides, id$,x,y, view$)
static num
if num = 0 then
bitmap 680,680, "Di"
err = draw image 0,0 to 675,450, "/boot/home/Dice.png", "Di"
end if
num=num+1
dim field$(num,2) // id$, view$
dim field (num, 3) // sides,x,y
// set the default number of sides if sides < 4 sides = 6
field$ (num,1)=id$
field$ (num,2)=view$
field (num,1)=sides
field (num,1)=sides
field (num,2)=x
field (num,3)=y
VIEW x,y TO x+225,y+225, id$, view$
for n=1 to field(num,1)
switch n
case 1
x=0:y=0
break
case 2
x=225:y=0
break
case 3
x=450:y=0
break
case 4
x=0:y=225
break
case 5
x=225:y=225
break
case 6
x=450: y=225
break
// This may be modified to allow for more sides than 6.
// If so, the image file and Di bitmap need to be changed as well.
//
// The bitmap needs to be larger than the image or the bitmap get will
// error with "out of bounds" once your di face is at an edge of the image.
end switch
bitmap get x,y to x+225, y+225,str$(n),"Di"
next
// seed the random generator
x1 = ran(num+1)
// roll the di and chose a side
field (num,0) = int(ran(sides))+1
//The info for the new di object is saved, return "ok"
return "ok"
end sub
//________________________________________________
export sub di_get_face(id$)
s=arraysize(field$(),1)
for x=1 to s
if (field$(x,1)=id$) num = x
next
return field(num,0)
end sub
//________________________________________________
export sub di_show_face(id$)
n = di_get_face(id$)
DRAW BITMAP 0,0, str$(n), "copy", id$
end sub
//________________________________________________
export sub di_roll(id$)
s=arraysize(field$(),1)
for x=1 to s
if (field$(x,1)=id$) num = x
next
field (num,0) = int(ran(field(num,1)))+1
di_show_face(id$)
return
end sub
//________________________________________________
This object was set-up for a six-sided di, but could be easilly expanded to all sorts of di, say for D&D, etc.
The object relies on a hard-coded path to /boot/home/Dice.png. This could deasilly be changed to use a path relative to the program location.
I used http://upload.wikimedia.org/wikipedia/commons/4/4c/Dice.png and slightly re-sized it to 675 X 450 for the dice face image.
each di face is 225 X 225
To test the object:
Copy the lines below into "Roll-Dice.yab"
#!yab
import di
doc a test program
doc to test the di.yab object.
doc It never uses one of the exported subs, di_get_face,
doc but di_show_face does.
doc
doc Jim Saxton, April 10, 2014, MIT license
// set DEBUG = 1 to print out all messages on the console
DEBUG = 0
sleep .01
OpenWindow()
di_show_face("first")
di_show_face("second")
// Main Message Loop
dim msg$(1)
while(not leavingLoop)
nCommands = token(message$, msg$(), "|")
for everyCommand = 1 to nCommands
if(DEBUG and msg$(everyCommand)<>"") print msg$(everyCommand)
switch(msg$(everyCommand))
case "roll":
di_roll("first")
di_roll("second")
break
case "_QuitRequested":
case "MainWindow:_QuitRequested":
leavingLoop = true
break
default:
break
end switch
next everyCommand
wend
CloseWindow()
end
// Setup the main window here
sub OpenWindow()
window open 100,100 to 570,365, "MainWindow", "Main Window"
di_new$(6,"first",10,10,"MainWindow")
di_new$(6,"second",235,10,"MainWindow")
BUTTON 10,238 TO 460,263, "roll", "R O L L", "MainWindow"
return
end sub
// Close down the main window
sub CloseWindow()
window close "MainWindow"
return
end sub
Here you can download the complete code: Archive
Made available by BeSly, the Haiku, BeOS and Zeta knowledge base.