You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用p5.play开发太空侵略者时敌人精灵触边消失问题求助

太空侵略者(p5.play)敌人触边消失问题排查与修复

我用学校指定的p5.play开发《太空侵略者》,把无类结构的教程代码改成类结构后,敌人精灵碰到屏幕右边缘就全部消失,查不出原因。刚接触这个开发环境,卡壳了。期望效果是敌人触边后下移并改变移动方向,相关问题分析及修复方案如下:

核心错误点

  • 边缘检测逻辑失效:用enemies[i].position.x == windowWidth判断右边缘,精灵的position是中心坐标,且精确匹配几乎无法触发(精灵逐帧移动会跳过该值),导致逻辑异常。需基于精灵的实际边缘位置判断。
  • 无效属性调用:enemies.h是错误用法——enemies是Group对象,没有h属性,赋值NaN会导致精灵位置异常消失,应使用单个精灵的height属性。
  • 非标准属性引用:Enemy类move方法中使用this.sprite.pos.x,建议改用p5.play标准的this.sprite.position.x(或简写this.sprite.x)。

修复后的完整代码

let stars;
let star;
let numStars;

let players;
let player; 
let playerWidth;
let playerHeight;

let alienImg;
let enemies;
let enemy;

let left;
let right;

let rows;
let cols;

function preload() {
  alienImg = loadImage('images/alien11s.png');
}

function setup() {
  createCanvas(windowWidth, windowHeight);
  stars = new Group();
  players = new Group();
  enemies = new Group();

  numStars = random(100, 250);
  for(let x = 0; x < numStars; x++) {
    star = new Star();
    stars.add(star.sprite);
  }

  playerWidth = 50;
  playerHeight = 20;
  player = new Player();
  players.add(player.sprite);

  rows = 5;
  cols = 10;

  for(let x = 1; x < cols + 1; x++) {
    for(let y = 1; y < rows + 1; y++) {
      enemy = new Enemy(x, y);
      enemies.add(enemy.sprite);
    }
  }
  
}

function draw() {
  background('black');
  left = false;
  right = false;

  // 修正边缘检测:基于精灵左右边界判断
  for(let i = 0; i < enemies.length; i++) {
    const enemySprite = enemies[i];
    if(enemySprite.position.x - enemySprite.width/2 <= 0){
      right = true;
    } else if(enemySprite.position.x + enemySprite.width/2 >= windowWidth) {
      left = true;
    }
  }

  if(right) {
    for(let i = 0; i < enemies.length; i++) {
      enemies[i].position.y += enemies[i].height;
      enemies[i].vel.x *= -1;
    }
  }else if(left) {
    for(let i = 0; i < enemies.length; i++) {
      enemies[i].position.y += enemies[i].height;
      enemies[i].vel.x *= -1;
    }
  }

  stars.draw();
  player.playerMove();
  players.draw();
  for(let i = 0; i < enemies.length; i++) {
    enemies[i].move();
  }
  enemies.draw();
}


class Star {
  constructor() {
    this.posX = random(5, windowWidth - 5);
    this.posY = random(5, windowHeight - 5);
    this.sprite = createSprite(this.posX, this.posY);
    this.sprite.diameter = 2;
    this.sprite.collider = 'n';
    this.sprite.shapeColor = color('yellow');
  }
}

class Player {
  constructor() {
    this.sprite = createSprite(windowWidth / 2, windowHeight - playerHeight, playerWidth, playerHeight)
  }

  playerMove() {
    if(kb.pressing('left')) {
      this.sprite.move(5, 'left', 5);
    }else if(kb.pressing('right')) {
      this.sprite.move(5, 'right', 5);
    }
  }
}

class Enemy {
  constructor(posX, posY) {
    this.w = 40;
    this.h = 40;
    this.speed = 5;
    this.sprite = createSprite(posX * this.w * 2, posY * this.h * 2, this.w, this.h);
    this.sprite.vel.x = 3;
    this.sprite.image = alienImg;
    this.sprite.scale = 0.5;
    this.sprite.collider = 'n';
  }

  move() {
    this.sprite.position.x += this.sprite.vel.x;
  }
}

内容的提问来源于stack exchange,提问作者user2369258

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:05:12