'=========================================================================== ' Subject: SPLIT/MERGE TEXT SCREEN FOR PB Date: 11-19-97 (20:15) ' Author: The ABC Programmer Code: PB ' Origin: voxel@freenet.edmonton.ab.ca Packet: TEXT.ABC '=========================================================================== '===================[ Split/Merge Text Screen]=================== ' Creates a neat split/merge effect to change text screens. ' Programmed by William Yu (100% Public Domain) for PB. ' ' Sucks up a fair amount of memory though, but normally just 8K ' to switch from one screen to the next, but you can always ' re-use your arrays. ' You may experience flicker during SplitScreen, but that's ' because I gave up optimizing the SUB and used a cheap effect. '================================================================ $OPTIMIZE SPEED $ERROR ALL OFF $LIB ALL OFF $STRING 8 %Height = 25 '' Works for ANY Height, too bad you don't have that many. DEFINT A-Z DIM Scr1(1 to %Height) AS STRING*160 DIM Scr2(1 to %Height) AS STRING*160 WIDTH 80,%Height DEF SEG=&HB800 '' Works fine with Monochrome as well (&HB000) FOR N=0 TO %Height*160 STEP 160 '' Create some random characters POKE$ N, STRING$(160,CHR$(RND*255)) NEXT N Drawbox 1,1,40,INT(%Height/2),11,5,0,2 Drawbox 3,2,38,INT(%Height/2)-1,11,5,1,2 Drawbox 41,1,80,INT(%Height/2),11,5,0,2 Drawbox 1,INT(%Height/2)+1,40,%Height-1,11,5,0,2 Drawbox 41,INT(%Height/2)+1,80,%Height-1,11,5,0,2 LOCATE 5,10:COLOR 15:?"Hello World!" Screen1$=PEEK$(0,%Height*160) '' Save entire screen as String FOR N=1 TO %Height Scr2(N) = PEEK$((N-1)*160,160) '' Save entire screen to Array NEXT N Drawbox 1,1,40,INT(%Height/2),15,1,1,1 '' Create another screen Drawbox 3,2,38,INT(%Height/2)-1,11,3,1,1 Drawbox 41,1,80,INT(%Height/2),15,1,1,1 Drawbox 1,INT(%Height/2)+1,40,%Height-1,15,1,1,1 Drawbox 41,INT(%Height/2)+1,80,%Height-1,15,1,1,1 Screen2$=PEEK$(0,%Height*160) FOR N=1 TO %Height Scr1(N) = PEEK$((N-1)*160,160) '' Save it NEXT N I=0 Do '' The loop IF I=0 THEN SplitScreen Scr1(),Screen1$ MergeScreen Scr2() Sleep .1 ELSE SplitScreen Scr2(),Screen2$ END IF I = NOT I Loop until inkey$<>"" END SUB SplitScreen (Scr1() AS STRING*160, Scr$) ''==================================================================== '' Inputs: Src1() is the current screen image that you want to split. '' Scr$ is the saved screen you wish to reveal. ''-------------------------------------------------------------------- M=1 HalfH=INT(%Height/2)-1 K=HalfH DO X=0 T!=TIMER POKE$ 0,Scr$ 'Perhaps not the best approach, but I'm lazy, this will do. 'my original plan was to... eh, nevermind. FOR N=1+(HalfH-K) to HalfH ''Hmmmm, why try to understand? Just marvel that it actually works. :) POKE$ X*160,mid$(Scr1(N+1),M,78-(M-3)) POKE$ X*160+82+M-3,mid$(Scr1(N+1),81,78-(M-3)) POKE$ (X+HalfH+2+(HalfH-K))*160,mid$(Scr1(X+HalfH+2),M,78-(M-3)) POKE$ (X+HalfH+2+(HalfH-K))*160+82+M-3,mid$(Scr1(X+HalfH+2),81,78-(M-3)) INCR X NEXT N DO:LOOP UNTIL TIMER-T!>.01 '' oooh look, precision timing INCR M,4 DECR K LOOP UNTIL K<0 OR M>81 END SUB SUB MergeScreen (Scr1() AS STRING*160) ''==================================================================== '' Inputs: Src1() is the screen image that you want to merge. '' '' Basically just a reverse of SplitScreen, still a mess :) ''-------------------------------------------------------------------- M=%Height-(%Height MOD 2)-1 '' What? Cool eh? HalfH=INT(%Height/2)-1 K=1 DO X=0 T!=TIMER FOR N=1+(HalfH-K) to HalfH POKE$ X*160,mid$(Scr1(N+1),M,78-(M-3)) POKE$ X*160+82+M-3,mid$(Scr1(N+1),81,78-(M-3)) POKE$ (X+HalfH+2+(HalfH-K))*160,mid$(Scr1(X+HalfH+2),M,78-(M-3)) POKE$ (X+HalfH+2+(HalfH-K))*160+82+M-3,mid$(Scr1(X+HalfH+2),81,78-(M-3)) INCR X NEXT N DO:LOOP UNTIL TIMER-T!>.01 DECR M,2 INCR K LOOP UNTIL M<0 END SUB SUB DrawBox (X%, Y%, XX%, YY%, C%, BC%, Solid%, CharSet%) '' Routine to draw a simple 2D box. IF CharSet% = 1 THEN Char1$ = "Ú" CharHoz$ = "Ä" Char2$ = "¿" CharVert$ = "³" Char3$ = "À" Char4$ = "Ù" END IF IF CharSet% = 2 THEN Char1$ = "É" CharHoz$ = "Í" Char2$ = "»" CharVert$ = "º" Char3$ = "È" Char4$ = "¼" END IF COLOR C%, BC% A = (XX% - X%) - 1 LOCATE Y%, X%: PRINT Char1$; STRING$(A, CharHoz$); Char2$ FOR I = Y% + 1 TO YY% - 1 LOCATE I, X%: PRINT CharVert$; IF Solid% THEN PRINT SPACE$(A); LOCATE I, XX%: PRINT CharVert$; NEXT I LOCATE YY%, X%: PRINT Char3$; STRING$(A, CharHoz$); Char4$; END SUB