当前位置: 首页 > 知识库问答 >
问题:

类中的平台在被调用时不移动

公西财
2023-03-14

为了大学课程,我正在和一个朋友做一个游戏。一般的想法是,我们有一些平台从右向左移动,每次一个平台离开屏幕时,它都会在右侧随机的xy位置生成(在一定范围内)。会有一个小精灵从一个平台跳到另一个平台。

我们遇到了一个不确定如何解决的问题。我们有所有正确的代码和一切,但平台就是不动。它们应该以每帧-4像素的恒定速度向左移动(rectVel没错)。

然而,我们无法让它们移动;它们在屏幕上的位置是静态的,每个人最初被呼叫的位置。

这是我能做的最简洁的代码:

Platforms [] mainPlats;

void setup() {
  size(750, 400);

  mainPlats = new Platforms[3];
}

void draw() {
  level();
}

void level() {

  //This is the code for the first platform
  mainPlats[0] = new Platforms(200, 200, 100, 15); //These values need to be     set inside the class so that
  //they aren't constantly overwriting the movement variables in the class
  mainPlats[0].displayPlat();
  mainPlats[0].platTransition();


  //This is the code for the second platform
  mainPlats[1] = new Platforms(420, 300, 100, 15);
  mainPlats[1].displayPlat();
  mainPlats[1].platTransition();


  //This is the code for the third platform
  mainPlats[2] = new Platforms(570, 350, 100, 15);
  mainPlats[2].displayPlat();
  mainPlats[2].platTransition();
}

class Platforms {
  PImage platform;
  int rectX, rectY, rectWidth, rectHeight;
  int rectVelocity = 4;

  Platforms(int x, int y, int w, int h) {
    rectX = x; 
    rectY = y;
    // rectX = (int(random(600, 800))); //Tried to randomise start position,     failed hilariously
    //rectY = (int(random(150, 350)));
    rectWidth = w;
    rectHeight = h;
  }

  void displayPlat() {
    platform = loadImage ("images/tiles.png");
    //imageMode(CENTER);

    image(platform, rectX, rectY, 100, 15); //rectangle platforms replaced     with images
  }

  void platMove() {
    rectX -= rectVelocity;
  }

  void platTransition() {
    if (rectX < -200) {
      rectX = (int(random(700, 1000)));
      rectY = (int(random(150, 350)));
    }
  }
 }

共有2个答案

谭毅然
2023-03-14

把rectX作为正值(

终波涛
2023-03-14

在draw()函数中,调用level()函数,该函数在每个帧初始化Platform数组。

这意味着您可以在每帧的起始位置创建新平台。你永远看不到平台在移动,因为一旦你移动它们,你就会在起始位置用新的平台替换它们。

第一步是将它们的初始化从level()函数中移出,只在草图的开头调用它们一次,setup()函数就是一个可以放置它们的地方。

你的另一个问题是,你从来没有真正调用platMove()函数。第二步是确保调用该函数。

解决方案可能看起来像这样:

Platforms [] mainPlats;

void setup() {
  size(750, 400);

  mainPlats = new Platforms[3];
  mainPlats[0] = new Platforms(200, 200, 100, 15);
  mainPlats[1] = new Platforms(420, 300, 100, 15);
  mainPlats[2] = new Platforms(570, 350, 100, 15);
}

void draw() {
  level();
}


void level() {
  mainPlats[0].displayPlat();
  mainPlats[0].platMove();
  mainPlats[0].platTransition();

  mainPlats[1].displayPlat();
  mainPlats[1].platMove();
  mainPlats[1].platTransition();

  mainPlats[2].displayPlat();
  mainPlats[2].platMove();
  mainPlats[2].platTransition();
}

还要注意的是,你也不应该每一帧都加载图像。你应该在启动时只加载一次。您可能还希望使用for循环在平台上迭代,而不是引用每个索引。但这些并不会真正影响你的问题。

 类似资料:
  • 我有一个MVC4网站,我正在尝试集成一些Mongodb功能(现在只是试验)。我正在使用这个mongodb项目,因为我也在尝试部署到Azure,这个项目提供了连接到mongodb工作者角色的连接实用程序。我有一个具有以下构造函数的MovieController: 这进而调用该类: 当试图从电影控制器加载任何页面时,我在Chrome调试器中得到一个内部服务器错误。 所以我尝试在视觉工作室调试。控制器构

  • 有没有人愿意帮助我在使用android studio的kotlin multi-platform mobile(KMM)和javafx(gluon)进行iOS/android应用程序开发之间做出决定。 -运行时性能(启动时间、代码大小、功耗等)-KMM的学习曲线(我不知道Kotlin,但如果KMM的开发环境只是在windows上两个目标平台,我就学会了。[gluon中的android开发需要lin

  • 要使你的 Dart 类实例像函数一样可以被调用,实现 call() 方法。 在下面的例子中,WannabeFunction 类定义了一个 call() 函数,它接受三个字符串参数并且连接它们,使用一个空格分隔每个字符串,最后附加一个感叹号。 class WannabeFunction { call(String a, String b, String c) => '$a $b $c!'; }

  • 不确定原因,但我检查它是否至少被识别为已删除,但它没有: $科尔多瓦平台 安装的平台: android

  • MOAC的基础链节点是基于 以太坊 项目开发的,具有类似的借口环境。 在MOAC基础链上开发分布式应用(DAPP) 1. 在MOAC基础链上部署Solidity编写的智能合约,确保有能够接入MOAC链的节点, 可以使用主网公共节点(http://gateway.moac.io/mainnet)或者测试网公共节点(http://gateway.moac.io/testnet)。 Remix, a b

  • 我试图使用Realm移动平台(Swift 3)制作一个具有实时协作的iOS应用程序,但由于缺乏文档和示例而陷入困境。目前我已经通过领域对象服务器进行了用户身份验证。我可以在服务器和所有用户之间同步数据。现在我希望两个用户在一个会话中连接,然后像在他们的绘图演示中一样在他们之间同步数据(观看https://realm.io视频)