首页 > 解决方案 > 试图将开放处理代码转换成 pj.5s

问题描述

我不知道如何将其更改为 p5.js。只是尝试进行转换。请帮我让这个代码在 p5.js 中工作。

我知道这是旧代码,p5.js 有不同的规则。也许阵列不工作。我没有任何线索。

    Myself myself;
ArrayList<Enemy> enemies;
`enter code here`ArrayList<Enemy> enemies;
ArrayList<Bullet> myBullets;
ArrayList<Bullet> eneBullets;

void setup(){

  size(640, 640);
  rectMode(CENTER);
  myself = new Myself();
  enemies = new ArrayList<Enemy>();
  myBullets = new ArrayList<Bullet>();
  eneBullets = new ArrayList<Bullet>(); 
}

void draw(){
  background(0);
  myself.display();
  for(Enemy enemy: enemies){
    enemy.display();
  }
  for(Bullet bullet: myBullets){
    bullet.display();
  }
  for(Bullet bullet: eneBullets){
    bullet.display();
  }

  myself.update();
  ArrayList<Enemy> nextEnemies = new ArrayList<Enemy>();
  for(Enemy enemy: enemies){
    enemy.update();
    if(!enemy.isDead){
      nextEnemies.add(enemy);
    }
  }
  enemies = nextEnemies;
  ArrayList<Bullet> nextMyBullets = new ArrayList<Bullet>();
  for(Bullet bullet: myBullets){
    bullet.update();
    if(!bullet.isDead){
      nextMyBullets.add(bullet);
    }
  }
  myBullets = nextMyBullets;
  ArrayList<Bullet> nextEneBullets = new ArrayList<Bullet>();
  for(Bullet bullet: eneBullets){
    bullet.update();
    if(!bullet.isDead){
      nextEneBullets.add(bullet);
    }
  }
  eneBullets = nextEneBullets;
  if(random(1) < 0.02){
    enemies.add(new Enemy());
  }
}

class Myself{

  PVector loc;
  float size;
  int coolingTime;
  boolean isDead;

  Myself(){
    size = 25;
    loc = new PVector(width / 2, height - size / 2 - 10);
    coolingTime = 0;
    isDead = false;
  }

  void display(){
    if(isDead){
      fill(255, 255, 0);
      stroke(0, 255, 0); 
    } else {
      noFill();
      stroke(0, 255, 0);
    }
    rect(loc.x, loc.y, size, size);
  }

  void update(){
    isDead = false;
    float dmx = mouseX - loc.x;
    dmx = constrain(dmx, -5, 5);
    loc.x += dmx;
    coolingTime++;
    if(mousePressed && coolingTime >= 10){
      myBullets.add(new Bullet());
      coolingTime = 0;
    }
    for(Bullet b: eneBullets){
      if((loc.x - size / 2 <= b.loc.x && b.loc.x <= loc.x + size / 2)
         && (loc.y - size / 2 <= b.loc.y && b.loc.y <= loc.y + size / 2)){
        isDead = true;
        b.isDead = true;
        break;
      }
    }
    for(Enemy e: enemies){
      if(abs(loc.x - e.loc.x) < size / 2 + e.size / 2 && abs(loc.y - e.loc.y) < size / 2 + e.size / 2){
        isDead = true;
        e.isDead = true;
        break;
      }
    }
  }
}

class Bullet{

  PVector loc;
  float vel;
  boolean isMine;
  boolean isDead;

  Bullet(){
    loc = new PVector(myself.loc.x, myself.loc.y);
    vel = -10;
    isMine = true;
  }

  Bullet(Enemy enemy){
    loc = new PVector(enemy.loc.x, enemy.loc.y);
    vel = 5;
    isMine = false;
  }

  void display(){
    if(isMine){
      stroke(0, 255, 0);
    } else {
      stroke(255, 0, 0);    
    }
    line(loc.x, loc.y, loc.x, loc.y + vel);    
  }

  void update(){
    loc.y += vel;
    if((vel > 0 && loc.y > height) || (vel < 0 && loc.y < 0)){
      isDead = true;
    }
  }  
}

class Enemy{

  PVector loc;
  float vel;
  float size;
  int coolingTime;
  boolean isDead;

  Enemy(){
    size = 25;
    loc = new PVector(random(size / 2, width - size / 2), -size / 2);
    vel = 3;
    coolingTime = int(random(60));
    isDead = false;
  }

  void display(){
    noFill();
    stroke(255, 0, 0);
    rect(loc.x, loc.y, size, size);
  }

  void update(){
    loc.y += vel;
    if(loc.y > height){
      isDead = true;
    }
    coolingTime++;
    if(coolingTime >= 60){
      eneBullets.add(new Bullet(this));
      coolingTime = 0;
    }
    for(Bullet b: myBullets){
      if((loc.x - size / 2 <= b.loc.x && b.loc.x <= loc.x + size / 2)
         && (loc.y - size / 2 <= b.loc.y && b.loc.y <= loc.y + size / 2)){
        isDead = true;
        b.isDead = true;
        break;
      }
    }
  }    
}

如果您能告诉我需要更改或修复哪些部分,那将对我有很大帮助,谢谢。

标签: javahtmlcssarraylistp5.js

解决方案


这是你的代码:

 class myself{
constructor()
{
this.x = 0;
this.y = height-35;
this.size = 25;
this.health = 25;
this.cooldown = 0;
this.plrBullets = [];


}update(){this.cooldown++;

if (mouseIsPressed && this.cooldown>10)
{
  this.cooldown = 0;
  this.plrBullets.push(new Bullet(true,this.x,this.y));
}

let nextPlrBullets = [];
for (let i = 0; i<this.plrBullets.length; i++)
{
  this.plrBullets[i].update();
  if (this.plrBullets[i].alive)
  {
    nextPlrBullets.push(this.plrBullets[i]);
  }
}
this.plrBullets = nextPlrBullets;

this.x += constrain(mouseX - this.x, -10, 10);

for (let i = 0; i<eneBullets.length; i++)
{
  let c = eneBullets[i];
  if (c.x > this.x && c.x < this.x + 25 && c.y > this.y && c.y < this.y + 25) 
  {
    this.health--;
    c.alive = false;
    
    if (this.health<=0)
    {
      print("you lost")
    }
  }
}

noFill();
stroke(0,255,0);
rect(this.x,this.y,this.size,this.size);
}
}
class enemy{
 constructor()
{
this.x = random(15,width-15);
this.y = random(-100,0);
this.size = 25;
this.cooldown = 0;
this.alive = true;


 }
   update()
   {    
      this.y+=2.5;
     this.cooldown++;
  
  if (this.cooldown>20)
  {
  this.cooldown = 0;
  eneBullets.push(new Bullet(false,this.x,this.y));
}

let nextEneBullets = [];
for (let i = 0; i<eneBullets.length; i++)
{
  eneBullets[i].update();
  if (eneBullets[i].alive)
  {
    nextEneBullets.push(eneBullets[i]);
  }
}
eneBullets = nextEneBullets;

for (let i = 0; i<my_self.plrBullets.length; i++)
{
  let c = my_self.plrBullets[i];
  if (c.x > this.x && c.x < this.x + 25 && c.y > this.y && c.y < this.y + 25) 
  {
    this.alive = false
    c.alive = false;
  }
}

if (this.y>height+35)
{
  this.y = random(-100,0);
}

noFill();
stroke(255,0,0);
rect(this.x,this.y,this.size,this.size);
}
}
class Bullet{
 constructor(dir,x,y)
{
this.x = x;
this.speed = 5;
this.dir = dir;
this.alive = true;
this.y = y;
}
update()
{
if (this.dir)
{
  this.y -= this.speed;
}else{
  this.y += this.speed;
}

if (this.y<-20)
{
  this.alive = false;
}//this.y = -25;

if(this.dir)
{
  stroke(0,255,0);
}else{
  stroke(255,0,0);
}
line(this.x,this.y,this.x,this.y+25);
}
}

let my_self;
let eneBullets = [];
let enemies = [];

function setup()
{
 createCanvas(640,640);
 rectMode(CENTER);

 my_self = new myself();

 for (let i = 0; i<10; i++)
{
  enemies.push(new enemy());
}
}

function draw()
{
background(0);

if(random(1) < 0.02 && enemies.length<15){
enemies.push(new enemy());
}

my_self.update();

let newEnimies = [];
for (let i = 0; i<enemies.length; i++)
{
enemies[i].update();
if (enemies[i].alive)
{
  newEnimies.push(enemies[i]);
}
s}
enemies = newEnimies;

if (enemies.length == 0)
{
  print("you win");
}
}

抱歉,碰撞有点古怪,但是在将处理转换为 p5 时,这里有一些提示:

1:不使用数组列表,使用带有 push 的数组而不是 add 2:没有数据类型 LET 3:打印不是 println 4:类构造函数被声明为“构造函数”而不是类名 5:在函数声明之前使用“函数”而不是 void 6:pvector 是向量 7:google 是你的朋友 8:p5 文档


推荐阅读