Novaciano commited on
Commit
7e9f5dd
·
verified ·
1 Parent(s): f1d61eb

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +65 -81
index.html CHANGED
@@ -2,10 +2,10 @@
2
  <html lang="es">
3
  <head>
4
  <meta charset="UTF-8">
5
- <title>Mini OutRun con Sprites</title>
6
  <style>
7
- body { margin:0; background:#6dd5fa; overflow:hidden; }
8
- canvas { display:block; width:100vw; height:80vh; background:skyblue; }
9
  #controls {
10
  position: fixed; bottom: 0; width: 100%;
11
  display: flex; justify-content: space-around;
@@ -34,85 +34,8 @@ const ctx=canvas.getContext("2d");
34
  function resize(){canvas.width=window.innerWidth;canvas.height=window.innerHeight*0.8;}
35
  resize();window.addEventListener("resize",resize);
36
 
37
- let roadWidth=2000, segL=200, camD=0.84;
38
- let playerX=0, pos=0, speed=200;
39
- let keys={left:false,right:false,up:false,down:false};
40
- let segments=[];
41
-
42
- // tiny sprites (palmera y auto rival) en base64
43
- const palmImg=new Image();
44
- palmImg.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAfCAYAAABu7W0UAAAAvUlEQVR42mNgoBUwAqMxIBGZgzFQK7cA7UdGZwC4nSU+g4EYw0kAgSlQJBcwAHEBzgdwARygzMCaQoUSFhHI6wYSkVQEyNUBKg5g4g9iM5FeA4QhOgPBIRLUI2GtgSAUM1FQ3wB8ghIUIgGkCaAgvQGB8A+FPCAGYqwYIIhQwoVgghu4jICcZsLoAEwXwCRfDYoA0aYVAYhtGAr6RhEkJgfAoWYg1AdH2AgBa7z6EKZnCw8AAAAASUVORK5CYII=";
45
- const carImg=new Image();
46
- carImg.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAkElEQVR42mNggAJGIHGQOwNjW3kMxWwGCqL9DAwMjExkBgYGigLwMKCOQpwHTGA2gWhBkGBbJBcT6E4gLUEMpHEIkA0MIsg1IAXxAS1I4jQbkmQWI6QAKxFqIA+RaQqQkBiI1IMqGiNA/AOQHzGpAxNJoEZkY8kQDCsBlwQxFCDEhRAAbfRAQGyqkIwgxgWAIMV/YOot9MNQAAAAASUVORK5CYII=";
47
-
48
- // generar segmentos
49
- for(let i=0;i<500;i++){
50
- segments.push({i,curve:Math.sin(i/30)*2,y:i*segL,sprites:[]});
51
- if(i%20===0) segments[i].sprites.push({img:palmImg,offset:-2});
52
- if(i%25===0) segments[i].sprites.push({img:palmImg,offset:2});
53
- if(i%40===0) segments[i].sprites.push({img:carImg,offset:(Math.random()*2-1)});
54
- }
55
-
56
- function project(p,camX,camY,camZ){
57
- let dz=p.z-camZ,dx=p.x-camX,dy=p.y-camY;
58
- let scale=camD/dz;
59
- return {
60
- x:(1+scale*dx)*canvas.width/2,
61
- y:(1-scale*dy)*canvas.height/2,
62
- w:scale*roadWidth/2, scale
63
- };
64
- }
65
-
66
- function drawSegment(p1,p2,color){
67
- ctx.fillStyle=color.grass;
68
- ctx.fillRect(0,p2.y,canvas.width,p1.y-p2.y);
69
- ctx.fillStyle=color.road;
70
- ctx.beginPath();
71
- ctx.moveTo(p1.x-p1.w,p1.y);
72
- ctx.lineTo(p1.x+p1.w,p1.y);
73
- ctx.lineTo(p2.x+p2.w,p2.y);
74
- ctx.lineTo(p2.x-p2.w,p2.y);
75
- ctx.closePath();ctx.fill();
76
- }
77
-
78
- function frame(dt){
79
- ctx.clearRect(0,0,canvas.width,canvas.height);
80
- pos+=speed*dt; while(pos>=segments.length*segL) pos-=segments.length*segL;
81
- let base=Math.floor(pos/segL), camY=1000, camZ=pos+500;
82
- let x=0,dx=0, maxY=canvas.height;
83
- for(let n=0;n<300;n++){
84
- let seg=segments[(base+n)%segments.length];
85
- seg.z=seg.y-(pos); x+=dx; dx+=seg.curve*0.001;
86
- let p1=project({x:x,y:0,z:seg.z},playerX*roadWidth,camY,camZ);
87
- let p2=project({x:x+dx,y:0,z:seg.z+segL},playerX*roadWidth,camY,camZ);
88
- if(p1.y>=p2.y || p2.y>=maxY) continue;
89
- let color={road:n%2?"#707070":"#696969",grass:n%2?"#10aa10":"#009900"};
90
- drawSegment(p1,p2,color); maxY=p2.y;
91
- seg.sprites.forEach(s=>{
92
- let spriteX=p1.x+p1.w*s.offset;
93
- let spriteY=p1.y;
94
- let size=80*p1.scale;
95
- ctx.drawImage(s.img,spriteX-size/2,spriteY-size,size,size);
96
- });
97
- }
98
- // dibujar coche del jugador
99
- ctx.fillStyle="red";
100
- ctx.fillRect(canvas.width/2-20+playerX*200,canvas.height-80,40,60);
101
- }
102
-
103
- let last=0;
104
- function loop(ts){
105
- let dt=(ts-last)/1000;if(dt>0.05)dt=0.05;last=ts;
106
- if(keys.left)playerX-=0.02;
107
- if(keys.right)playerX+=0.02;
108
- if(keys.up)speed+=5;
109
- if(keys.down)speed-=5;
110
- if(speed<0)speed=0;if(speed>2000)speed=2000;
111
- frame(dt);requestAnimationFrame(loop);
112
- }
113
- requestAnimationFrame(loop);
114
-
115
  // controles
 
116
  window.addEventListener("keydown",e=>{
117
  if(e.key==="ArrowLeft")keys.left=true;
118
  if(e.key==="ArrowRight")keys.right=true;
@@ -130,6 +53,67 @@ window.addEventListener("keyup",e=>{
130
  b.addEventListener("touchstart",()=>keys[id]=true);
131
  b.addEventListener("touchend",()=>keys[id]=false);
132
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  </script>
134
  </body>
135
  </html>
 
2
  <html lang="es">
3
  <head>
4
  <meta charset="UTF-8">
5
+ <title>OutRun Demo</title>
6
  <style>
7
+ body { margin:0; overflow:hidden; background:#6dd5fa; }
8
+ canvas { display:block; width:100vw; height:80vh; background:#87CEEB; }
9
  #controls {
10
  position: fixed; bottom: 0; width: 100%;
11
  display: flex; justify-content: space-around;
 
34
  function resize(){canvas.width=window.innerWidth;canvas.height=window.innerHeight*0.8;}
35
  resize();window.addEventListener("resize",resize);
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  // controles
38
+ let keys={left:false,right:false,up:false,down:false};
39
  window.addEventListener("keydown",e=>{
40
  if(e.key==="ArrowLeft")keys.left=true;
41
  if(e.key==="ArrowRight")keys.right=true;
 
53
  b.addEventListener("touchstart",()=>keys[id]=true);
54
  b.addEventListener("touchend",()=>keys[id]=false);
55
  });
56
+
57
+ // jugador
58
+ let playerX=0; // -1 a 1
59
+ let speed=0;
60
+
61
+ // sprites pequeños en base64
62
+ const palmImg=new Image();
63
+ palmImg.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAfCAYAAABu7W0UAAAAvUlEQVR42mNgoBUwAqMxIBGZgzFQK7cA7UdGZwC4nSU+g4EYw0kAgSlQJBcwAHEBzgdwARygzMCaQoUSFhHI6wYSkVQEyNUBKg5g4g9iM5FeA4QhOgPBIRLUI2GtgSAUM1FQ3wB8ghIUIgGkCaAgvQGB8A+FPCAGYqwYIIhQwoVgghu4jICcZsLoAEwXwCRfDYoA0aYVAYhtGAr6RhEkJgfAoWYg1AdH2AgBa7z6EKZnCw8AAAAASUVORK5CYII=";
64
+
65
+ function drawRoad(){
66
+ const h=canvas.height,w=canvas.width;
67
+ const roadW=0.8,lanes=2;
68
+ for(let i=0;i<30;i++){
69
+ let z=i/30;
70
+ let scale=1/(z*1.2+0.001);
71
+ let mid=0.5+playerX*0.3*scale;
72
+ let roadHalf=roadW*0.5*scale;
73
+ let grass= h*(1-z);
74
+ ctx.fillStyle=(i%2===0)?"#007700":"#009900";
75
+ ctx.fillRect(0,grass,w,h/30+1);
76
+ ctx.fillStyle="#555";
77
+ ctx.beginPath();
78
+ ctx.moveTo((mid-roadHalf)*w,grass);
79
+ ctx.lineTo((mid+roadHalf)*w,grass);
80
+ ctx.lineTo((mid+roadHalf*1.2)*w,grass+h/30);
81
+ ctx.lineTo((mid-roadHalf*1.2)*w,grass+h/30);
82
+ ctx.closePath();
83
+ ctx.fill();
84
+ // líneas de carril
85
+ ctx.strokeStyle="white"; ctx.lineWidth=2;
86
+ ctx.beginPath();
87
+ ctx.moveTo(mid*w,grass);
88
+ ctx.lineTo(mid*w,grass+h/30);
89
+ ctx.stroke();
90
+ // palmeras
91
+ if(i%5===0){
92
+ let size=40*scale;
93
+ ctx.drawImage(palmImg,(mid-roadHalf*1.4)*w-size/2,grass-size,size,size);
94
+ ctx.drawImage(palmImg,(mid+roadHalf*1.4)*w-size/2,grass-size,size,size);
95
+ }
96
+ }
97
+ }
98
+
99
+ function drawPlayer(){
100
+ const h=canvas.height,w=canvas.width;
101
+ ctx.fillStyle="red";
102
+ ctx.fillRect(w/2-20+playerX*200,h-80,40,60);
103
+ }
104
+
105
+ function loop(){
106
+ ctx.clearRect(0,0,canvas.width,canvas.height);
107
+ if(keys.left) playerX-=0.02;
108
+ if(keys.right) playerX+=0.02;
109
+ if(keys.up) speed+=2;
110
+ if(keys.down) speed-=2;
111
+ if(speed<0)speed=0;if(speed>200)speed=200;
112
+ drawRoad();
113
+ drawPlayer();
114
+ requestAnimationFrame(loop);
115
+ }
116
+ loop();
117
  </script>
118
  </body>
119
  </html>