#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 ?