#IDCMP_RAWKEY = $0400
#WFLG_ACTIVATE = $1000
#WFLG_BORDERLESS = $0800
finito.b = False
NEWTYPE.xy
x.w
y.w
End NEWTYPE
Dim tri.xy(3)
DEFTYPE.Screen *wb
DEFTYPE.w
;---------------------------------------------------
; ustawiam ekran WB jako widoczny
WbToScreen 0
ShowScreen 0
; ten program mozna wystartowac z ikonki
WBStartup
; okno CLI zostanie schowane
NoCli
; pobieram informacje o ekranie by moc dostosowac rozmiar okna
*wb = LockPubScreen_(0)
If *wb
ww=*wb\Width
wh=*wb\Height-*wb\BarHeight-1
wy=*wb\BarHeight+1
UnlockPubScreen_ 0,*wb
Else
End
EndIf
; wyliczam trojkat
th = wh-4
ta = 2*th/Sqr(3)
tri(0)\x = ww/2, (wh-th)/2
tri(1)\x = (ww-ta)/2+ta, (wh-th)/2+th
tri(2)\x = (ww-ta)/2, (wh-th)/2+th
; otwieram okno
Window 1,0,wy,ww,wh,#WFLG_BORDERLESS|#WFLG_ACTIVATE,"",1,2
; losuje punkt srtartowy w oknie
rp.xy\x = Rnd(ww-1),Rnd(wh-1)
; glowna petla programu
; ESC konczy dzialanie calosci
Repeat
; jesli ESC zostal presniety to finito
If Event=#IDCMP_RAWKEY
rk$=Inkey$
If RawKey = $45 Then finito = True
EndIf
; losuje wierzcholek
p.b = Rnd(3)
; obliczam kolejny punkt startowy na podstawie wylosowanego wierzcholka
rp\x = (rp\x+tri(p)\x)/2, (rp\y+tri(p)\y)/2
; rysuje punkt
WPlot rp\x,rp\y,1
Until finito
End@peceha, post #1
finito.b = False
NEWTYPE.xy
x.w
y.w
End NEWTYPE
Dim tri.xy(3)
Dim tags.TagItem(7)
DEFTYPE.Screen *wb
DEFTYPE.Window *win
DEFTYPE.IntuiMessage *msg
DEFTYPE.w
;---------------------------------------------------
WBStartup
NoCli
*wb = LockPubScreen_(0)
If *wb
tags(0)\ti_Tag = #WA_Left, 0
tags(1)\ti_Tag = #WA_Top, *wb\BarHeight+1
tags(2)\ti_Tag = #WA_Width, *wb\Width
tags(3)\ti_Tag = #WA_Height, *wb\Height-*wb\BarHeight-1
tags(4)\ti_Tag = #WA_Flags, #WFLG_BORDERLESS|#WFLG_ACTIVATE
tags(5)\ti_Tag = #WA_IDCMP, #IDCMP_RAWKEY
tags(6)\ti_Tag = #TAG_DONE, 0
*win=OpenWindowTagList_(0,&tags(0))
UnlockPubScreen_ 0,*wb
If *win=0 Then End
Else
End
EndIf
ScreenToFront_(*wb)
; wyliczam trojkat
th = tags(3)\ti_Data-4
ta = 2*th/Sqr(3)
tri(0)\x = tags(2)\ti_Data/2, (tags(3)\ti_Data-th)/2
tri(1)\x = (tags(2)\ti_Data-ta)/2+ta, (tags(3)\ti_Data-th)/2+th
tri(2)\x = (tags(2)\ti_Data-ta)/2, (tags(3)\ti_Data-th)/2+th
; losuje punkt srtartowy w oknie
rp.xy\x = Rnd(ww-1),Rnd(wh-1)
Repeat
*msg = GetMsg_(*win\UserPort)
While *msg
If *msg\Class = #IDCMP_RAWKEY
If *msg\Code = $45 Then finito = True
EndIf
ReplyMsg_(*msg)
*msg = GetMsg_(*win\UserPort)
Wend
; losuje wierzcholek
p.b = Rnd(3)
; obliczam kolejny punkt startowy
rp\x = (rp\x+tri(p)\x)/2, (rp\y+tri(p)\y)/2
; rysuje punkt
Move_ *win\RPort,rp\x,rp\y
Draw_ *win\RPort,rp\x,rp\y
Until finito
CloseWindow_(*win)
End@peceha, post #2
/* Minimalny kod startowy */
void _start()
{
struct Process *p = NULL;
struct WBStartup *wbmsg = NULL;
SysBase = *(struct ExecBase **)4UL;
p = (struct Process *)SysBase->ThisTask;
if (p->pr_CLI == 0)
{
WaitPort(&p->pr_MsgPort);
wbmsg = (struct WBStartup *)GetMsg(&p->pr_MsgPort);
}
main();
if (wbmsg)
{
Forbid();
ReplyMsg((struct Message *)wbmsg);
}
}*p = *eBase\ThisTask If( *p\pr_CLI = 0 ) WaitPort_( *p\pr_MsgPort ) *wbmsg = GetMsg_( *p\pr_MsgPort ) EndIf If( *wbmsg ) Forbid_ ReplyMsg_( *wbmsg ) EndIf
@peceha, post #3
Czy ktos moglby napisac co ten /* minimalny kod startowy */ robi linia po lini (szczegolnie Forbid_ bo tego jeszcze wogole nie ruszalem?http://krashan.ppa.pl/mpp/wlasny-kod-startowy
@peceha, post #3
@pisklak, post #6
Ekspertem nie jestem ale czy za tym Forbid() nie powinien iść w parze Permit() ?
A druga sprawa to czy nie można wogóle zrezygnować z tego kodu startowego jeśli binarka będzie odpalana z CLI ?