@@ -14,6 +14,13 @@ function clamp(value, min, max) {
1414 return Math . max ( min , Math . min ( max , value ) ) ;
1515}
1616
17+ function normalizeAngle ( angle ) {
18+ let result = angle ;
19+ while ( result > Math . PI ) result -= Math . PI * 2 ;
20+ while ( result < - Math . PI ) result += Math . PI * 2 ;
21+ return result ;
22+ }
23+
1724export default class WolfOptimizedRaycastScene extends Scene {
1825 constructor ( ) {
1926 super ( ) ;
@@ -113,26 +120,34 @@ export default class WolfOptimizedRaycastScene extends Scene {
113120
114121 step3DPhysics ( dt , engine ) {
115122 const input = engine . input ;
116- if ( input ?. isDown ( 'KeyA' ) ) this . player . angle -= this . player . turnSpeed * dt ;
117- if ( input ?. isDown ( 'KeyD' ) ) this . player . angle += this . player . turnSpeed * dt ;
123+ const step = Math . min ( dt , 1 / 30 ) ;
124+ const turnLeft = input ?. isDown ( 'KeyA' ) || input ?. isDown ( 'ArrowLeft' ) ;
125+ const turnRight = input ?. isDown ( 'KeyD' ) || input ?. isDown ( 'ArrowRight' ) ;
126+ if ( turnLeft ) this . player . angle -= this . player . turnSpeed * step ;
127+ if ( turnRight ) this . player . angle += this . player . turnSpeed * step ;
128+ this . player . angle = normalizeAngle ( this . player . angle ) ;
118129
119130 const forwardX = Math . cos ( this . player . angle ) ;
120131 const forwardY = Math . sin ( this . player . angle ) ;
121- if ( input ?. isDown ( 'KeyW' ) ) this . tryMove ( this . player . x + forwardX * this . player . moveSpeed * dt , this . player . y + forwardY * this . player . moveSpeed * dt ) ;
122- if ( input ?. isDown ( 'KeyS' ) ) this . tryMove ( this . player . x - forwardX * this . player . moveSpeed * dt , this . player . y - forwardY * this . player . moveSpeed * dt ) ;
132+ const moveForward = input ?. isDown ( 'KeyW' ) || input ?. isDown ( 'ArrowUp' ) ;
133+ const moveBackward = input ?. isDown ( 'KeyS' ) || input ?. isDown ( 'ArrowDown' ) ;
134+ if ( moveForward ) this . tryMove ( this . player . x + forwardX * this . player . moveSpeed * step , this . player . y + forwardY * this . player . moveSpeed * step ) ;
135+ if ( moveBackward ) this . tryMove ( this . player . x - forwardX * this . player . moveSpeed * step , this . player . y - forwardY * this . player . moveSpeed * step ) ;
123136 }
124137
125138 render ( renderer ) {
126139 drawFrame ( renderer , theme , [
127140 'Sample 1703 - Wolf Optimized Raycast' ,
128141 'DDA traversal for ray steps, preserving classic filled corridor rendering.' ,
129- 'Move : W/S | Turn: A/D' ,
142+ 'Controls : W/S or Up/Down move | A/D or Left/Right turn ' ,
130143 ] ) ;
131144
132145 const viewport = this . viewport ;
133146 renderer . strokeRect ( viewport . x , viewport . y , viewport . width , viewport . height , '#d8d5ff' , 2 ) ;
134147 renderer . drawRect ( viewport . x , viewport . y , viewport . width , viewport . height * 0.5 , '#0f766e' ) ;
135148 renderer . drawRect ( viewport . x , viewport . y + viewport . height * 0.5 , viewport . width , viewport . height * 0.5 , '#111827' ) ;
149+ renderer . drawRect ( viewport . x + 10 , viewport . y + 8 , 188 , 20 , 'rgba(20, 184, 166, 0.22)' ) ;
150+ renderer . drawText ( 'Wolf | DDA Raycast' , viewport . x + 16 , viewport . y + 22 , { color : '#99f6e4' , font : '12px monospace' } ) ;
136151
137152 const columnWidth = 2 ;
138153 const columns = Math . floor ( viewport . width / columnWidth ) ;
@@ -156,7 +171,7 @@ export default class WolfOptimizedRaycastScene extends Scene {
156171 this . lastFilledColumns += 1 ;
157172 }
158173
159- drawPanel ( renderer , 620 , 34 , 300 , 182 , 'Optimized Runtime' , [
174+ drawPanel ( renderer , 620 , 34 , 300 , 182 , 'Wolf Runtime' , [
160175 `Player: x=${ this . player . x . toFixed ( 2 ) } y=${ this . player . y . toFixed ( 2 ) } ` ,
161176 `Angle: ${ this . player . angle . toFixed ( 2 ) } rad` ,
162177 `Filled columns: ${ this . lastFilledColumns } ` ,
0 commit comments