【问题标题】:Moving objects together一起移动物体
【发布时间】:2020-02-18 12:14:25
【问题描述】:

编写一个公共实例方法 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);


   }

【问题讨论】:

    标签: java bluej


    【解决方案1】:

    您的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 的?

    【讨论】:

    • 考虑提供的方法 alignHead(),它使头部相对于简笔画的身体的 xPos 和 yPos 对齐,因此它在身体正上方居中。确保您了解它的工作原理。编写 alignBody() 相当简单,因为 body 只是简单地放置在简笔画本身的坐标处,但 alignLeg() 会花更多的心思。 i. 编写一个不带参数且不返回值的公共实例方法 alignBody()。它应该将 body 的 xPos 和 yPos 设置为 StickFigure 的 xPos 和 yPos。
    • 我认为您首先想从 alignBody 中获取数字,使用 xpos 和 ypos 代替。然后 alignAll 应该处理您所说的内容。因为头会跟随身体。然后你的 moveAll 不应该直接重置身体的 xpos 和 ypos。它应该自己重置 xpos 和 ypos,然后调用 alignAll,这将从移动身体开始。是的,我在这里发表评论,因为我认为这就是这个答案所要考虑的。
    • 这里的想法是对的。但是,除非您将 alignBody 修复为不进行硬编码,否则 alignAll 会将所有内容移回。或者,alignAll 不应调用 alignBody。
    • this.xPos + xPos 可以,但是调用参数 deltaX 会清晰很多。
    • 考虑提供的方法 alignHead(),它使头部相对于简笔画的身体的 xPos 和 yPos 对齐,因此它在身体正上方居中。确保您了解它的工作原理。编写 alignBody() 相当简单,因为 body 只是简单地放置在简笔画本身的坐标处,但 alignLeg() 会花更多的心思。 i. 编写一个不带参数且不返回值的公共实例方法 alignBody()。它应该将 body 的 xPos 和 yPos 设置为 StickFigure 的 xPos 和 yPos。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多