Thanks Gernot - works a treat - down to 5ms now
D²O - your video card is obviously a tad better than mine!
D²O - your video card is obviously a tad better than mine!
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts Menu// --------------------------------- //
// USEASBMP bug
// --------------------------------- //
SETSCREEN 640,480,1
WHILE KEY(01)=FALSE
FOR loop=1 TO 100
SETPIXEL RND(640),RND(480),RGB(200,0,0)
NEXT
time1=GETTIMERALL()
USEASBMP
time=GETTIMERALL()-time1
PRINT "TIME TAKEN : "+time,0,460
SHOWSCREEN
WEND
I'm averaging around 1700ms for the USEASBMP command to work. Windowed makes no difference. Changing to 320x240 speeds it up to around 1680ms
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
// //
// Project: GLStarfield //
// //
// (C)opyright PeeJay 2008 www.peejays-remakes.co.uk //
// //
// A 3D Starfield with movement and motion blur - the full monty! :o) //
// //
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
SETSCREEN 640,480,0
LIMITFPS 60
GLOBAL ax,ay,az,axvel,ayvel,azvel,axacc,ayacc,azacc,cx,sx,cy,sy,cz,sz
TYPE star
x
y
z
zvel
prevx
prevy
ENDTYPE
GLOBAL stars[] AS star
SetupStars()
WHILE TRUE
axacc=axacc+((RND(12)-6)/10000)
ayacc=ayacc+((RND(12)-6)/10000)
azacc=azacc+((RND(12)-6)/10000)
axvel=axvel+axacc ; ayvel=ayvel+ayacc ; azvel=azvel+azacc
axacc=axacc*0.99 ; ayacc=ayacc*0.99 ; azacc=azacc*0.99
axvel=axvel*0.99 ; ayvel=ayvel*0.99 ; azvel=azvel*0.99
ax=(ax+axvel)*0.99 ; ay=(ay+ayvel)*0.99 ; az=(az+azvel)*0.99
cx=COS(ax) ; sx=SIN(ax) ; cy=COS(ay) ; sy=SIN(ay) ; cz=COS(az) ; sz=SIN(az)
DoStars()
WEND
END
FUNCTION SetupStars:
LOCAL loop
FOR loop=1 TO 300
LOCAL st AS star
st.x=RND(800)-400
st.y=RND(800)-400
st.z=100+RND(900)
st.zvel=RND(5)+0.5
st.prevx=-1000
st.prevy=0
DIMPUSH stars[],st
NEXT
ENDFUNCTION
FUNCTION DoStars:
LOCAL tx,tz,ty,tx2,x,y,xd,yd,bl,br
BLACKSCREEN
FOREACH st IN stars[]
IF st.prevx<0 OR st.prevx>640 OR st.prevy<0 OR st.prevy>480 OR st.z<1
st.x=RND(800)-400
st.y=RND(800)-400
st.z=100+RND(900)
st.zvel=RND(5)+0.5
st.prevx=-1000
st.prevy=0
ENDIF
st.z=st.z-st.zvel
tx=(st.x*cy)+(st.z*sy) ; tz=(st.z*cy)-(st.x*sy) ; ty=(st.y*cx)+(tz*sx)
tz=(tz*cx)-(st.y*sx) ; tx2=(tx*cz)+(ty*sz) ; ty=(ty*cz)-(tx*sz) ; tx=tx2
x=((tx/tz)*100)*3+320 ; y=((ty/tz)*100)*3+240
IF st.prevx=-1000
xd=0 ; yd=0 ; bl=1
ELSE
xd=x-st.prevx ; yd=y-st.prevy ; bl=SQR((xd*xd)+(yd*yd))
ENDIF
br=255-((st.z*255)/1000) ; br=(br*st.zvel)/6
IF bl>1 AND bl<50
DRAWLINE x,y,st.prevx,st.prevy,RGB(br,br,br)
ELSE
SETPIXEL x,y,RGB(br,br,br)
ENDIF
st.prevx=x ; st.prevy=y
NEXT
SHOWSCREEN
ENDFUNCTION
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
// //
// Project: Random Maze Generator Function for GLBasic //
// //
// (C)opyright PeeJay December 13th 2007 www.peejays-remakes.co.uk //
// bugfix January 21st 2008 //
// //
// Code is free to use for FREEWARE projects only, though credit would //
// still be welcomed if you decide to use it //
// //
// Please contact me through my website for conditions on using this //
// code in shareware, commercial, or other revenue generating projects //
// //
// This function will randomly generate a 2D map of practically any //
// size very quickly, storing the result in an array for ease of use //
// //
// I have used this code in DarkBasic, BlitzBasic, and now I offer it //
// to the GLBasic community. For the first time, I have reduced the //
// code to fit in one function for maximum simplicity //
// //
// Not surprisingly, the code is fairly complex - even more so by the //
// fact I've not added comments! However, it is a self contained, //
// robust, standalone function, so anyone should be able to use it //
// without needing to understand the methodology behind it //
// //
// The code will produce either an exact maze, or one that is more //
// open. An exact maze is defined as one where there is only one route //
// from any point in the maze to any other point in the maze //
// //
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
DIM maze[0][0]
DIM pjcos[4]
DIM pjsin[4]
LOCAL loop,loop1,time1,time2
WHILE TRUE
REDIM maze[0][0];REDIM maze[79][59] // Reset maze
time1=GETTIMERALL()
MakeMaze(maze[],1) // Maze (maze[] must be DIMed), exact=1, not exact=0
time2=GETTIMERALL()
FOR loop=0 TO 78
FOR loop1=0 TO 58
IF maze[loop][loop1]=1
DRAWRECT 4+(loop*8),4+(loop1*8),8,8,RGB(64,64,0)
DRAWRECT 5+(loop*8),5+(loop1*8),6,6,RGB(96,48,0)
ENDIF
NEXT
NEXT
PRINT "Maze Generated in "+INTEGER(time2-time1)+" milliseconds",180,220
SHOWSCREEN
MOUSEWAIT
WEND
END
// -------------------------------------------------------------------- //
FUNCTION MakeMaze: pjmaze[], pjexact
LOCAL pjmx = BOUNDS(pjmaze[],0)-1
LOCAL pjmy = BOUNDS(pjmaze[],1)-1
LOCAL pjfx,pjfy,pjloop,pjypos,pjxpos,pjfarx,pjfary,pjallx,pjally,pjalldir
LOCAL pjgo,pjtemp,pjx,pjy,pjdir,pjresult,pjlop,pjx2,pjy2,pjtemp2
pjcos[0]=1
pjcos[2]=-1
pjsin[1]=1
pjsin[3]=-1
FOR pjfx=0 TO pjmx
pjmaze[pjfx][0]=1
pjmaze[pjfx][pjmy]=1
NEXT
FOR pjfy=0 TO pjmy
pjmaze[0][pjfy]=1
pjmaze[pjmx][pjfy]=1
NEXT
FOR pjloop=1 TO pjmy/6
pjypos=RND((pjmy-6)/2)*2
pjxpos=RND(2)*2
FOR pjfx=1 TO pjxpos
pjmaze[pjfx][pjypos]=1
NEXT
pjypos=RND((pjmy-6)/2)*2
pjxpos=pjmx-(RND(2)*2)
FOR pjfx=pjmx TO pjxpos STEP -1
pjmaze[pjfx][pjypos]=1
NEXT
NEXT
FOR pjloop=1 TO pjmx/6
pjxpos=4+RND((pjmx-8)/2)*2
pjmaze[pjxpos][pjmy-1]=1
pjmaze[pjxpos][pjmy-2]=1
NEXT
pjfarx=pjmx
pjfary=pjmy
pjallx=0
pjally=0
pjexact=pjexact+1
WHILE TRUE
WHILE TRUE
pjallx=pjallx+pjcos[pjalldir]*pjexact
pjally=pjally+pjsin[pjalldir]*pjexact
pjgo=pjgo+pjexact
IF pjgo>=pjfarx-pjexact AND (pjalldir=0 OR pjalldir=2)
pjgo=0
pjfarx=pjfarx-pjexact
pjtemp=pjalldir+1
pjalldir=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
ENDIF
IF pjgo>=pjfary-pjexact AND (pjalldir=1 OR pjalldir=3)
pjgo=0
pjfary=pjfary-pjexact
pjtemp=pjalldir+1
pjalldir=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
ENDIF
IF pjfarx<=0 OR pjfary<=0 THEN BREAK
IF pjmaze[pjallx][pjally]=1 AND (pjallx
WEND
IF pjfarx<=0 OR pjfary<=0 THEN BREAK
IF pjallx>=pjmx OR pjally>=pjmy THEN BREAK
pjx=pjallx
pjy=pjally
pjdir=RND(3)
WHILE TRUE
FOR pjloop=0 TO 3
pjresult=1
FOR pjlop=1 TO pjexact+1
pjx2=pjx+pjcos[pjloop]*pjlop
pjy2=pjy+pjsin[pjloop]*pjlop
IF pjx2<=0 OR pjy2<=0 OR pjx2>pjmx OR pjy2>pjmy THEN pjresult=0
IF pjresult=1
IF pjmaze[pjx2][pjy2]=1 THEN pjresult=0
ENDIF
IF pjresult=1
pjtemp=pjloop+1
pjtemp2=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
IF pjmaze[pjx2+pjcos[pjtemp2]][pjy2+pjsin[pjtemp2]]=1 THEN pjresult=0
ENDIF
IF pjresult=1
pjtemp=pjloop-1
pjtemp2=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
IF pjmaze[pjx2+pjcos[pjtemp2]][pjy2+pjsin[pjtemp2]]=1 THEN pjresult=0
ENDIF
NEXT
IF pjresult=1 THEN BREAK
NEXT
IF pjloop=4 THEN BREAK
pjtemp=pjdir+1-RND(2)
pjdir=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
pjresult=1
FOR pjlop=1 TO pjexact+1
pjx2=pjx+pjcos[pjdir]*pjlop
pjy2=pjy+pjsin[pjdir]*pjlop
IF pjx2<=0 OR pjy2<=0 OR pjx2>pjmx OR pjy2>pjmy THEN pjresult=0
IF pjresult=1
IF pjmaze[pjx2][pjy2]=1 THEN pjresult=0
ENDIF
IF pjresult=1
pjtemp=pjdir+1
pjtemp2=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
IF pjmaze[pjx2+pjcos[pjtemp2]][pjy2+pjsin[pjtemp2]]=1 THEN pjresult=0
ENDIF
IF pjresult=1
pjtemp=pjdir-1
pjtemp2=pjtemp-4*(pjtemp>3)+4*(pjtemp<0)
IF pjmaze[pjx2+pjcos[pjtemp2]][pjy2+pjsin[pjtemp2]]=1 THEN pjresult=0
ENDIF
NEXT
IF pjresult=1
FOR pjloop=1 TO pjexact
pjx=pjx+pjcos[pjdir]
pjy=pjy+pjsin[pjdir]
pjmaze[pjx][pjy]=1
NEXT
ENDIF
WEND
WEND
IF pjexact=2
FOR pjfx=2 TO pjmx-2 STEP 2
IF pjmaze[pjfx][2]=0
pjmaze[pjfx][2]=1 ; pjmaze[pjfx][1]=1
ENDIF
IF pjmaze[pjfx][pjmy-2]=0
pjmaze[pjfx][pjmy-2]=1 ; pjmaze[pjfx][pjmy-1]=1
ENDIF
NEXT
FOR pjfy=2 TO pjmy-2 STEP 2
IF pjmaze[2][pjfy]=0
pjmaze[2][pjfy]=1 ; pjmaze[1][pjfy]=1
ENDIF
IF pjmaze[pjmx-2][pjfy]=0
pjmaze[pjmx-2][pjfy]=1 ; pjmaze[pjmx-1][pjfy]=1
ENDIF
NEXT
ENDIF
ENDFUNCTION
IF x1 dx = x2 - x1
ELSE
dx = x1 - x2
ENDIF
IF y1 dy = y2 - y1
ELSE
dy = y1 - y2
ENDIF
bit anyway - it doesn't matter if it produces a negative value, since you are going to square it, so it will always give a positive result.//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
// //
// Project: Oval Collisions in GL Basic //
// //
// (C)opyright PeeJay 2008 www.peejays-remakes.co.uk //
// //
// Rough and ready code for drawing ovals, but, more signifanctly, //
// code to check for collisions between circles and ovals (ellipses) //
// //
// Important Note: This is NOT accurate - in order to achieve pixel //
// perfect accuracy, it would be necessary to use a C inline call to //
// take advantage of the 64 bit precision. This has only been coded to //
// demonstrate the maths behind it. //
// //
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
SETSCREEN 640,480,1
LIMITFPS 60
LOCAL mx,my,b1,b2
WHILE KEY(01)=0
MOUSESTATE mx,my,b1,b2
DrawOval(320,240,180,100,200,0,0)
DrawOval(mx,my,50,80,200,200,0)
IF CollideOval(320,240,180,100,mx,my,50,80)
PRINT "COLLISION!",280,234
ENDIF
SHOWSCREEN
WEND
END
FUNCTION DrawOval: x,y,rx,ry,cr,cg,cb // x,y are centre, rx,ry are radii
LOCAL ang
FOR ang=0 TO 360 STEP 0.5
SETPIXEL x+rx*COS(ang),y+ry*SIN(ang),RGB(cr,cg,cb)
NEXT
ENDFUNCTION
FUNCTION CollideOval: x1,y1,rx1,ry1,x2,y2,rx2,ry2
LOCAL rad1,rad2,dx,dy,distx,disty,a
IF rx1=ry1 // circle - fairly accurate
rad1=rx1
ELSE
a=ATAN(y2-y1,x2-x1) // ellipse - needs 64 bit accuracy
IF a<0 THEN a=360+a
dx=rx1*COS(a)
dy=ry1*SIN(a)
rad1=SQR((dx*dx)+(dy*dy))
ENDIF
IF rx2=ry2 // circle - fairly accurate
rad2=rx2
ELSE
a=ATAN(y1-y2,x1-x2) // ellipse - needs 64 bit accuracy
IF a<0 THEN a=360+a
dx=rx2*COS(a)
dy=ry2*SIN(a)
rad2=SQR((dx*dx)+(dy*dy))
ENDIF
distx=x2-x1
disty=y2-y1
IF rad1+rad2>=SQR((distx*distx)+(disty*disty))
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNCTION