java - 一起移动物体
问题描述
编写一个公共实例方法 move(),它接受两个整数参数,表示实例变量 xPos 和 yPos 值的更改量。该方法不应返回任何值。它应该利用提供的方法 delay() 来暂停,以便重复运行该方法的效果是可见的,例如 this.delay(20);
暂停执行 20 毫秒。
通过移动 StickFigure 的实例并检查它是否保持对齐来测试您的代码。
我的代码如下,但我似乎无法弄清楚如何将所有 3 个形状一起移动,只有三角形似乎在移动。
public class StickFigure
{
/*Instance variables*/
private int xPos;//The horizontal position of a StickFigure
private int yPos;//The vertical position of a StickFigure
private Circle head;
private Triangle body;
private Rectangle leg;
// add your declarations here for part (a)(i)
/**
* Constructor for objects of class StickFigure that
* provides a default stick figure near the bottom left corner of the graphical display.
*
*/
public StickFigure()
{
super();
this.head = new Circle (30, OUColour.PINK);
this.body = new Triangle (50, 50, OUColour.RED);
this.leg = new Rectangle (6, 50, OUColour.PINK);
this.setXPos(25); //sets starting position towards bottom left of Shapes window
this.setYPos(220);
this.alignAll();
}
/**
* Sets the xPos of the receiver to the value of the argument.
*/
public void setXPos(int newPos)
{
this.xPos = newPos;
this.body.setXPos(newPos);
this.alignAll();
//part (b)(iii)
}
/**
* Returns the xPos of the receiver.
*/
public int getXPos()
{
return this.xPos;
}
/**
* Sets the yPos of the receiver to the value of the argument.
*/
public void setYPos(int newPos)
{
this.yPos = newPos;
this.body.setYPos(newPos);
this.alignAll();
//part (b)(iii)
}
/**
* Returns the yPos of the receiver.
*/
public int getYPos()
{
return this.yPos;
}
/**You will need to uncomment these methods when directed to*******/
/**
* Returns a reference to the head of the receiver.
*/
public Circle getHead()
{
return this.head;
}
/**
* Returns a reference to the body of the receiver.
*/
public Triangle getBody()
{
return this.body;
}
/**
* Returns a reference to the leg of the receiver.
*/
public Rectangle getLeg()
{
return this.leg;
}
/**
* Aligns the head of the receiver relative to the xPos and yPos of the body.
*/
public void alignHead()
{
this.head.setXPos(this.body.getXPos() + (this.body.getWidth() - this.head.getDiameter())/2);
this.head.setYPos(this.body.getYPos() - this.head.getDiameter());
}
/**
* Aligns the body of the receiver relative to the xPos and yPos of the head.
*/
public void alignBody()
{
this.body.setXPos(25);
this.body.setYPos(220);
}
/**
* Aligns the leg of the receiver relative to the xPos and yPos of the head and body.
*/
public void alignLeg()
{
this.leg.setXPos(this.body.getXPos() + (this.body.getWidth() - this.leg.getWidth())/2);
this.leg.setYPos(this.body.getYPos() + this.leg.getHeight());
}
/**
* Aligns all the body parts of the receiver to form the
* StickFigure-type figure.
*/
public void alignAll()
{
this.alignBody();
this.alignHead();
this.alignLeg();
}
public void move(int xPos, int yPos)
{
this.alignAll();
this.body.setXPos(xPos + xPos);
this.body.setYPos(yPos + yPos);
this.delay(20);
}
解决方案
您不应该move()
设置 xPos 和 yPos。所以:
this.body.setXPos(xPos + xPos);
this.body.setYPos(yPos + yPos);
应该
this.setXPos(this.xPos + xPos);
this.setYPos(this.yPos + yPos);
其次是alignAll()
然后你alignBody()
说:“将接收器的身体相对于头部的 xPos 和 yPos 对齐”但你的方法没有这样做......看起来头部/腿是相对于身体的。那么也许物体 X、Y 应该与 xPos 和 yPos 相关?
推荐阅读
- java - 如何向洋葱服务器发送http请求?
- html - 布局菜单项,更改所选页面“项目”的样式
- prometheus-alertmanager - Alertmanager 中的指纹字段是否唯一?
- android - Ionic 4 与 Ionic 3 中的后台工作人员
- c# - BoundedChannel、BufferBlock 还是其他?
- react-native - reducer 返回状态,但未调用组件 getDerivedStateFromProps
- c# - 改源后UWP播放MediaElement
- sql - 在 SQL Server 2016 中使用 JSON 进行字符串聚合
- angular - 在 angular2 中使用 HttpParams 的 Http 获取返回 404 错误
- python - 我可以使用标记化的输入文件和高棉语的自定义词汇文件从头开始预训练 BERT 模型吗