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

为什么当我移动的时候,游戏中的事情会发生变化?Java处理环境

史钊
2023-03-14

我正在处理中创建一个2D游戏。

  • 播放机始终位于屏幕中央
  • 播放器始终面向鼠标
  • 移动是通过相对于玩家移动世界来实现的
    null

知道是什么引起的吗?这是相关的代码(对不起,这里有一个公平的..)

import java.util.ArrayList;

//constants
int ROCKET_WIDTH = 32;
int ROCKET_HEIGHT = 52;
float PLAYER_MAX_ACC = 0.4;
float PLAYER_MAX_VEL = 12;
float MOVEMENT_RESISTANCE = 0.05;

//global variables
Rocket player;
ArrayList<PVector> balls;
float offsetX;
float offsetY;

void setup()
{
  size(800,600);
  frameRate(30);
  background(0);
  player = new Rocket();
  balls = new ArrayList<PVector>();
  offsetX = width/2 - player.pos.x;
  offsetY = height/2 - player.pos.y;
  for (int i = 0;i < 100;i++)
  {
    PVector vec = new PVector(random(-width,width*2),random(-height,height*2));
    balls.add(vec);
  }
}

void draw()
{
  background(0);
  drawWorldEdges();
  updateMechanics();
  for (PVector b:balls)
  {
    ellipseMode(CENTER);
    ellipse(b.x + offsetX,b.y + offsetY,10,10);
  }
  drawPlayer();
}

void drawWorldEdges()
{
  //top,right,bottom,left
  strokeWeight(1);
  stroke(255);
  line(-width + offsetX,-height + offsetY,(width * 2) + offsetX,-height +offsetY);
  line((width*2) + offsetX,-height + offsetY,(width*2)+offsetX,(height*2)+offsetY);
  line(-width+offsetX,(height*2)+offsetY,(width*2)+offsetX,(height*2)+offsetY);
  line(-width+offsetX,-height+offsetY,-width+offsetX,(height*2)+offsetY);
}


void updateMechanics()
{
  offsetX = width/2 -player.pos.x;
  offsetY = height/2 - player.pos.y;
  updateFacing();
  getMoveInput();
  updatePhysics();
}

void updatePhysics()
{
  if (player.pos.x < width*2 && player.pos.x >= -width)
  {
    player.pos.x += player.vel.x;
  }
  if (player.pos.y < height*2 && player.pos.y >= -height)
  {
    player.pos.y += player.vel.y;
  }
  player.vel.x += -player.vel.x * MOVEMENT_RESISTANCE;
  player.vel.y += -player.vel.y * MOVEMENT_RESISTANCE;
}

void getMoveInput()
{
  PVector vel = new PVector(mouseX - width/2,mouseY - height/2);
  float distMult = dist(mouseX,mouseY,width/2,height/2)/(Math.min(width,height) / 2);
  vel = vel.normalize().setMag(PLAYER_MAX_ACC * distMult);
  PVector newVel = new PVector(player.vel.x,player.vel.y);
  newVel.add(vel);
  if (newVel.mag() <= PLAYER_MAX_VEL)
  {
    player.vel.add(vel);
  }
}

void updateFacing()
{
  float x = mouseX;
  if (x == 0)
  {
    x = 0.1;
  }
  player.facing = PI/2 + atan((mouseY-(height/2))/(x-(width/2)));
  if (x < width/2)
  {
    player.facing += PI;
  }
}

void drawPlayer()
{
  pushMatrix();
  translate(width/2,height/2);
  rotate(player.facing);
  stroke(255);
  strokeWeight(2);
  fill(127);
  rect(-ROCKET_WIDTH/4,0-ROCKET_HEIGHT/2,ROCKET_WIDTH/2,ROCKET_HEIGHT*0.75);
  rect(-ROCKET_WIDTH/2,0,ROCKET_WIDTH/4,ROCKET_HEIGHT*0.5);
  rect(ROCKET_WIDTH/4,0,ROCKET_WIDTH/4,ROCKET_HEIGHT*0.5);
  popMatrix();
}

火箭级:

class Rocket
{
  PVector pos;
  PVector vel;
  float facing; //radians
  boolean pressingW,pressingA,pressingS,pressingD,mouseLClicked = false;
  public Rocket()
  {
    pos = new PVector(0,0);
    vel = new PVector(0,0);
    facing = 0;
  }

  public Rocket(int x,int y)
  {
    pos = new PVector(x,y);
    vel = new PVector(0,0);
    facing = 0;
  }
}

共有1个答案

娄森
2023-03-14

在未来,请尝试张贴一个MCVE而不是你的整个项目。把它缩小到尽可能少的代码行。在您的情况下,您只需显示两个圆,您可以移除任何其他代码如显示船。

话虽如此,你的问题是由多种因素综合造成的:

  • “星星”的位置存储在pvector中,它将它们存储为float值。
  • 您的offsetxoffsety也是float值。
  • 但是,像素始终是int值!(有半个像素真的没有意义。)
PVector vec = new PVector(int(random(-width,width*2)), int(random(-height,height*2)));

这也是为什么你的墙看起来还不错:那实际上只是一个你正在更新的位置。

 类似资料:
  • 问题内容: 我无法想象自己对此有一个很好的答案,所以我想到了在这里提问。在我看来,我一直想知道如果我的 MySQL 表中的列用完了会怎样? 举例来说,我有一个包含两列的表。的 ID ()和 DESC ()。我当然知道很多,但是可以达到极限。如何处理场景,其中 的情况下, 该 ID 达到它的极限?我需要其他服务器吗?如果可以,该如何同步呢?这是正确的方法吗?任何有识之士的朋友。 问题答案: 它不会用

  • 谁能给我解释一下,当我改变从find函数返回的值时,为什么原始数组中的值会改变呢?是不是有一个我缺失的概念?在执行代码之后,我将得到下面提到的输出。

  • ap.offNetworkChange(CALLBACK) 移除网络环境发生变化事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <h2 class="am-ft-center">切换网络试试</h2> <scr

  • 当您以“正常”方式停止或重新启动tomcat时,正在处理的http请求会发生什么情况?它们将被处理直到响应完成还是http线程被中断?有没有办法配置优雅的停车?

  • 我很难让apache beam管道触发基于事件时间的触发器,但似乎能够随着处理时间触发窗口触发。 我的管道相当基本: > 我提取二级时间戳 我打开数据窗口进行处理 我按秒对数据进行分组,以便以后按秒对流数据进行分类。 我最终在分类的秒数上使用滑动窗口,有条件地每秒向pubsub发出两条消息中的一条。 我的问题似乎在步骤3中。 我试图在第3阶段使用与第5阶段相同的窗口策略,在分类秒数上运行滑动平均计