2015-10-15 53 views
0

我想製作代碼,以便當我點擊容器中的某個位置時,我創建一個新的圖像,其座標爲mouseX和Y,我點擊了它們。如何使用mouseListener在Slick2d中添加一個新的圖像

我試圖做到這一點,但我不知道如何繪製新圖像,沒有舊圖像獲得與新圖像相同的座標,並且我不確定是否創建了不同的座標圖像,或者如果它只是相同的圖像,我會改變每次點擊時的座標。

我正在考慮創建一個圖像數組列表,然後每當我點擊某處時,它會向列表中添加一個新圖像,然後渲染只是呈現整個列表,但在這裏我不知道如何告訴渲染點擊每個圖像的位置(座標)。

這是我到目前爲止,我真的很感激,如果有人可以幫助我。讓我知道,如果有需要我澄清:)

package example; 

import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.lwjgl.input.Mouse; 
import org.newdawn.slick.AppGameContainer; 
import org.newdawn.slick.BasicGame; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 

public class SimpleSlickGame extends BasicGame 
{ 

    public String mouseCoords; 
    public String testClick ="Nothing clicked"; 
    public int mouseX; 
    public int mouseY; 

    public SimpleSlickGame(String gamename) 
    { 
     super(gamename); 
    } 

    @Override 
    public void init(GameContainer gc) throws SlickException { 
     mouseCoords = ""; 
    } 

    @Override 
    public void update(GameContainer gc, int i) throws SlickException { 
     int mouseX = Mouse.getX(); 
     int mouseY = Mouse.getY(); 

     mouseCoords = "Mouse X: "+ mouseX + " Mouse Y: "+ mouseY;    

    } 

    @Override 
    public void render(GameContainer gc, Graphics g) throws SlickException 
    { 
     g.drawString(mouseCoords, 250, 200); 
     g.drawRect(100, 100, 100, 100); 
     g.drawString(testClick, 200, 400); 

     g.drawImage(new Image("images/house.png"), mouseX, mouseY); 

    } 

    public void mousePressed(int button, int x, int y){ 
     mouseX = x; 
     mouseY = y; 

     if (button == 0){ 
      if((x> 100 && x<200) && (y > 100 && y < 200)){ 
       testClick = "inside box"; 
      } 
      else{ 
       testClick = "outside box"; 

      } 
     } 
    } 


    public static void main(String[] args) 
    { 
     try 
     { 
      AppGameContainer appgc; 
      appgc = new AppGameContainer(new SimpleSlickGame("Simple Slick Game")); 
      appgc.setDisplayMode(600, 600, false); 
      appgc.start(); 
     } 
     catch (SlickException ex) 
     { 
      Logger.getLogger(SimpleSlickGame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

回答

0

好了,所以我做的文檔和谷歌搜索一些閱讀,並找到了解決的東西:P,雖然我不知道這是否是最優化的方式這樣做的(真的像一些批評!!)

這裏就是我所做的:

主類:

package example; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.lwjgl.input.Mouse; 
import org.newdawn.slick.AppGameContainer; 
import org.newdawn.slick.BasicGame; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 

public class SimpleSlickGame extends BasicGame 
{ 

    public String mouseCoords; 
    public String testClick ="Nothing clicked"; 
    public int mouseX; 
    public int mouseY; 
    private House[] house = new House[10]; 
    public List<House> houses = new ArrayList<House>(); 
    public House houseTest, houseTest2, houseTest3; 

    public SimpleSlickGame(String gamename) 
    { 
     super(gamename); 
    } 

    @Override 
    public void init(GameContainer gc) throws SlickException { 
     mouseCoords = ""; 

    } 

    @Override 
    public void update(GameContainer gc, int i) throws SlickException { 
     int mouseX = Mouse.getX(); 
     int mouseY = Mouse.getY(); 

     mouseCoords = "Mouse X: "+ mouseX + " Mouse Y: "+ mouseY;    

    } 

    @Override 
    public void render(GameContainer gc, Graphics g) throws SlickException 
    { 
     g.drawString(mouseCoords, 250, 200); 
     g.drawRect(100, 100, 100, 100); 
     g.drawString(testClick, 200, 400); 


     for(int i = 0; i<houses.size();i++){ 
      if(houses.get(i) != null){ 
      houses.get(i).render(gc, g); 
      } 
     } 


    } 

    public void mousePressed(int button, int x, int y){ 
     mouseX = x; 
     mouseY = y; 

     if (button == 0){ 
      if((x> 100 && x<200) && (y > 100 && y < 200)){ 
       testClick = "inside box"; 
       houses.add(new House(mouseX,mouseY)); 

      } 
      else{ 
       testClick = "outside box"; 

      } 
     } 
    } 


    public static void main(String[] args) 
    { 
     try 
     { 
      AppGameContainer appgc; 
      appgc = new AppGameContainer(new SimpleSlickGame("Simple Slick Game")); 
      appgc.setDisplayMode(600, 600, false); 
      appgc.start(); 
     } 
     catch (SlickException ex) 
     { 
      Logger.getLogger(SimpleSlickGame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

內訓課:

package example; 

import org.newdawn.slick.Color; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.SlickException; 

public class House { 

    int x; 
    int y; 
    int width = 20; 
    int height = 20; 


    House(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

    public void render(GameContainer gc, Graphics g) throws SlickException 
    { 
     g.setColor(Color.white); 
     g.drawRect(x, y, width, height); 
    } 
} 
+0

您的解決方案似乎相當不錯。只需要注意幾件事情:1)在每個循環中創建一個「新圖像」的問題,你應該在類中聲明你的圖像,然後在渲染中繪製它(通常:在渲染或更新中從不使用'new' )。 2)ATM只是繪製白色形狀,但是當你繪製圖像時也會關心圖像的創建,只需聲明一次,然後再使用它幾次。 – RPresle