vegipete
 Guru
 Joined: 29/01/2013 Location: CanadaPosts: 1168 |
| Posted: 08:08pm 09 Mar 2026 |
|
|
|
That's fun! Runs pretty fast on MMB4W if your keyboard repeat rate is high.
Here's a modification with acceleration and friction: (still AWSD keys to move) Only tested on MMB4W.
Dim integer mmb4w Dim integer Bcl(16,160),speed=3 CONST SMAX=0.025 CONST FRICTION=0.9999 CONST ACCEL=0.005 phase ' --- Initialisierung --- CLS ' --- Init_Graphics: Setup 320x240 Resolution, Layer-Buffer). If MM.DEVICE$ = "MMBasic for Windows" Then mmb4w = 1 If mmb4w Then MODE 7 PAGE WRITE 1 CLS Else 'Pico MODE 2 FRAMEBUFFER create : FRAMEBUFFER write f End If ' 2. Z-Table Dim integer x,y, z_dist(38) For y = 0 To 37 Read scal:z_dist(y)=16+(scal/4) Next y
CLS 'clear FRAMEBUFFER Dim float xpos=0,ypos=0,dx=0,dy=0 Dim integer hh=120,hw=160,f,n,w Dim integer c1=RGB(0,180,0),c2=RGB(White) Dim Integer sky=RGB(0,85,255),sky1=RGB(0,170,255),sky2=RGB(cyan) ' --- Create_Checkerboard Source For f =0 To 288 Step 32 Line f,hh-1,f+15,hh-1,,c1:Line f+16,hh-1,f+31,hh-1,,c2 Line f,hh,f+15,hh,,c2:Line f+16,hh,f+31,hh,,c1 Next Box 8,16,304,72,,sky,sky Line 8,51,311,51,,sky1:Line 8,52,311,52,,sky2 main: p=0 Do if abs(dx) < .0001 then dx = 0 else dx = dx * FRICTION inc xpos,dx end if camX = xpos mod 32 : if camX < 0 then inc camX,32 if abs(dy) < .0001 then dy = 0 else dy = dy * FRICTION inc ypos,dy end if p = ypos mod 15 : if p < 0 then inc p,15 For y = 0 To 37 'y2 = y<<1 'mult=y<<1 f=z_dist(y):sy=y+53:w=200-f*2 '-y2 'w=144-mult If mmb4w Then IMAGE RESIZE_FAST f+camX,hh-Bcl(p,y+50), w,1, 8, y+53,304,1 Else BLIT RESIZE f,f,f+camX,hh-Bcl(p,y+50), w,1, 8, y+53,304,1 End If Next y ' --- Keyboard --- k$ = Inkey$ Select Case k$ Case "w", "W" 'Inc P,speed:p=p Mod 15 ' vorwrts inc dy,ACCEL dy = min(dy, SMAX)
Case "s", "S" 'p=p-speed:If p<0 Then p=15 inc dy,-ACCEL dy = max(dy,-SMAX)
Case "a", "A" 'camX = camX - speed:If camX<0 Then camX=31 inc dx,-ACCEL dx = max(dx,-SMAX)
Case "d", "D" 'camX = camX + speed:camX = camX Mod 32 inc dx,ACCEL dx = min(dx, SMAX) End Select If mmb4w Then Page copy 1,0 'Page write 0 Else FRAMEBUFFER copy f,n,b End If 'pause 20 Loop Sub phase 'Precalculation pharse lookup table Local integer X,Y, SW = 120,CYCLES = 7 Local C_VALUE = (2 * Pi * CYCLES) / (SW * SW),START_PHASE = 0,Agl For dst=0 To 15 For X = 0 To 119 Agl = C_VALUE * X * X + START_PHASE Y = Int(Sin(Agl)*5) bcl(dst,120-x)=Not(y>0) Next X Inc START_PHASE, 0.393 Next End Sub
Data 36, 39, 43, 46, 50, 54, 57, 61, 64, 68, 72,75, 79, 82, 86 Data 89, 93, 97, 100, 104, 107, 111, 115, 118, 122, 125, 129 Data 133, 136, 140, 143, 147, 151, 154, 158, 161, 165, 169
|