gpt4 book ai didi

javascript - 关于创建连续移动、随机生成的 "3d"星空

转载 作者:行者123 更新时间:2023-11-28 04:55:14 25 4
gpt4 key购买 nike

我正在通过在 HTML Canvas 上开发一个小空间游戏来学习 JS。我正在尝试从随机生成的星星阵列创建 3D 星空。我有一个由 12 颗星组成的数组,是从包含 34 颗星的较大星体数组的元素中随机生成的。当一颗星星离开屏幕的边界时,我想将其从较小的数组中删除,并用较大的星星数组中另一个随机生成的元素替换它,同时保持它在动画函数中不断移动。我尝试了几种方法,但我似乎找不到正确的语法......或者可能是解决问题的正确方法。任何帮助将不胜感激。代码如下:

<canvas id="myCanvas"  width="1024" height="768">
</canvas>

<script>
var myCanvas = document.getElementById("myCanvas");
var ctx = myCanvas.getContext("2d");

var starsArray;
var randStarsArray;
var numStars = 12;


// Star object
var Star = function(x, y, width, height, velX, velY) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.velX = velX;
this.velY = velY;
}

// Create individual stars
var star1 = new Star(myCanvas.width/2 + (150 * Math.cos(135*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(135*Math.PI/180)), 5, 5, -6, 6);
var star2 = new Star(myCanvas.width/2 + (135 * Math.cos(135*Math.PI/180)), myCanvas.height/2 + (135 * Math.sin(135*Math.PI/180)), 5, 5, -6, 6);
var star3 = new Star(myCanvas.width/2 + (150 * Math.cos(320*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(320*Math.PI/180)), 5, 5, 6, -6);
var star4 = new Star(myCanvas.width/2 + (150 * Math.cos(310*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(310*Math.PI/180)), 5, 5, 6, -6);
var star5 = new Star(myCanvas.width/2 + (100 * Math.cos(270*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(270*Math.PI/180)), 5, 5, 0, -6);
var star6 = new Star(myCanvas.width/2 + (150 * Math.cos(0*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(0*Math.PI/180)), 5, 5, 6, 0);
var star7 = new Star(myCanvas.width/2 + (100 * Math.cos(90*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(90*Math.PI/180)), 5, 5, 0, 6);
var star8 = new Star(myCanvas.width/2 + (100 * Math.cos(180*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(180*Math.PI/180)), 5, 5, -6, 0);
var star9 = new Star(myCanvas.width/2 + (200 * Math.cos(270*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(270*Math.PI/180)), 5, 5, 0, -6);
var star10 = new Star(myCanvas.width/2 + (200 * Math.cos(0*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(0*Math.PI/180)), 5, 5, 6, 0);
var star11 = new Star(myCanvas.width/2 + (200 * Math.cos(90*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(90*Math.PI/180)), 5, 5, 0, 6);
var star12 = new Star(myCanvas.width/2 + (150 * Math.cos(60*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(60*Math.PI/180)), 5, 5, 3, 6);
var star13 = new Star(myCanvas.width/2 + (200 * Math.cos(45*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(45*Math.PI/180)), 5, 5, 6, 6);
var star14 = new Star(myCanvas.width/2 + (150 * Math.cos(210*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(210*Math.PI/180)), 5, 5, -6, -3);
var star15 = new Star(myCanvas.width/2 + (200 * Math.cos(225*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(225*Math.PI/180)), 5, 5, -6, -6);
var star16 = new Star(myCanvas.width/2 + (200 * Math.cos(150*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(150*Math.PI/180)), 5, 5, -6, 3);
var star17 = new Star(myCanvas.width/2 + (100 * Math.cos(150*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(150*Math.PI/180)), 5, 5, -6, 3);
var star18 = new Star(myCanvas.width/2 + (100 * Math.cos(30*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(30*Math.PI/180)), 5, 5, 6, 3);
var star19 = new Star(myCanvas.width/2 + (250 * Math.cos(180*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(180*Math.PI/180)), 5, 5, -6, 0);
var star20 = new Star(myCanvas.width/2 + (100 * Math.cos(330*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(330*Math.PI/180)), 5, 5, 6, -3);
var star21 = new Star(myCanvas.width/2 + (150 * Math.cos(300*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(300*Math.PI/180)), 5, 5, 3, -6);
var star22 = new Star(myCanvas.width/2 + (150 * Math.cos(240*Math.PI/180)), myCanvas.height/2 + (150 * Math.sin(240*Math.PI/180)), 5, 5, -3, -6);
var star23 = new Star(myCanvas.width/2 + (250 * Math.cos(240*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(240*Math.PI/180)), 5, 5, -3, -6);
var star24 = new Star(myCanvas.width/2 + (250 * Math.cos(330*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(330*Math.PI/180)), 5, 5, 6, -3);
var star25 = new Star(myCanvas.width/2 + (250 * Math.cos(30*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(30*Math.PI/180)), 5, 5, 6, 3);
var star26 = new Star(myCanvas.width/2 + (100 * Math.cos(120*Math.PI/180)), myCanvas.height/2 + (100 * Math.sin(120*Math.PI/180)), 5, 5, -3, 6);
var star27 = new Star(myCanvas.width/2 + (250 * Math.cos(135*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(135*Math.PI/180)), 5, 5, -6, 6);
var star28 = new Star(myCanvas.width/2 + (250 * Math.cos(120*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(120*Math.PI/180)), 5, 5, -3, 6);
var star29 = new Star(myCanvas.width/2 + (200 * Math.cos(210*Math.PI/180)), myCanvas.height/2 + (200 * Math.sin(210*Math.PI/180)), 5, 5, -6, -3);
var star30 = new Star(myCanvas.width/2 + (250 * Math.cos(300*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(300*Math.PI/180)), 5, 5, 3, -6);
var star31 = new Star(myCanvas.width/2 + (25 * Math.cos(45*Math.PI/180)), myCanvas.height/2 + (25 * Math.sin(45*Math.PI/180)), 5, 5, 6, -6);
var star32 = new Star(myCanvas.width/2 + (25 * Math.cos(225*Math.PI/180)), myCanvas.height/2 + (25 * Math.sin(225*Math.PI/180)), 5, 5, -6, -6);
var star33 = new Star(myCanvas.width/2 + (250 * Math.cos(60*Math.PI/180)), myCanvas.height/2 + (250 * Math.sin(60*Math.PI/180)), 5, 5, 3, 6);
var star34 = new Star(myCanvas.width/2 + (25 * Math.cos(315*Math.PI/180)), myCanvas.height/2 + (25 * Math.sin(315*Math.PI/180)), 5, 5, 6, -6);

// Game initialization
function init() {
startGame();
}

// Start game
function startGame(){

// Game variables
starsArray = new Array();
randStarsArray = new Array();

// Push stars onto array
starsArray.push(star1);
starsArray.push(star2);
starsArray.push(star3);
starsArray.push(star4);
starsArray.push(star5);
starsArray.push(star6);
starsArray.push(star7);
starsArray.push(star8);
starsArray.push(star9);
starsArray.push(star10);
starsArray.push(star11);
starsArray.push(star12);
starsArray.push(star13);
starsArray.push(star14);
starsArray.push(star15);
starsArray.push(star16);
starsArray.push(star17);
starsArray.push(star18);
starsArray.push(star19);
starsArray.push(star20);
starsArray.push(star21);
starsArray.push(star22);
starsArray.push(star23);
starsArray.push(star24);
starsArray.push(star25);
starsArray.push(star26);
starsArray.push(star27);
starsArray.push(star28);
starsArray.push(star29);
starsArray.push(star30);
starsArray.push(star31);
starsArray.push(star32);
starsArray.push(star33);
starsArray.push(star34);


for(i = 0; i < numStars; i++){
randStarsArray[i] = starsArray[Math.floor(Math.random() * 34)];
}

animate();
}


function changeStar(){
var index = randStarsArray.indexOf(tempStar);

if (index > -1) {
//randStarsArray[index] = starsArray[Math.floor(Math.random() * 34)];
randStarsArray.splice(index, 1);
randStarsArray.push(starsArray[Math.floor(Math.random() * 34)]);
}
}


// Animation loop
function animate(){

ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);

for(i = 0; i < numStars; i++){
var tempStar = randStarsArray[i];
ctx.fillStyle = "rgb(255, 255, 255)"; // white stars
ctx.fillRect(randStarsArray[i].x, randStarsArray[i].y, randStarsArray[i].width, randStarsArray[i].height);

tempStar.x += tempStar.velX;
tempStar.y += tempStar.velY;


if(tempStar.x + tempStar.width < 0 || tempStar.x > myCanvas.width ||
tempStar.y + tempStar.height < 0 || tempStar.y > myCanvas.height){

changeStar();
}

}


setTimeout(animate, 33);
}


init();


</script>

最佳答案

<script>
var Canvas = document.getElementById("Canvas");
var ctx = Canvas.getContext("2d");
var starsArray;
var randStarsArray;
var numStars = 12;
// Star object
var Star = function(x, y, width, height, velX, velY) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.velX = velX;
this.velY = velY;
}
var M = [150, 135, 150, 150, 100, 150, 100, 100, 200, 200, 200, 150, 200, 150, 200, 200, 100, 100, 250, 100, 150, 150, 250, 250, 250, 100, 250, 250, 200, 250, 25, 25, 250, 25];
var N = [135, 135, 320, 310, 270, 0, 90, 180, 270, 0, 90, 60, 45, 210, 225, 150, 150, 30, 180, 330, 300, 240, 240, 330, 30, 120, 135, 120, 210, 300, 45, 225, 60, 315];
var Z = [-6, -6, 6, 6, 0, 6, 0, -6, 0, 6, 0, 3, 6, -6, -6, -6, -6, 6, -6, 6, 3, -3, -3, 6, 6, -3, -3 - 6, -3, -6, 6, -6, 3, 6];
var K = [6, 6, -6, -6, -6, 0, 6, 0, -6, 0, 6, 6, 6, -3, -6, 3, 3, 3, 0, -3, -6, -6, -6, -3, 3, 6, 6, 6, -3, -6, -6, -6, 6, -6];
var star = [];
for (var i = 0; i <= 34; i++) {
star[i] = new Star(Canvas.width / 2 + (M[i] * Math.cos(N[i] * Math.PI / 180)), Canvas.height / 2 + (M[i] * Math.sin(N[i] * Math.PI / 180)), 5, 5, Z[i], K[i]);
}
// Game initialization
function init() {
startGame();
}
// Start game
function startGame() {
// Game variables
starsArray = [];
randStarsArray = [];

// Push stars onto array
// 这是所有的star
for (var i = 0; i < star.length; i++) {
starsArray.push(star[i])
}
// console.dir(starsArray);//所有的星星
var randomArray = []; //渲染的 星星
// 判断数据是否为12个数据
while (randomArray.length < numStars) {
var random = Math.floor(Math.random() * 34);
if (randomArray.indexOf(random) === -1) {
randomArray.push(random);
}
}
console.log(randomArray)

for (var i = 0; i < randomArray.length; i++) {
randStarsArray[i] = starsArray[randomArray[i]];
}
console.log(randStarsArray);
animate();
}

// Animation loop
function animate() {
ctx.clearRect(0, 0, Canvas.width, Canvas.height);
for (i = 0; i < numStars; i++) {
var tempStar = randStarsArray[i];
console.log(tempStar);
ctx.fillStyle = "rgb(55, 100, 0)"; // white stars
ctx.fillRect(tempStar.x, tempStar.y, tempStar.width, tempStar.height);


tempStar.x += tempStar.velX;
tempStar.y += tempStar.velY;
if (tempStar.x + tempStar.width < 0 || tempStar.x > Canvas.width ||
tempStar.y + tempStar.height < 0 || tempStar.y > Canvas.height) {

changeStar(tempStar);
}
}
setTimeout(animate, 300);
}



function changeStar(tempStar) {
var index = randStarsArray.indexOf(tempStar);
if (index > -1) {
//randStarsArray[index] = starsArray[Math.floor(Math.random() * 34)];
randStarsArray.splice(index, 1);
randStarsArray.push(starsArray[Math.floor(Math.random() * 34)]);
}
}

init();
</script>`enter code here`

关于javascript - 关于创建连续移动、随机生成的 "3d"星空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42604727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com