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

烤熟食

我正在处理中的2D游戏。

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

每个游戏循环:

  • 玩家速度已添加到该位置
  • 玩家的加速度被添加到速度中
  • 加速度设置为沿鼠标方向,并与从鼠标到屏幕中心的距离成比例。
  • 速度+ =(速度*阻力),因此当您改变方向时,您会获得一个平滑的过渡。

因此,基本上,您总是以与鼠标到播放器(屏幕中心)的距离成比例的速度向鼠标移动。

到目前为止,我的所有工作原理都可以正常工作,只是我的世界中的物体绘制方式存在一个错误。当我移动时,物品会根据方向而略微移动,但它们的动作很平滑,就好像它与我的速度有关。它看起来非常像拖曳效果。

我添加了一个世界边界,以及世界上一些随机的圆圈。边框似乎停留在正确的位置,但是如果我沿与墙相反的方向移动,则边缘附近的圆圈可能会越过边缘。

任何想法可能是什么原因造成的?这是相关的代码(对不起,有一点点..)

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;
  }
}
凯文·沃克曼

将来,请尝试发布MCVE,而不是整个项目。将其缩小到尽可能少的代码行。就您而言,您只需要显示两个圆圈,即可删除任何其他代码,例如显示飞船。

话虽如此,您的问题是由多种因素引起的:

  • 您的“星星”的位置存储在中PVector,并将其存储为float值。
  • offsetXoffsetY也是float价值观。
  • 但是,像素始终是int值!(半个像素实际上没有任何意义。)

发生的情况是,您的起点移动的间隔略有不同,您的眼睛察觉到它是零星的运动。这是由于值在不同时间float达到下一个int而引起的

假设您有两个职位:一个在[0, 10],另一个在[.6, 20]最初,它们具有相同的像素X值0,因为像素始终是int值。现在,假设您xOffset.5,然后将其添加到您的职位中以获得[.5, 10][1.1, 20]现在,他们有不同的像素的X值01,这使得它看起来像第二个移动,但第一个也没有!这就是造成您的问题的原因。

有很多方法可以解决此问题,但最简单的方法可能是将星星位置初始化为int值:

PVector vec = new PVector(int(random(-width,width*2)), int(random(-height,height*2)));

这也是为什么您的墙看起来不错的原因:实际上这只是您要更新的一个位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的玩家的移动速度会发生变化?(在 Unity 中使用渔网)

为什么当我转换为 ndarray 时我的日期列会发生变化

通过JNI在Java代码中运行EGL函数时,为什么我对EGL函数的调用会发生变化?

为什么当我将其设为链接时,文本的位置会发生变化?

为什么在使用React Redux过滤时我的原始状态会发生变化

为什么在应用算术运算时我的“dtype”会发生变化?

为什么当我使用动画时项目的位置会发生变化?

为什么在Java中调用setTimeout函数之前,我的值会发生变化?

为什么我的按钮样式在笔记本电脑和移动设备上会发生变化

为什么当我使用不应对视图作出反应的着色器在模型周围移动视图时,它会发生变化?

当我在反应中设置其他对象的状态时,为什么我的数组值会发生变化?

滚动时,为什么RecyclerView中的CardView内容(以我为例)会发生变化?

当我将其写入文件时,为什么3D numpy数组中的值会发生变化?

为什么我的按钮使用 React-icon 组件时返回值会发生变化?

为什么遍历方阵时会发生变化?

为什么[0]会发生变化?

为什么“to”道具在点击时会发生变化?

为什么索引值会发生变化?

为什么在 Java TreeMap 中调用 iterator.remove() 时相同的 Map.Entry 会发生变化?

为什么在 Java TreeMap 中调用 iterator.remove() 时相同的 Map.Entry 会发生变化?

为什么使用poi api java从excel文件读取数据时格式会发生变化?

为什么上传照片时我的 gui 布局会发生变化?

为什么我的变量被调用时会发生变化?

为什么滚动后我的单元格中的图标会发生变化?

如果我使用传播运算符,为什么状态会发生变化?

为什么在运行“插入”函数后我的数字变量会发生变化?

为什么我的CSS宽度%在某些页面上会发生变化?

为什么我的for循环(python)在4次迭代后会发生变化?

为什么在我的代码运行时unsortedArray会发生变化?