2017-06-30 60 views
0

我嘗試使用Java Swing模擬無人機羣集。jPanel的同步

無人機的飛行跟蹤紅外點。

每個羣組成員類擴展JPanel並重寫paint函數,它的作用是根據領導地位

@Override 
public void paint(Graphics g) { 
    super.paint(g); 

    for (int x = currX_1 - currIRdim; x < currX_1 + currIRdim; x++) { 
     for (int y = currY_1 - currIRdim; y < currY_1 + currIRdim; y++) { 
      g.setColor(Color.RED); 
      g.drawLine(x, y, x, y); 
     } 
    } 

    for (int x = currX_2 - currIRdim; x < currX_2 + currIRdim; x++) { 
     for (int y = currY_2 - currIRdim; y < currY_2 + currIRdim; y++) { 
      g.setColor(Color.RED); 
      g.drawLine(x, y, x, y); 
     } 
    } 
} 

的羣的領導者和他身邊的無人機更新以下成員的面板其面板上繪製IR點每個移動

private void updateFollowers(AgentIrPanel[] screensToUpdate, String command) { 
    int xdiff = screensToUpdate[0].getDiffX(); 
    int dimdiff = screensToUpdate[0].getDiffDim(); 
    switch (behaviour) { 
     case SWARM_LEADER: 
      screensToUpdate[0].setCurrX_1(screensToUpdate[0].getCurrX_1() + xdiff); 
      screensToUpdate[0].setCurrX_2(screensToUpdate[0].getCurrX_2() + xdiff); 
      screensToUpdate[0].repaintPoints(); // call jpanel.repaint() 

      screensToUpdate[1].setCurrIRdim(screensToUpdate[1].getCurrIRdim() - dimdiff); 
      screensToUpdate[1].repaintPoints(); 
      break; 
     case FOLLOW_LEFT: 
      screensToUpdate[0].setCurrIRdim(screensToUpdate[0].getCurrIRdim() - dimdiff); 
      screensToUpdate[0].repaintPoints(); 
    } 
} 

以下成員得到他們的面板2 IR點的和公認的從先前點的差異,這決定向他們應該移動

private String secRowReading() { 
    BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = img.createGraphics(); 
    this.paint(g2); 

    if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_2 - IRdim ,Y_2 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_1 - IRdim + diffX, Y_1 - IRdim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim + diffX, Y_1 - IRdim)).equals(Color.RED))){ 
     ans = "right"; 
    }else if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_2 - IRdim ,Y_2 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_1 - IRdim - diffX, Y_1 - IRdim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim - diffX, Y_1 - IRdim)).equals(Color.RED))){ 
     ans = "left"; 
    }else if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_2 - IRdim,Y_2 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_1 - IRdim + diffDim ,Y_1 - IRdim + diffDim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim + diffDim ,Y_2 - IRdim + diffDim)).equals(Color.RED))) { 
     ans = "front"; 
    }else if ((new Color(img.getRGB(X_1 - IRdim - diffDim,Y_1 - IRdim -diffDim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim - diffDim,Y_2 - IRdim -diffDim)).equals(Color.RED))){ 
     ans = "back"; 
    }else { 
     ans = "stop"; 
    } 

    g2.dispose(); 
    return ans; 
} 

問題是 - 以下的無人機不能一起讀這個閱讀成功,只有當他們單獨操作時。 在飛行過程中,其中一名追隨者不能及時識別領導已經應用並停止的變化,這會擾亂整個航班。

我試圖用Timer()延遲每個後續無人機的閱讀計劃,但沒有成功。如何同步它以正常工作?

+0

......................你好? –

回答

2

每個羣組成員類擴展JPanel並重寫paint函數,它的作用是根據領導地位

其面板上繪製IR點,這裏有一個問題。不要這樣做。不要讓你的精靈擴展一個「重量級」的課程,而且這不必要地讓你的程序複雜化。相反,您的Sprites是非組件類,即不擴展任何Swing或AWT組件類型,而是在之間繪製一個繪製JPanel,其paintComponent方法已被覆蓋且其super.paintComponent(g)已被調用。

我想給Swarm類一個public void draw(Graphics2D g2)方法,創建它們的集合,也許List<Swarm>,然後在paintComponent方法中遍歷列表,傳遞從JVM獲得的Graphics2D對象,繪製每個sprite /羣體對象。

其他問題:一定要從GUI代碼中提取Swarm對象的行爲和邏輯。邏輯代碼應該是程序模型的一部分,而不是View(GUI)的一部分,它的工作是顯示模型的狀態,並允許用戶與模型交互(通過Controller)。

+0

我遵循你的指導原則,現在一切都很好,我也學到了很多關於我犯的錯誤,謝謝! – ZaKad