level 11
qiaozhanrong
楼主
'又是我的渣程序
'一点注释也没有(无视这几行),一堆BUG,所谓的“碰撞检测”是我瞎编的
'方向键转向、加速;Q键回到初始状态
CONST PI AS DOUBLE=3.14
15926535898
#INCLUDE "GL\GL.BI"
#INCLUDE "GL\GLU.BI"
#INCLUDE "GL\GLUT.BI"
#INCLUDE "FBGFX.BI"
WALL:
DATA 10
DATA 0,100,20,180
DATA 0,101,20,180
DATA 0,102,20,180
DATA 0,103,20,180
DATA 0,104,20,180
DATA 0,105,20,180
DATA 0,106,20,180
DATA 0,107,20,180
DATA 0,108,20,180
DATA 0,109,20,180
DIM AS BYTE BOUNCE
DIM AS INTEGER N
DIM AS SINGLE SCENEROTY,HEADING
DIM AS SINGLE XPOS,YPOS,XSPEED,YSPEED,X1,X2,Y1,Y2,XT,YT
DIM AS INTEGER I,J
XPOS=320
YPOS=240
WINDOWTITLE "平面物理测试"
SCREENRES 640,480,32,2
'XSPEED=XPOS:YSPEED=YPOS
DO
RESTORE WALL
READ N
REDIM AS INTEGER WALL(N,3)
FOR I=1 TO N
READ WALL(I,0),WALL(I,1),WALL(I,2),WALL(I,3)
NEXT I
SCREENLOCK
CLS
COLOR RGB(255,255,255)
PRINT "POSITION:",XPOS,YPOS
PRINT "SPEED:",XSPEED,YSPEED
PRINT "DEGREE:",HEADING
COLOR RGB(255,255,255)
LINE(XPOS-3,YPOS-3)-(XPOS
+3
,YPOS+3)
LINE(XPOS+3,YPOS-3)-(XPOS-3,YPOS+3)
COLOR RGB(0,0,255)
LINE(XPOS+X1,YPOS+Y1)-(XPOS-SIN(HEADING*PI/180)*50+X2,YPOS-COS(HEADING*PI/180)*50+Y2)
FOR I=1 TO N
IF WALL(I,0)=0 THEN LINE(WALL(I,2),WALL(I,1))-(WALL(I,3),WALL(I,1))
IF WALL(I,0)=1 THEN LINE(WALL(I,1),WALL(I,2))-(WALL(I,1),WALL(I,3))
NEXT I
SCREENSYNC
SCREENUNLOCK
FOR I=1 TO N
IF WALL(I,0)=0 AND YSPEED<>0 THEN
XT=XPOS:YT=YPOS
FOR J=SGN(YSPEED) TO YSPEED+SGN(YSPEED) STEP SGN(YSPEED)
YT+=SGN(YSPEED)
XT+=XSPEED/YSPEED*SGN(YSPEED)
IF XT>=WALL(I,2) AND XT<=WALL(I,3) _
AND YT>=WALL(I,1)-1 AND _
YT<=WALL(I,1)+1 AND BOUNCE=0 _
THEN
YSPEED*=-1:BOUNCE=1
ELSE
BOUNCE=0
END IF
NEXT J
ELSEIF WALL(I,0)=1 AND XSPEED<>0 THEN
XT=XPOS:YT=YPOS
FOR J=SGN(XSPEED) TO XSPEED+SGN(XSPEED) STEP SGN(XSPEED)
XT+=SGN(XSPEED)
YT+=YSPEED/XSPEED*SGN(XSPEED)
IF YT>=WALL(I,2) AND YT<=WALL(I,3) _
AND XT>=WALL(I,1)-1 AND _
XT<=WALL(I,1)+1 AND BOUNCE=0 _
THEN
XSPEED*=-1:BOUNCE=1
ELSE
BOUNCE=0
END IF
NEXT J
END IF
NEXT I
IF MULTIKEY(FB.SC_UP) THEN
XSPEED-=SIN(HEADING*PI/180) * 0.05
YSPEED-=COS(HEADING*PI/180) * 0.05
END IF
IF MULTIKEY(FB.SC_DOWN) THEN
XSPEED+=SIN(HEADING*PI/180) * 0.05
YSPEED+=COS(HEADING*PI/180) * 0.05
END IF
IF MULTIKEY(FB.SC_LEFT) THEN
HEADING+=1
END IF
IF MULTIKEY(FB.SC_RIGHT) THEN
HEADING-=1
END IF
IF MULTIKEY(FB.SC_A) THEN
HEADING+=0.1
END IF
IF MULTIKEY(FB.SC_D) THEN
HEADING-=0.1
END IF
IF MULTIKEY(FB.SC_Q) THEN
HEADING=0
XSPEED=0
YSPEED=0
XPOS=320
YPOS=240
BOUNCE=0
END IF
IF HEADING>359 THEN HEADING=HEADING MOD 360
IF HEADING<0 THEN HEADING=360-ABS(HEADING MOD 360)
IF XSPEED<=0.01 AND XSPEED>=-0.01 THEN
XSPEED=0
ELSEIF XSPEED>0.01 THEN
XSPEED-=0.01
ELSEIF XSPEED<-0.01 THEN
XSPEED+=0.01
END IF
XPOS+=XSPEED
IF YSPEED<=0.01 AND YSPEED>=-0.01 THEN
YSPEED=0
ELSEIF YSPEED>0.01 THEN
YSPEED-=0.01
ELSEIF YSPEED<-0.01 THEN
YSPEED+=0.01
END IF
YPOS+=YSPEED
IF XPOS+XSPEED>640 OR XPOS+XSPEED<0 THEN XSPEED*=-1':HEADING=360=HEADING*-1
IF YPOS+YSPEED>480 OR YPOS+YSPEED<0 THEN YSPEED*=-1':HEADING=180-HEADING*-1
'IF XPOS+XSPEED>640 THEN XPOS=1
'IF XPOS+XSPEED<0 THEN XPOS=640
'IF YPOS+YSPEED>480 THEN YPOS=1
'IF YPOS+YSPEED<0 THEN YPOS=480
LOOP UNTIL MULTIKEY(FB.SC_ESCAPE)I
2013年11月03日 11点11分
1
'一点注释也没有(无视这几行),一堆BUG,所谓的“碰撞检测”是我瞎编的
'方向键转向、加速;Q键回到初始状态
CONST PI AS DOUBLE=3.14
15926535898
#INCLUDE "GL\GL.BI"
#INCLUDE "GL\GLU.BI"
#INCLUDE "GL\GLUT.BI"
#INCLUDE "FBGFX.BI"
WALL:
DATA 10
DATA 0,100,20,180
DATA 0,101,20,180
DATA 0,102,20,180
DATA 0,103,20,180
DATA 0,104,20,180
DATA 0,105,20,180
DATA 0,106,20,180
DATA 0,107,20,180
DATA 0,108,20,180
DATA 0,109,20,180
DIM AS BYTE BOUNCE
DIM AS INTEGER N
DIM AS SINGLE SCENEROTY,HEADING
DIM AS SINGLE XPOS,YPOS,XSPEED,YSPEED,X1,X2,Y1,Y2,XT,YT
DIM AS INTEGER I,J
XPOS=320
YPOS=240
WINDOWTITLE "平面物理测试"
SCREENRES 640,480,32,2
'XSPEED=XPOS:YSPEED=YPOS
DO
RESTORE WALL
READ N
REDIM AS INTEGER WALL(N,3)
FOR I=1 TO N
READ WALL(I,0),WALL(I,1),WALL(I,2),WALL(I,3)
NEXT I
SCREENLOCK
CLS
COLOR RGB(255,255,255)
PRINT "POSITION:",XPOS,YPOS
PRINT "SPEED:",XSPEED,YSPEED
PRINT "DEGREE:",HEADING
COLOR RGB(255,255,255)
LINE(XPOS-3,YPOS-3)-(XPOS
+3
,YPOS+3)
LINE(XPOS+3,YPOS-3)-(XPOS-3,YPOS+3)
COLOR RGB(0,0,255)
LINE(XPOS+X1,YPOS+Y1)-(XPOS-SIN(HEADING*PI/180)*50+X2,YPOS-COS(HEADING*PI/180)*50+Y2)
FOR I=1 TO N
IF WALL(I,0)=0 THEN LINE(WALL(I,2),WALL(I,1))-(WALL(I,3),WALL(I,1))
IF WALL(I,0)=1 THEN LINE(WALL(I,1),WALL(I,2))-(WALL(I,1),WALL(I,3))
NEXT I
SCREENSYNC
SCREENUNLOCK
FOR I=1 TO N
IF WALL(I,0)=0 AND YSPEED<>0 THEN
XT=XPOS:YT=YPOS
FOR J=SGN(YSPEED) TO YSPEED+SGN(YSPEED) STEP SGN(YSPEED)
YT+=SGN(YSPEED)
XT+=XSPEED/YSPEED*SGN(YSPEED)
IF XT>=WALL(I,2) AND XT<=WALL(I,3) _
AND YT>=WALL(I,1)-1 AND _
YT<=WALL(I,1)+1 AND BOUNCE=0 _
THEN
YSPEED*=-1:BOUNCE=1
ELSE
BOUNCE=0
END IF
NEXT J
ELSEIF WALL(I,0)=1 AND XSPEED<>0 THEN
XT=XPOS:YT=YPOS
FOR J=SGN(XSPEED) TO XSPEED+SGN(XSPEED) STEP SGN(XSPEED)
XT+=SGN(XSPEED)
YT+=YSPEED/XSPEED*SGN(XSPEED)
IF YT>=WALL(I,2) AND YT<=WALL(I,3) _
AND XT>=WALL(I,1)-1 AND _
XT<=WALL(I,1)+1 AND BOUNCE=0 _
THEN
XSPEED*=-1:BOUNCE=1
ELSE
BOUNCE=0
END IF
NEXT J
END IF
NEXT I
IF MULTIKEY(FB.SC_UP) THEN
XSPEED-=SIN(HEADING*PI/180) * 0.05
YSPEED-=COS(HEADING*PI/180) * 0.05
END IF
IF MULTIKEY(FB.SC_DOWN) THEN
XSPEED+=SIN(HEADING*PI/180) * 0.05
YSPEED+=COS(HEADING*PI/180) * 0.05
END IF
IF MULTIKEY(FB.SC_LEFT) THEN
HEADING+=1
END IF
IF MULTIKEY(FB.SC_RIGHT) THEN
HEADING-=1
END IF
IF MULTIKEY(FB.SC_A) THEN
HEADING+=0.1
END IF
IF MULTIKEY(FB.SC_D) THEN
HEADING-=0.1
END IF
IF MULTIKEY(FB.SC_Q) THEN
HEADING=0
XSPEED=0
YSPEED=0
XPOS=320
YPOS=240
BOUNCE=0
END IF
IF HEADING>359 THEN HEADING=HEADING MOD 360
IF HEADING<0 THEN HEADING=360-ABS(HEADING MOD 360)
IF XSPEED<=0.01 AND XSPEED>=-0.01 THEN
XSPEED=0
ELSEIF XSPEED>0.01 THEN
XSPEED-=0.01
ELSEIF XSPEED<-0.01 THEN
XSPEED+=0.01
END IF
XPOS+=XSPEED
IF YSPEED<=0.01 AND YSPEED>=-0.01 THEN
YSPEED=0
ELSEIF YSPEED>0.01 THEN
YSPEED-=0.01
ELSEIF YSPEED<-0.01 THEN
YSPEED+=0.01
END IF
YPOS+=YSPEED
IF XPOS+XSPEED>640 OR XPOS+XSPEED<0 THEN XSPEED*=-1':HEADING=360=HEADING*-1
IF YPOS+YSPEED>480 OR YPOS+YSPEED<0 THEN YSPEED*=-1':HEADING=180-HEADING*-1
'IF XPOS+XSPEED>640 THEN XPOS=1
'IF XPOS+XSPEED<0 THEN XPOS=640
'IF YPOS+YSPEED>480 THEN YPOS=1
'IF YPOS+YSPEED<0 THEN YPOS=480
LOOP UNTIL MULTIKEY(FB.SC_ESCAPE)I