2016-09-24 3 views
0

GraphicsContextfillRect 메서드를 사용할 때. aA 사각형은 Canvas tilesetCanvas에 그려집니다. 그런 다음 setStrokestrokeLine 메서드를 사용하지만이 메서드는 fillRect 메서드와 같은 캔버스를 업데이트하지 않습니다. Canvas를 업데이트하는 특정 방법이 있습니까? 아니면 setStrokestrokeLine 메서드를 잘못 사용하고 있습니까?GraphicsContext strokeLine 메서드가 캔버스에 예상대로 그려지지 않습니다.

public class RedHacker extends Application { 

    // The four colors used for the tileset palette 
    final Color WHITE = new Color(1,1,1,0); 
    final Color LIGHTPURPLE = new Color(0.66,0,0.66,0); 
    final Color DARKPURPLE = new Color(0.33,0,0.33,0); 
    final Color BLACK = new Color(0,0,0,0); 

    private int[] redData; 
    private int[] tilesetHeaderAddresses; 
    private TilesetHeader[] tilesetHeaders; 
    private int[] mapHeaderPointers; 
    private int[] mapHeaderBanks; 
    private int[] mapHeaderAddresses; 
    private MapHeader[] mapHeaders; 

    public static void main(String[] args) { 

     launch(args); 

    } 

    @Override 
    /* Description: 
    * Sets up and starts the GUI. 
    * 
    * Parameters: 
    * hackingStage: The Stage for this GUI 
    */ 
    public void start(Stage hackingStage) { 

     initStage(hackingStage); 
     hackingStage.show(); 

    } 

    /* Description: 
    * Sets up the Stage with its various children 
    * 
    * Parameters: 
    * hackingStage: The Stage for this GUI 
    */ 
    private void initStage(Stage hackingStage) { 

     // Root node for this GUI 
     // TODO Set alignments and margins for children 
     BorderPane hackingRoot = new BorderPane(); 
     // Scene for this GUI 
     Scene hackingScene = new Scene(hackingRoot); 

     hackingStage.initStyle(StageStyle.DECORATED); 
     hackingStage.setMaximized(true); 
     hackingStage.setScene(hackingScene); 
     hackingStage.setTitle("Pokemon Red Hacker :)"); 
     initBorderPane(hackingStage, hackingRoot); 
    } 

    /* Description: 
    * Sets up the children in the BorderPane 
    * 
    * Parameters: 
    * hackingStage: The stage for this GUI 
    * hackingRoot: The root pane for this GUI 
    */ 
    private void initBorderPane(Stage hackingStage, BorderPane hackingRoot) { 

     // Typical MenuBar 
     MenuBar hackingMB = new MenuBar(); 
     // Shows File on the MenuBar 
     Menu fileMenu = new Menu("File"); 
     // MenuItem for opening a file 
     MenuItem openMI = new MenuItem("Open"); 
     // TabPane for different editors 
     TabPane hackingTP = new TabPane(); 
     // Tab for the tileset editor 
     Tab tilesetTab = new Tab("Tilesets"); 
     // Canvas for the tileset editor 
     Canvas tilesetCanvas = new Canvas(90, 90); 
     // GraphicsContext for drawing on the canvas 
     GraphicsContext gc = tilesetCanvas.getGraphicsContext2D();; 


     hackingMB.getMenus().add(fileMenu); 
     fileMenu.getItems().add(openMI); 
     openMI.setOnAction(new EventHandler<ActionEvent>() { 
      @Override public void handle(ActionEvent e) { 
       openMIEvent(hackingStage, gc); 
      } 
     }); 
     hackingRoot.setTop(hackingMB); 
     hackingTP.setSide(Side.LEFT); 
     hackingTP.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE); 
     tilesetTab.setClosable(false); 
     tilesetTab.setContent(tilesetCanvas); 
     hackingTP.getTabs().add(tilesetTab); 
     hackingRoot.setCenter(hackingTP); 
     gc.setFill(Color.BLUE); 
     gc.fillRect(10,10,80,80); 
    } 

    /* Description: 
    * Opens a FileChooser when the File MenuItem is triggered 
    * 
    * Parameters: 
    * hackingStage: The stage for this GUI 
    */ 
    private void openMIEvent(Stage hackingStage, GraphicsContext gc) { 

     // Typical FileChooser for opening a .gb file 
     FileChooser fc = new FileChooser(); 

     fc.setSelectedExtensionFilter(new ExtensionFilter("GameBoy File", ".gb")); 
     fc.setTitle("Open GameBoy File:"); 
     File sf = fc.showOpenDialog(hackingStage); 
     if(sf != null){ 
      try{ 
       parseFile(sf, gc); 
      }catch (IOException e) { 
       System.out.println("Error opening file"); 
      } 
     } 
    } 

    private void parseFile(File sf, GraphicsContext gc) throws IOException { 
     FileInputStream in = null; 
     int i = 0; 
     int size; 

     redData = new int[(Math.toIntExact(sf.length()))]; 
     size = redData.length; 
     try{ 
      in = new FileInputStream(sf); 
      while(i < size){ 
       redData[i] = in.read(); 
       i++; 
      } 
     } finally{ 
      if(in != null){ 
       in.close(); 
      } 
     } 

     getTilesetHeaderAddresses(); 
     generateTilesetHeaders(); 
     drawTileset(1, gc); 

     getMapHeaderPointers(); 
     getMapHeaderBanks(); 
     getMapHeaderAddresses(); 
     generateMapHeaders(); 

     System.out.println(":)"); 
    } 

    private void getTilesetHeaderAddresses() { 
     int i = 0; 
     tilesetHeaderAddresses = new int[23]; 
     while(i < 23){ 
      tilesetHeaderAddresses[i] = (51134 + (i * 12)); 
      i++; 
     } 
    } 

    private void generateTilesetHeaders() { 
     int i = 0; 
     tilesetHeaders = new TilesetHeader[23]; 
     while(i < 23){ 
      tilesetHeaders[i] = new TilesetHeader(redData, tilesetHeaderAddresses[i]); 
      i++; 
     } 
    } 

    private void drawTileset(int tilesetIndex, GraphicsContext gc) { 
     int i = 0; 
     while(i < 95){ 
      if(i < 10){ 
       drawTile(tilesetIndex, i*8, 0, gc); 
      } else if(i < 20){ 
       drawTile(tilesetIndex, (i-10)*8, 8, gc); 
      } else if(i < 30){ 
       drawTile(tilesetIndex, (i-20)*8, 16, gc); 
      } else if(i < 40){ 
       drawTile(tilesetIndex, (i-30)*8, 24, gc); 
      } else if(i < 50){ 
       drawTile(tilesetIndex, (i-40)*8, 32, gc); 
      } else if(i < 60){ 
       drawTile(tilesetIndex, (i-50)*8, 40, gc); 
      } else if(i < 70){ 
       drawTile(tilesetIndex, (i-60)*8, 48, gc); 
      } else if(i < 80){ 
       drawTile(tilesetIndex, (i-70)*8, 56, gc); 
      } else if(i < 90){ 
       drawTile(tilesetIndex, (i-80)*8, 64, gc); 
      } else{ 
       drawTile(tilesetIndex, (i-90)*8, 72, gc); 
      } 
      i++; 
     } 
    } 

    private void drawTile(int tilesetIndex,int xStart, int yStart, GraphicsContext gc) { 
     boolean bitTwoIsOne; 
     boolean bitOneIsOne; 
     int tileByte1; 
     int tileByte2; 
     int i = 0; 
     int y = yStart; 
     int j; 
     int x; 
     PixelWriter pw; 
     int temp1; 
     int temp2; 
     int address; 

     try{ 
      temp1 = xStart/8; 
     } catch(Exception e){ 
      temp1 = 0; 
     } 
     try{ 
      temp2 = 10*(yStart/8); 
     } catch(Exception e){ 
      temp2 = 0; 
     } 

     address = temp1+temp2; 

     tileByte1 = redData[(tilesetHeaders[tilesetIndex].getTilesAddress())+address]; 
     tileByte2 = redData[(tilesetHeaders[tilesetIndex].getTilesAddress())+1+address]; 

     while(i < 8){ 
      j = 7; 
      x = 0; 
      while(j > -1){ 
       bitTwoIsOne = false; 
       bitOneIsOne = false; 
       if(((tileByte2 & (1 << (j))) >> (j)) == 1){ 
        bitTwoIsOne = true; 
       } 
       if(((tileByte1 & (1 << (j))) >> (j)) == 1){ 
        bitOneIsOne = true; 
       } 
       if(bitTwoIsOne && bitOneIsOne){ 
        gc.setStroke(BLACK); 
        gc.strokeLine(x, y, x+1, y+1); 
       }else if(bitTwoIsOne){ 
        gc.setStroke(DARKPURPLE); 
        gc.strokeLine(x, y, x+1, y+1); 
       }else if(bitOneIsOne){ 
        gc.setStroke(LIGHTPURPLE); 
        gc.strokeLine(x, y, x+1, y+1); 
       }else{ 
        gc.setStroke(WHITE); 
        gc.strokeLine(x, y, x+1, y+1); 
       } 
       j--; 
       x++; 

      } 
      y++; 
      i++; 
     } 
    } 

    private void getMapHeaderPointers() { 
     int i = 0; 
     mapHeaderPointers = new int[248]; 
     while(i < 248){ 
      short test1 = (short) (redData[(2*i)+431] << 8); 
      short test2 = (short) (redData[(2*i)+430] & 0xFF); 
      mapHeaderPointers[i] = (short) ((test1) | (test2)); 
      i++; 
     } 
    } 

    private void getMapHeaderBanks() { 
     int i = 0; 
     mapHeaderBanks = new int[248]; 
     while(i < 248){ 
      mapHeaderBanks[i] = redData[49725+i]; 
      i++; 
     } 
    } 

    private void getMapHeaderAddresses() { 
     int i = 0; 
     mapHeaderAddresses = new int[248]; 
     while(i < 248){ 
      mapHeaderAddresses[i] = (mapHeaderBanks[i]*0x4000) + (mapHeaderPointers[i]%0x4000); 
      i++; 
     } 
    } 

    private void generateMapHeaders() { 
     int i = 0; 
     mapHeaders = new MapHeader[248]; 
     while((i < 248)){ 
      if((i != 11) & (i != 105) & (i != 106) & (i != 107) & (i != 109) & (i != 110) & (i != 111) & (i != 112) & (i != 114) & (i != 115) & (i != 116) & (i != 117) & (i != 204) & (i != 205) & (i != 206) & (i != 231) & (i != 237) & (i != 238) & (i != 241) & (i != 242) & (i != 243) & (i != 244)){ 
       mapHeaders[i] = new MapHeader(redData, mapHeaderAddresses[i], mapHeaderBanks); 
      } 
      i++; 
     } 
    } 
} 
+0

문제를 재현하는 데 정말로 도움이되는 코드가 많지만 문제가있는 곳을 사람들이 알기가 정말 어렵습니다. 문제가있는 곳을 더 잘 설명하도록 질문을 다시 작성할 수는 있습니다. – Adrian

답변

0

나는 어리 석다. 색상의 불투명도였습니다.

관련 문제