be bounce2 norefresh white=rgb 1 1 1 setsc white cs ht ; setUpdateGraph false ball stones explosions court bat _setPos ball::r forever [ explosions::draw ball::move dispatchMessages bat::move updateGraph gc if (or key? court::stonesNr==0 ball::balls==0) [stop] ] be ball r=(list 0 -200) phi=180.0*rnd velocity=5*2200/mips ;so the speed should be machine-independent v=(list velocity*cos phi velocity*sin phi) ballrad=25 girth=ballrad blue=rgb 0 0 .5 balls=3 be move _setpos r noball r=r+v if or r.1 < -400+ballrad r.1 > 400-ballrad [ v.1=-v.1 r.1=r.1+v.1 ] if r.2 > 300-ballrad [ v.2= -v.2 r.2=r.2+v.2 ] if r.2 < -300+ballrad [ balls=balls-1 v.2= -v.2 r.2=r.2+v.2 playWave "C:\\Windows\\Media\\ding.wav 1 ] reflect=false repeat int girth [ phi=repcount/girth*360 _setPos r+(list cos phi sin phi)*ballrad if pixel != white [ if not reflect [ reflect=true phistart=phi rpos=pos abspos=rpos+(list 400 -299-stones::size) ] phiend=phi ] ] if reflect [ phi=(phiend+phistart)/2 n=(list cos phi sin phi) p=n*(0+n*v) o=v-p v=o-p stonepos=rpos-(mod abspos stones::size) if (stonepos.2) > -200 [ explosions::exlist=fput (list stonepos 1) explosions::exlist court::stonesNr-=1 ] ] _setPos r draw end be circ size pd fillellipse size size pu end be noball setpc white setfc white circ ballrad end be draw setpc blue setfc blue circ ballrad end end be stones cs size=50 Nr=8 stone=Array Nr repeat Nr [ hue=360*repcount/Nr setpc hsb hue 1 1 setfc hsb hue 1 1 myfrbox size stone.repcount=bitCopy size size ] setpc white setfc white myfrbox size nostone=bitCopy size size end be myfrbox size pu rt 45 fd size/(sqrt 2) lt 45 pd (frBox size) pu lt 135 fd size/(sqrt 2) rt 135 pd end be explosions Nr=50 size=stones::size bmp=Array Nr exlist=[] red=rgb 1 0 0 repeat Nr-1 [ cs setpc red setfc red smallfrbox size size*(1-repcount/(Nr+1)) bmp.repcount=bitCopy size size ] cs bmp.Nr=bitCopy size size be draw keep=[] foreach exlist [ _setpos first ? n=last ? bitPaste bmp.n if n < Nr [ setItem 2 ? n+1 keep=fput ? keep ] ] exlist=keep end end be smallfrbox size size2 pu rt 45 fd size/sqrt 2 lt 45 pd (frBox size2) pu lt 135 fd size/sqrt 2 rt 135 pd end be court cs pu size=stones::size _setpos list -400 299-size setheading 90 sx=int 800/size sy=int 400/size stonesNr=0 repeat sy [ repeat sx [ b=stones::stone.(1+mod repcount stones::Nr) bitPaste b ;stone.(1+mod repcount differentStones) stonesNr=stonesNr+1 fd size ] bk sx*size rt 90 fd size lt 90 ] end be bat batpos=[0 -270] red=rgb 1 0 0 setHeading 0 be nobat setpc white setfc white pd fillellipse 50 10 pu end be draw setpc red setfc red pd fillellipse 50 10 pu end be move if batpos != mousePos [ _setpos batpos nobat batpos.1=mousePos.1 _setpos batpos draw ] end end end