Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 00:45 Der er 16 kommentarer og
1 løsning

Java: Dele op i tabeller.

I HTML er der noget som hedder tabeller.

Hvordan laver jeg via. java et kordinat system som gør hvis man klikker inde i den "tabel" så kommer man derhen fremfor man kan klikke overalt på hele skærmen?

Altså det nuværdene system jeg har gør man kan klikke rundt som en gal i hele vinduet - selv udenfor.

Hvordan laver jeg fx.
en while sætning som laver 10 retangler foroven og 5 på den anden også skal den gentage "while" functionen 5 gange.

Fx.
1.2.3.4.5.6.7.8.9.10
1.2.3.4.5
1.2.3.4.5.6.7.8.9.10
1.2.3.4.5
1.2.3.4.5.6.7.8.9.10

Når man så klikker indefor et af disse "rektangler" så bliver "figur.gif" sat derover.

Mit såkaldte system ser således ud:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class bilSpil extends Applet implements MouseListener
{
Image figur;
Image offScreen;
Graphics bufferGfx;
Image baggrund;
Point mouseDown = null;
String brugernavn;
 

    public void init()
    {
   
        brugernavn = getParameter("brugernavn");
     
        addMouseListener(this);
        figur = getImage(getCodeBase(),"bil.gif"); // Figur
        baggrund = getImage(getCodeBase(),"racerBanen.gif");  // Baggrunden
        offScreen = createImage (this.getWidth(), this.getHeight());
        bufferGfx = offScreen.getGraphics();
    }

      public void paint(Graphics g)
      {
bufferGfx.setColor (Color.white);
int textWidth = bufferGfx.getFontMetrics().stringWidth(brugernavn);
int smileyX = mouseDown.x;
int x = smileyX - (textWidth / 2);
bufferGfx.setColor (Color.white);
bufferGfx.drawString(brugernavn, x, mouseDown.y+70);

          bufferGfx.clearRect(0,0,this.getWidth(),this.getHeight());

        bufferGfx.drawImage(baggrund,0,0,this);
        if (mouseDown != null)
   
            bufferGfx.drawImage(figur, mouseDown.x-40, mouseDown.y-15, this);     
  bufferGfx.drawString(brugernavn, x, mouseDown.y+70);
        g.drawImage(offScreen,0,0,this);
      }   
   
    public void mousePressed(MouseEvent e)
{
    mouseDown = new Point((int) e.getX(), (int) e.getY());
    repaint();
}
  public void mouseCliched(MouseEvent e)
{
    mouseDown = new Point((int) e.getX(), (int) e.getY());
    repaint();
}
     
      public void update (Graphics g)
      {
          paint(g);
      }
 
      public void mouseClicked(MouseEvent e)    {}
      public void mouseReleased(MouseEvent e) {}
      public void mouseEntered(MouseEvent e)    {}
      public void mouseExited(MouseEvent e)    {}
}
Avatar billede mikkelbm Nybegynder
03. september 2005 - 00:59 #1
Du bliver nødt til selv at detecte om du rammer disse firkanter.

Jeg ville lave et array af Rectangles, løbe dem igennem hver gang man trykker med musen og så tjekke om de kolliderer med hinanden.
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 01:02 #2
Det jo svært at se om man trykker på y-akse: 9 fremfor 11? Og endnu sværer hvis x skal være 9 og y er 10 og man så trykker x = 10, y = 4
Avatar billede mikkelbm Nybegynder
03. september 2005 - 01:03 #3
Det er rigtigt. Men det er sådan det skal gøres.
Jeg prøver lige at lave et eksempel.
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 01:05 #4
Okay
Avatar billede mikkelbm Nybegynder
03. september 2005 - 02:06 #5
Jeg kom helt fra det igen - beklager. Men jeg tror jeg har fået bikset noget brugbart sammen:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class bilSpil extends Applet implements MouseListener
{
    Image figur;
    Image offScreen;
    Graphics bufferGfx;
    Image baggrund;
    Point mouseDown = null;
    String brugernavn;
    Rectangle[] rectangles;
 
    public void init()
    { 
        this.setSize(300, 300);
        rectangles = new Rectangle[10];
        for (int i = 0; i<rectangles.length; i++)
        {
            rectangles[i] = new Rectangle (10, 10);
            rectangles[i].x = (int)(Math.random() * this.getWidth());
            rectangles[i].y = (int)(Math.random() * this.getHeight());
        }
           
        brugernavn = getParameter("brugernavn");
     
        addMouseListener(this);
        figur = getImage(getCodeBase(),"bil.gif"); // Figur
        baggrund = getImage(getCodeBase(),"test.png");  // Baggrunden
       
        offScreen = createImage (this.getWidth(), this.getHeight());
        bufferGfx = offScreen.getGraphics();
    }
   
    public void start()
    {
        this.validate();
    }

    public void paint(Graphics g)
    {
        bufferGfx.clearRect(0,0,this.getWidth(),this.getHeight());
        bufferGfx.drawImage(baggrund,0,0,this);
        paintRectangles (bufferGfx);
       
        if (mouseDown != null)
        {
            int textWidth = bufferGfx.getFontMetrics().stringWidth(brugernavn);
            int smileyX = mouseDown.x;
            int x = smileyX - (textWidth / 2);
            bufferGfx.setColor (Color.black);
            bufferGfx.drawString(brugernavn, x, mouseDown.y+70);
            bufferGfx.drawImage(figur, mouseDown.x-40, mouseDown.y-15, this);     
        }
         
        g.drawImage(offScreen,0,0,this);
    }
   
    private void paintRectangles(Graphics g)
    {
        g.setColor(Color.red);
        for (int i = 0; i<rectangles.length; i++)
            g.drawRect(rectangles[i].x, rectangles[i].y, rectangles[i].width, rectangles[i].height);
    }
   
    private boolean detectCollision (int x, int y)
    {
        for (int i = 0; i<rectangles.length; i++)
            if (x >= rectangles[i].x && x <= (rectangles[i].x + rectangles[i].width) && y >= rectangles[i].y && y <= (rectangles[i].y + rectangles[i].height))
                return true;
               
        return false;
    }   
   
    public void mousePressed(MouseEvent e)
    {
        if (detectCollision(e.getX(), e.getY()))
            mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
    }
      public void mouseCliched(MouseEvent e)
    {
        if (detectCollision (e.getX(), e.getY()))
            mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
    }
     
    public void update (Graphics g)
    {
        paint (g);
    }
 
    public void mouseClicked(MouseEvent e)    {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e)    {}
    public void mouseExited(MouseEvent e)    {}
}


Du nævnte i et tidligere spørgsmål, at du skulle trykke på applet'en før den blev vist. Grunden til det var der hvor vi beregnede tekstlængden. Der skulle lige et tjek ind.
Avatar billede mikkelbm Nybegynder
03. september 2005 - 02:10 #6
Og du skal lige ændre min test.png til din racerBanen.gif - men det skulle også være det eneste...
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 02:13 #7
Okay.
Ja, det ser ret \"fedt\" ud!

Men hvis man så har trykket på en firkant så kan man så klikke på den igen så ryger med få pixels op/til siden.

fandt noget som arne_v havde lavet.
Et system som jeg perfekt står og mangler.

for (int i = 0; i < 5; i++){
  for (int j = 0; j < 4+((i%2)==0?1:0); j++){
  g.drawString("X",20+20*j+((i%2)==1?10:0),20+20*i);
  }

Men kan man lave dem til retangler, hvor man kan kun én gang klikke inde i dem?
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 02:14 #8
Felterne skal være noget "AKA"

X...X...X...X...X
..X...X...X...X
X...X...X...X...X
..X...X...X...X
X...X...X...X...X
..X...X...X...X
Avatar billede mikkelbm Nybegynder
03. september 2005 - 10:17 #9
Så er jeg her igen. Prøv at se om ikke du kan bruge det her:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.ArrayList;

public class bilSpil extends Applet implements MouseListener
{
    Image figur;
    Image offScreen;
    Graphics bufferGfx;
    Image baggrund;
    Point mouseDown = null;
    String brugernavn;
    ArrayList rectangles;
    private static final int numberOfRows     = 5;
    private static final int numberInSmall     = 4;
    private static final int recSize         = 20;
    private static final int spaceBetween     = recSize * 2;
 
    public void init()
    { 
        this.setSize(300, 300);
        rectangles = new ArrayList();
       
        for (int i = 0; i < numberOfRows; i++)
        {
              for (int j = 0; j < numberInSmall + ((i % 2) == 0 ? 1 : 0); j++)
              {
                  int recX = spaceBetween + spaceBetween * j + ((i % 2) == 1 ? (spaceBetween / 2) : 0);
                  int recY = spaceBetween + spaceBetween * i;
                 
                  MyRectangle rec = new MyRectangle (recSize, recSize);
                  rec.x = recX;
                  rec.y = recY;
                  rectangles.add(rec);
              }
          }
           
        brugernavn = getParameter("brugernavn");
     
        addMouseListener(this);
        figur = getImage(getCodeBase(),"bil.gif"); // Figur
        baggrund = getImage(getCodeBase(),"test.png");  // Baggrunden
       
        offScreen = createImage (this.getWidth(), this.getHeight());
        bufferGfx = offScreen.getGraphics();
    }
   
    public void start()
    {
        this.validate();
    }

    public void paint(Graphics g)
    {
        bufferGfx.clearRect(0,0,this.getWidth(),this.getHeight());
        bufferGfx.drawImage(baggrund,0,0,this);
        paintRectangles (bufferGfx);
       
        if (mouseDown != null)
        {
            int textWidth = bufferGfx.getFontMetrics().stringWidth(brugernavn);
            int smileyX = mouseDown.x;
            int x = smileyX - (textWidth / 2);
            bufferGfx.setColor (Color.black);
            bufferGfx.drawString(brugernavn, x, mouseDown.y+70);
            bufferGfx.drawImage(figur, mouseDown.x-40, mouseDown.y-15, this);     
        }
         
        g.drawImage(offScreen,0,0,this);
    }
   
    private void paintRectangles(Graphics g)
    {       
        for (int i = 0; i<rectangles.size(); i++)
        {
            MyRectangle rec = (MyRectangle)rectangles.get(i);
            Color col = rec.getIsClicked() ? Color.red : Color.green;
            g.setColor(col);
            g.drawRect(rec.x, rec.y, rec.width, rec.height);
        }
    }
   
    private boolean detectCollision (int x, int y)
    {
        for (int i = 0; i<rectangles.size(); i++)
        {
            MyRectangle rec = (MyRectangle)rectangles.get(i);
            if (x >= rec.x && x <= (rec.x + rec.width) && y >= rec.y && y <= (rec.y + rec.height))
            {
                if (!rec.getIsClicked()) // Hvis man allerede har trykket på den må man ikke igen
                {   
                    rec.setIsClicked(true); // Hvis man rammer, må man ikke igen
                    return true;
                }
            }
        }
               
        return false;
    }   
   
    public void mousePressed(MouseEvent e)
    {
        if (detectCollision(e.getX(), e.getY()))
            mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
    }
      public void mouseCliched(MouseEvent e)
    {
        if (detectCollision (e.getX(), e.getY()))
            mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
    }
     
    public void update (Graphics g)
    {
        paint (g);
    }
 
    public void mouseClicked(MouseEvent e)    {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e)    {}
    public void mouseExited(MouseEvent e)    {}
   
    private class MyRectangle extends Rectangle
    {
        private boolean isClicked = false;
       
        public MyRectangle (int width, int height)
        {
            super (width, height);
        }
       
        public void setIsClicked (boolean isClicked)
        {
            this.isClicked = isClicked;
        }
       
        public boolean getIsClicked ()
        {
            return isClicked;
        }
    }
}

Har du nogle spørgsmål til det, så bare spørg...
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 13:30 #10
Hej igen.
Har ændret lidt.

Men man skal jo også kunne flytte sig tilbage.
Den skal kun være rød hvis man selv er på det og hvis man så flytter sig bliver den grøn igen og det nye felt bliver rødt.
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 13:34 #11
Ja, ved godt jeg lyder lidt overdrevet.
Men hvis man nu klikker på en firkant helt ude i venstre side af den så ryger man derhen.

Kan man ikke lave noget sjovt sådan selvom man klikker et sted på firkanten så ryger man i center af firkanten?
Avatar billede mikkelbm Nybegynder
03. september 2005 - 14:15 #12
Hvad med du selv begyndte at lege med de forskellige muligheder ;) ?
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 14:24 #13
Vil jeg også gøre, men lidt svært når du har låst felterne af, hehe ;)
Avatar billede mikkelbm Nybegynder
03. september 2005 - 14:33 #14
"Men man skal jo også kunne flytte sig tilbage."

Harmonerer ikke rigtigt med:

"Men kan man lave dem til retangler, hvor man kan kun én gang klikke inde i dem?"


Og jeg forstår faktisk ikke helt, hvad det er du gerne vil?
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 14:37 #15
ja, mente at hvis man stod på det felt man klikkede på så kan man ikke trykke på det samme igen.

Hvis man så klikker på et andet felt bliver det forrige grønt igen.
Avatar billede mikkelbm Nybegynder
03. september 2005 - 14:43 #16
Ahh okay...

Så prøv at skifte din detectCollision ud med:

private boolean detectCollision (int x, int y)
    {
        boolean collision = false;
        for (int i = 0; i<rectangles.size(); i++)
        {
            MyRectangle rec = (MyRectangle)rectangles.get(i);
            if (x >= rec.x && x <= (rec.x + rec.width) && y >= rec.y && y <= (rec.y + rec.height))
            {
                if (!rec.getIsClicked()) // Hvis man allerede har trykket på den må man ikke igen
                {   
                    rec.setIsClicked(true); // Hvis man rammer, må man ikke igen
                    collision = true;
                }
            }
            else
                rec.setIsClicked(false);
        }
               
        return collision;
    }
Avatar billede 1nz4n3 Nybegynder
03. september 2005 - 15:28 #17
Perfekt!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

SOS International

Principal Solution Architect

Forsvarsministeriets Regnskabsstyrelse

Datadesigner

SOS International

License & Vendor Manager