[JAVA] Hur kollar man efter en klickning i en rektangel?

Permalänk
Medlem

[JAVA] Hur kollar man efter en klickning i en rektangel?

Som rubriken lyder.

Nu när jag är arbetslös tänkte jag ta upp programmeringen igen.
Jag är ganska ny och tänkte testa java. Jag har läst C# i drygt 5 år och tänkte ge mig på något enkelt, så jag ska testa att göra en java applikation.

Jag har kommit så långt att jag har en rektangel som rör sig och studsar mot kanterna men jag vill kunna klicka på den för att öka hastigheten på den.
Sen vill jag högerklicka på den för att sänka hastigheten.

Jag har kikat på lite exempel mellan intersect, contains men inte riktigt kommit fram till något.

Källkod:

Main:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.Timer; public class RectangleMover { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(WIDTH, HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final RectangleComponent component = new RectangleComponent(); frame.add(component); frame.setVisible(true); class TimerListener implements ActionListener { public void actionPerformed(ActionEvent event) { component.intersection(1, 1); } } ActionListener listener = new TimerListener(); Timer t = new Timer(Speed, listener); t.start(); } public static int Speed = 30; private static final int WIDTH = 300; private static final int HEIGHT = 400; }

Dold text

Själva rektangeln:

import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; public class RectangleComponent extends JComponent { /** * */ private static final long serialVersionUID = 1L; public RectangleComponent() { box = new Rectangle(X_POS, Y_POS, WIDTH, HEIGHT); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.draw(box); } public void intersection(int dx, int dy) { java.awt.Point p = box.getLocation(); int x = p.x; int y = p.y; if (x == getWidth() - WIDTH) { goingRight = false; } else if (x == 0) { goingRight = true; } x = goingRight? p.x + dx : p.x - dx; if (y == getHeight() - HEIGHT) { goingDown = false; } else if (y == 0) { goingDown = true; } y = goingDown? p.y + dy : p.y - dy; box.setLocation(x, y); repaint(); } private Rectangle box; private static int X_POS = 100; private static int Y_POS = 100; private static int WIDTH = 20; private static int HEIGHT = 20; private boolean goingRight = true; private boolean goingDown = true; }

Dold text
Dold text

Det är inte en skoluppgift.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Har inte gjort någon Java på ett tag men, mouseListener -> getPoint() -> intersect() -> gör saker, borde väl funka

Permalänk
Medlem

Som alltid när det gäller programmering så finns det mängder med sätt och lösningar, här har du lite du kan ta en titt på.
Obs nu har jag bara skrivit för hand, du får väl modifera koden till dina önskemål eventuellt göra en recklass som ärver etc.

Tryck på en musknapp, kolla i din mouse event.

public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { //Hämta ut positionen på musen. PointerInfo mousePoint = MouseInfo.getPointerInfo(); //Kolla om musens positioner är innanför din rektangel, isåfall ökar hastigheten på den. if(rec.inside(mosuePoint.getX(), mousePoint.getY()); { rec.mSpeed += 10; } } else if(e.getButton() == MouseEvent.BUTTON2) { //Figure it ouit } }

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av NoPaiN^:

Som alltid när det gäller programmering så finns det mängder med sätt och lösningar, här har du lite du kan ta en titt på.
Obs nu har jag bara skrivit för hand, du får väl modifera koden till dina önskemål eventuellt göra en recklass som ärver etc.

Tryck på en musknapp, kolla i din mouse event.

public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { //Hämta ut positionen på musen. PointerInfo mousePoint = MouseInfo.getPointerInfo(); //Kolla om musens positioner är innanför din rektangel, isåfall ökar hastigheten på den. if(rec.inside(mosuePoint.getX(), mousePoint.getY()); { rec.mSpeed += 10; } } else if(e.getButton() == MouseEvent.BUTTON2) { //Figure it ouit } }

Nu är det bara att jag inte riktigt är säker på hur i java jag ska implementera detta.
Testade nyss att göra det men fick inget resultat alls.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Nu är det bara att jag inte riktigt är säker på hur i java jag ska implementera detta.
Testade nyss att göra det men fick inget resultat alls.

Då din RectangleComponent är en JComponent kan du lägga till en MouseListener på den genom addMouseListener()-metoden, men det kanske är bättre att lägga denna event-handler på din JFrame eftersom den har tillgång till de variabler som styr boxens hastighet.

För att implementera en MouseListener kan du ärva MouseAdapter som är en template-klass som implementerar olika pekdonsrelaterade interfaces med tomma metoder. Det smidigaste för en sån här liten funktion är kanske att låta den nya klassen vara anonym som i mitt exempel här:

this.addMouseListener(new MouseAdapter() { @override public void mouseClicked(MouseEvent e) { // kolla om klicket skett inuti box } });

För att kolla om klicket skett inuti rutan behöver du en ny metod på din RectangleComponent.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Då din RectangleComponent är en JComponent kan du lägga till en MouseListener på den genom addMouseListener()-metoden, men det kanske är bättre att lägga denna event-handler på din JFrame eftersom den har tillgång till de variabler som styr boxens hastighet.

För att implementera en MouseListener kan du ärva MouseAdapter som är en template-klass som implementerar olika pekdonsrelaterade interfaces med tomma metoder. Det smidigaste för en sån här liten funktion är kanske att låta den nya klassen vara anonym som i mitt exempel här:

this.addMouseListener(new MouseAdapter() { @override public void mouseClicked(MouseEvent e) { // kolla om klicket skett inuti box } });

För att kolla om klicket skett inuti rutan behöver du en ny metod på din RectangleComponent.

Hmm ja jag har suttit och filurat i några timmar, jag har fått till den här koden:

frame.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { if(e.getX() > component.getX()) { if(e.getX() < (component.getX() + component.getWidth())) { if(e.getY() > component.getY()) { if(e.getY() < (component.getY() + component.getHeight())) { component.Active_Speed += component.Incrementation; frame.setTitle("INSIDE"); } else { } } else{ frame.setTitle("OUTSIDE"); } } else{ frame.setTitle("OUTSIDE"); } } else{ frame.setTitle("OUTSIDE"); } } } });

Dold text

Den funkar för att klicka, men den fungerar på ett sånt sätt att den oavsett vart jag än klickar så blir det "inside" som resultat.
frame.setTitle är bara för snabb diagnos för att se vad som händer, men jag får aldrig "outside" som resultat.

Vet nån varför?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Tog mig fritheten att skriva om din kod lite (samma kod fast omskriven).

frame.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() != MouseEvent.BUTTON1) { return; //Do nothing. } int x = e.getX(), y = e.getY(); int xCorner = component.getX(), yCorner = component.getY(); boolean insideX = (x > xCorner) && (x < (xCorner + component.getWidth())); boolean insideY = (y > yCorner) && (y < (yCorner + component.getHeight())); if(insideX && insideY) { //If inside component. component.Active_Speed += component.Incrementation; frame.setTitle("INSIDE"); } else{ frame.setTitle("OUTSIDE"); } } });

Dold text

MouseEvent har ingen metod getX() samt getY(). Använd MouseEvent.getScreenX() & MouseEvent.getScreenY(). Är du säker på att du använder absoluta skärmkoordinater?

Lycka till med ditt fortsatta javaknackande:)

Permalänk
Medlem
Skrivet av freddyfresh:

Den funkar för att klicka, men den fungerar på ett sånt sätt att den oavsett vart jag än klickar så blir det "inside" som resultat.
frame.setTitle är bara för snabb diagnos för att se vad som händer, men jag får aldrig "outside" som resultat.

Vet nån varför?

RectangleComponent tar upp hela fönsterytan så alla klick blir inuti. Skapa en metod boolean isPointInsideRectangle(int x, int y) på RectangleComponent som delegerar till box.contains(...)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

RectangleComponent tar upp hela fönsterytan så alla klick blir inuti. Skapa en metod boolean isPointInsideRectangle(int x, int y) på RectangleComponent som delegerar till box.contains(...)

Antog att det skulle funka trots det eftersom jag referenserar till vectorpunkter (x,y).
Skulle du kunna göra ett exempel på det där?

Som jag förstår det så vill du att jag använder:

boolean isPointInsideRectangle(int x, int y) { return this.contains(x,y); }

Utgår från att du menar att x och y isåfall får värde från MouseEvent@e.getX() och @e.getY()?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Antog att det skulle funka trots det eftersom jag referenserar till vectorpunkter (x,y).
Skulle du kunna göra ett exempel på det där?

Som jag förstår det så vill du att jag använder:

boolean isPointInsideRectangle(int x, int y) { return this.contains(x,y); }

Utgår från att du menar att x och y isåfall får värde från MouseEvent@e.getX() och @e.getY()?

På sätt och vis fungerar det ju, men vad du testar är om klicket är inuti fönstret vilket det naturligtvis är: kolla component.getWidth/getHeight så förstår du kanske vad jag menar.

Med metoden ovan testar du fortfarande om RectangleComponent (genom this) innehåller punkten [x:y]. Det du vill göra är box.contains

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

På sätt och vis fungerar det ju, men vad du testar är om klicket är inuti fönstret vilket det naturligtvis är: kolla component.getWidth/getHeight så förstår du kanske vad jag menar.

Med metoden ovan testar du fortfarande om RectangleComponent (genom this) innehåller punkten [x:y]. Det du vill göra är box.contains

Ja, stämmer. Oavsett så får jag samma resultat att vissa tryckningar funkar men andra funkar inte, hur ofta det funkar varierar men ibland kan jag klicka i "box" och ändå inte räknas.

static boolean Interaction(int x, int y) { return box.contains(x , y); }

Dold text

Testat att lägga till en -20 på x och y, funkade bättre då men gör jag fel?

Använder det såhär:

if (e.getButton() == MouseEvent.BUTTON1) { Title = "Score: "; if(RectangleComponent.Interaction(e.getXOnScreen(), e.getYOnScreen())) { Score++; } else { Score--; } }

Dold text
Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Ja, stämmer. Oavsett så får jag samma resultat att vissa tryckningar funkar men andra funkar inte, hur ofta det funkar varierar men ibland kan jag klicka i "box" och ändå inte räknas.

static boolean Interaction(int x, int y) { return box.contains(x , y); }

Dold text

Testat att lägga till en -20 på x och y, funkade bättre då men gör jag fel?

Använder det såhär:

if (e.getButton() == MouseEvent.BUTTON1) { Title = "Score: "; if(RectangleComponent.Interaction(e.getXOnScreen(), e.getYOnScreen())) { Score++; } else { Score--; } }

Dold text

getXOnScreen och getYOnScreen ger absoluta skärmkoordinater, du vill använda getX och getY. Dessa kommer på grund av att eventet registrerats på frame resultera i att fönsterkromet räknas med, dvs du kommer ha en offset på kanske 20 pixlar på Y och ett par pixlar på X iom att fönstret har en titelbar och lister.

Du kan (och bör) undvika detta genom att registrera eventet på component-instansen.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Eller om man vet x1,x2,y1,y2 för boxen samt klickpositionerna så är det ju en fråga om att konstruera typ
Där mx är musens x-koordinator och och my är.....

if(mx >= x1 && mx <= x2) if(my >= y1 && my <= y2) { // mx/my är inne i x1,y1 - x2,y2. }

Permalänk
Medlem
Skrivet av iXam:

Eller om man vet x1,x2,y1,y2 för boxen samt klickpositionerna så är det ju en fråga om att konstruera typ
Där mx är musens x-koordinator och och my är.....

if(mx >= x1 && mx <= x2) if(my >= y1 && my <= y2) { // mx/my är inne i x1,y1 - x2,y2. }

Man får det gratis genom Rectangle-klassen så det är rekommenderat att använda den

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Man får det gratis genom Rectangle-klassen så det är rekommenderat att använda den

Anledningen till byte av Point är för att getX/Y är lika buggig.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Anledningen till byte av Point är för att getX/Y är lika buggig.

Förstår tyvärr inte vad du menar nu.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Förstår tyvärr inte vad du menar nu.

Oavsett vilken jag använder är det samma resultat.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Oavsett vilken jag använder är det samma resultat.

Kan du visa koden som den ser ut nu?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

mouseClicked registrerar när du släpper musen och ger således väldigt konstig känsla. Kör med mousePressed istället. Skulle gissa att i ditt program hinner boxen ofta flytta sig innan musknappen faktiskt släpps :>

Visa signatur

Topkek

Permalänk
Medlem
Skrivet av Pye:

mouseClicked registrerar när du släpper musen och ger således väldigt konstig känsla. Kör med mousePressed istället. Skulle gissa att i ditt program hinner boxen ofta flytta sig innan musknappen faktiskt släpps :>

Good catch! Det är helt säkert en del av problemet.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Pye:

mouseClicked registrerar när du släpper musen och ger således väldigt konstig känsla. Kör med mousePressed istället. Skulle gissa att i ditt program hinner boxen ofta flytta sig innan musknappen faktiskt släpps :>

Gud.. nu känner man sig dum. Bara för att det är ett helt nytt språk känner man sig handikappad.

Skrivet av Teknocide:

Good catch! Det är helt säkert en del av problemet.

Han har en poäng, flödet blev mycket bättre nu.

Klassen för själva objektet:

import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; public class RectangleComponent extends JComponent { private static final long serialVersionUID = 1L; public RectangleComponent() { box = new Rectangle(X_Pos, Y_Pos, WIDTH, HEIGHT); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.draw(box); } static boolean Interaction(int x, int y) { return box.contains(x, y); } public void collision(int dx, int dy) { java.awt.Point p = box.getLocation(); int x = p.x; int y = p.y; if (x > getWidth() - WIDTH) { goingRight = false; } else if (x < 0) { goingRight = true; } if (y > getHeight() - HEIGHT) { goingDown = false; } else if (y < 0) { goingDown = true; } x = goingRight? p.x + dx : p.x - dx; y = goingDown? p.y + dy : p.y - dy; box.setLocation(x, y); repaint(); } public static void Pause() { Active_Speed = 0; } private static Rectangle box; // I N S T Ä L L N I N G A R // private static int X_Pos = 50; private static int Y_Pos = 50; private static int WIDTH = 40; private static int HEIGHT = WIDTH; public static int Min_Speed = 1; public static int Incrementation = 2; public static int Active_Speed = Min_Speed; public static int Max_Speed = 200; private boolean goingRight = true; private boolean goingDown = true; }

Dold text

Main:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.Timer; public class RectangleMover { public static void main(String[] args) { final JFrame frame = new JFrame(); frame.setSize(WIDTH, HEIGHT); final RectangleComponent component = new RectangleComponent(); frame.add(component); frame.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { Title = "Score: "; if(RectangleComponent.Interaction(e.getX(), e.getY())) { Score++; } else { Score--; } } Title += Score; if(Score < 1) { RectangleComponent.Pause(); frame.setTitle("G A M E O V E R"); } else if(Score > 0 && Score < 5) { RectangleComponent.Active_Speed += 1; Title += " Beginner"; frame.setTitle(Title); } else if(Score > 5 && Score < 10) { RectangleComponent.Active_Speed += 3; Title += " Novice"; frame.setTitle(Title); } else if(Score > 10 && Score < 15) { RectangleComponent.Active_Speed += 5; Title += " Master"; frame.setTitle(Title); } else if(Score >= Goal) { RectangleComponent.Pause(); Title += " Winner!"; frame.setTitle(Title); } } }); frame.setVisible(true); class TimerListener implements ActionListener { public void actionPerformed(ActionEvent event) { component.collision(RectangleComponent.Active_Speed, RectangleComponent.Active_Speed); } } ActionListener listener = new TimerListener(); Timer t = new Timer(10, listener); component.repaint(); t.start(); } public static int Goal = 15; public static int Score = 1; public static String Title = ""; public static final int WIDTH = 300; public static final int HEIGHT = 300; }

Dold text
Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Gud.. nu känner man sig dum. Bara för att det är ett helt nytt språk känner man sig handikappad.

Han har en poäng, flödet blev mycket bättre nu.

Klassen för själva objektet:

import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; public class RectangleComponent extends JComponent { private static final long serialVersionUID = 1L; public RectangleComponent() { box = new Rectangle(X_Pos, Y_Pos, WIDTH, HEIGHT); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.draw(box); } static boolean Interaction(int x, int y) { return box.contains(x, y); } public void collision(int dx, int dy) { java.awt.Point p = box.getLocation(); int x = p.x; int y = p.y; if (x > getWidth() - WIDTH) { goingRight = false; } else if (x < 0) { goingRight = true; } if (y > getHeight() - HEIGHT) { goingDown = false; } else if (y < 0) { goingDown = true; } x = goingRight? p.x + dx : p.x - dx; y = goingDown? p.y + dy : p.y - dy; box.setLocation(x, y); repaint(); } public static void Pause() { Active_Speed = 0; } private static Rectangle box; // I N S T Ä L L N I N G A R // private static int X_Pos = 50; private static int Y_Pos = 50; private static int WIDTH = 40; private static int HEIGHT = WIDTH; public static int Min_Speed = 1; public static int Incrementation = 2; public static int Active_Speed = Min_Speed; public static int Max_Speed = 200; private boolean goingRight = true; private boolean goingDown = true; }

Dold text

Main:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.Timer; public class RectangleMover { public static void main(String[] args) { final JFrame frame = new JFrame(); frame.setSize(WIDTH, HEIGHT); final RectangleComponent component = new RectangleComponent(); frame.add(component); frame.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { Title = "Score: "; if(RectangleComponent.Interaction(e.getX(), e.getY())) { Score++; } else { Score--; } } Title += Score; if(Score < 1) { RectangleComponent.Pause(); frame.setTitle("G A M E O V E R"); } else if(Score > 0 && Score < 5) { RectangleComponent.Active_Speed += 1; Title += " Beginner"; frame.setTitle(Title); } else if(Score > 5 && Score < 10) { RectangleComponent.Active_Speed += 3; Title += " Novice"; frame.setTitle(Title); } else if(Score > 10 && Score < 15) { RectangleComponent.Active_Speed += 5; Title += " Master"; frame.setTitle(Title); } else if(Score >= Goal) { RectangleComponent.Pause(); Title += " Winner!"; frame.setTitle(Title); } } }); frame.setVisible(true); class TimerListener implements ActionListener { public void actionPerformed(ActionEvent event) { component.collision(RectangleComponent.Active_Speed, RectangleComponent.Active_Speed); } } ActionListener listener = new TimerListener(); Timer t = new Timer(10, listener); component.repaint(); t.start(); } public static int Goal = 15; public static int Score = 1; public static String Title = ""; public static final int WIDTH = 300; public static final int HEIGHT = 300; }

Dold text

Lägg mouselistenern på component istället för frame så är problemet i princip löst.

Varför har du så många static-grejer i RectangleComponent förresten?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Lägg mouselistenern på component istället för frame så är problemet i princip löst.

Varför har du så många static-grejer i RectangleComponent förresten?

Har lite problem med att lista ut hur överföringen görs.
Jag är som sagt ny på Java och kämpar.

Static grejerna är för att jag når box-data via Mover (main). Håller på att fixa det.
Edit: fixat nu, bara överföringen kvar

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av Teknocide:

Good catch! Det är helt säkert en del av problemet.

Yey tackar Kul att man hinner bidra med något litet innan du löser alla problem

Visa signatur

Topkek

Permalänk
Medlem
Skrivet av Pye:

Yey tackar Kul att man hinner bidra med något litet innan du löser alla problem

Hyggligt.

Nya källkoden:

Objektet:

import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; public class RectangleComponent extends JComponent { private static final long serialVersionUID = 1L; public RectangleComponent() { box = new Rectangle(X_Pos, Y_Pos, WIDTH, HEIGHT); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.draw(box); } static boolean Interaction(int x, int y) { return box.contains(x, y); } public void collision(double active_Speed2, double active_Speed3) { java.awt.Point p = box.getLocation(); double x = p.x; double y = p.y; if (x > getWidth() - WIDTH) { goingRight = false; } else if (x < 0) { goingRight = true; } if (y > getHeight() - HEIGHT) { goingDown = false; } else if (y < 0) { goingDown = true; } x = goingRight? p.x + active_Speed2 : p.x - active_Speed2; y = goingDown? p.y + active_Speed3 : p.y - active_Speed3; box.setLocation((int)x, (int)y); repaint(); } public void Pause() { Active_Speed = 0; } public void Increment() { if(Active_Speed < Max_Speed) { Active_Speed += Incrementation; } } private static Rectangle box; private int X_Pos = 50; private int Y_Pos = 50; private int WIDTH = 40; private int HEIGHT = WIDTH; public int Min_Speed = 1; public double Incrementation = 0.3; public double Active_Speed = Min_Speed; public int Max_Speed = 20; private boolean goingRight = true; private boolean goingDown = true; }

Dold text

Main:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.Timer; public class RectangleMover { public static void main(String[] args) { final JFrame frame = new JFrame(); frame.setSize(WIDTH, HEIGHT); final RectangleComponent component = new RectangleComponent(); frame.add(component); frame.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { String Title = ""; if (e.getButton() == MouseEvent.BUTTON1) { Title = "Score: "; if(RectangleComponent.Interaction(e.getX(), e.getY())) { Score++; } else { Score--; } } if(Score > 0 && Score < 5) { component.Increment(); Title = " Beginner"; } else if(Score > 5 && Score < 10) { component.Increment(); Title = " Novice"; } else if(Score > 10 && Score < 15) { component.Increment(); Title = " Master"; } else if(Score >= Goal) { component.Pause(); Title = " Winner!"; } frame.setTitle("Score: " + Score + " Level: " + Title); if (Score < 1) { component.Pause(); frame.setTitle("G A M E O V E R"); } } }); frame.setVisible(true); class TimerListener implements ActionListener { public void actionPerformed(ActionEvent event) { component.collision(component.Active_Speed, component.Active_Speed); } } ActionListener listener = new TimerListener(); Timer t = new Timer(13, listener); component.repaint(); t.start(); } public static int Goal = 15; public static int Score = 1; public static final int WIDTH = 300; public static final int HEIGHT = 300; }

Dold text
Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Förstår inte varför du kör

RectangleComponent.Interaction(e.getX(), e.getY())

istället för

component.interaction(e.getX(), e.getY())

Hur fungerar det för övrigt?

(box i RectangleComponent behöver inte heller vara static)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Förstår inte varför du kör

RectangleComponent.Interaction(e.getX(), e.getY())

istället för

component.interaction(e.getX(), e.getY())

Hur fungerar det för övrigt?

(box i RectangleComponent behöver inte heller vara static)

Oopsie, en liten miss, skulle bytt ut den till component, som du ser har det gjorts på ovanstående.
Men ja, det fungerar nog felfritt.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av Teknocide:

Man får det gratis genom Rectangle-klassen så det är rekommenderat att använda den

Naturligtvis. Men han lär sig inte hur och varför den fungerar.