Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Ahojky mam problém s posunem rámečku po ploše sudoku. Mam x a y souřadnici toho rámečku, kterou měním pomocí zmáčknutí šipky, jenomže x a y souřadnice se mění v pořádku, ale rámeček se neposunuje. Přiložím kód:

package solver.graphics;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JPanel;

public class Screen extends JPanel implements Runnable{
        private static final long serialVersionUID = 1L;

        private Thread thread;
        private boolean running = false;

        private static final int WIDTH = 371, HEIGHT = 500;
        private int xCoor = 163, yCoor = 163;
        private int move;

        private Border b = new Border(xCoor, yCoor, 44);
        private ArrayList<Border> borders = new ArrayList<>();

        private int ticks;

        private Key key;

        public Screen(){
                setFocusable(true);
                key = new Key();
                addKeyListener(key);
                setPreferredSize(new Dimension(WIDTH, HEIGHT));

                borders.add(b);

                start();
        }

        private void tick(){
                ticks++;

                if(ticks > 800000){
                        running = false;
                        ticks = 0;
                                if(move == 2){
                                        yCoor += 40;
                                        move = 0;
                                }
                                if(move == 8){
                                        yCoor -= 40;
                                        move = 0;
                                }
                                if(move == 6){
                                        xCoor += 40;
                                        move = 0;
                                }
                                if(move == 4){
                                        xCoor -= 40;
                                        move = 0;
                                }
                        System.out.println(xCoor +" "+ yCoor);
                }
                running = true;
        }

        public void paint(Graphics g){
        g.clearRect(0, 0, WIDTH, HEIGHT);

                // svislé čáry ŠEDÉ
        g.setColor(Color.GRAY);
        for(int i = 45; i <= 325; i += 40){
                if(i != 125 && i != 245){
                        g.drawLine(i, 5, i, 365);
                }
        }

                // vodorovné čáry ŠEDÉ
        for(int i = 45; i <= 325; i += 40){
                if(i != 125 && i != 245){
                        g.drawLine(5, i, 365, i);
                }
        }

                // svislé čáry ČERNÉ
        g.setColor(Color.BLACK);
        g.fillRect(3, 5, 4, 361);
        g.fillRect(124, 5, 3, 361);
        g.fillRect(244, 5, 3, 361);
        g.fillRect(364, 5, 4, 361);

                // vodorovné čáry ČERNÉ
        g.fillRect(5, 3, 361, 4);
        g.fillRect(5, 124, 361, 3);
        g.fillRect(5, 244, 361, 3);
        g.fillRect(5, 364, 361, 4);


        g.drawRect(4, 4, 362, 362);


        for(Border border : borders){
                border.draw(g);
                }
        }


        public void start(){
                running = true;
                thread = new Thread(this, "Game Loop");
                thread.start();
        }

        public void run(){
                while(running){
                        tick();
                        repaint();
                }
        }

        private class Key implements KeyListener {
                public void keyPressed(KeyEvent e) {
                        int key = e.getKeyCode();
                        if(key == KeyEvent.VK_RIGHT){
                                System.out.println("RIGHT");
                                move = 6;
                        }
                        if(key == KeyEvent.VK_LEFT){
                                System.out.println("LEFT");
                                move = 4;
                        }
                        if(key == KeyEvent.VK_UP){
                                System.out.println("UP");
                                move = 8;
                        }
                        if(key == KeyEvent.VK_DOWN){
                                System.out.println("DOWN");
                                move = 2;
                        }

                }
                public void keyReleased(KeyEvent arg0) {
                        // TODO Auto-generated method stub

                }
                public void keyTyped(KeyEvent arg0) {
                        // TODO Auto-generated method stub
                }
        }
}

A tady máte příklad toho jak by se měl rámeček posouvat:

Editováno 26.9.2014 17:49
Odpovědět 26.9.2014 17:47
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Jestli se mění souřadnice tak jen znovu nevykresluješ :), takže tam musíš zavolat nějakej repaint nebo něco podobného.

 
Nahoru Odpovědět 26.9.2014 17:57
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

repaint() je vyvolanej v run() a zabalenej ve whilu

Nahoru Odpovědět 26.9.2014 18:40
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

a nějak mi tam hapruje, že vyvolávám vykreslování toho rámečku v paint, tak se ho posunul:

package solver.graphics;

import solver.graphics.Border;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JPanel;

public class Screen extends JPanel implements Runnable{
        private static final long serialVersionUID = 1L;

        private Thread thread;
        private boolean running = false;

        private static final int WIDTH = 371, HEIGHT = 500;
        private int xCoor = 3, yCoor = 3;
        private int move;

        private Border b;
        private ArrayList<Border> borders;

        private int ticks;

        private Key key;

        public Screen(){
                setFocusable(true);
                key = new Key();
                addKeyListener(key);
                setPreferredSize(new Dimension(WIDTH, HEIGHT));

                borders = new ArrayList<Border>();

                start();
        }

        private void tick(){
                ticks++;

                if(ticks > 800000){
                        running = false;
                        ticks = 0;

                        if(move == 2){yCoor += 40;move = 0;}
                        if(move == 8){yCoor -= 40;move = 0;}
                        if(move == 6){xCoor += 40;move = 0;}
                        if(move == 4){xCoor -= 40;move = 0;}

                                //když je konec mřížky, tak po zmáčknutí vpravo nebo dolů, přeskočí na začátek
                        if(xCoor == 363)xCoor = 3;
                        if(yCoor == 363)yCoor = 3;

                                //když je začátek mřížky, tak po zmáčknutí vlevo nebo nahoru, přeskočí na konec
                        if(xCoor == -37)xCoor = 323;
                        if(yCoor == -37)yCoor = 323;

                        System.out.println(xCoor +" "+ yCoor);

                        b = new Border(xCoor, yCoor, 44);
                        borders.add(b);
                }
                running = true;
        }


        public void paint(Graphics g){
        g.clearRect(0, 0, WIDTH, HEIGHT);

                // svislé čáry ŠEDÉ
        g.setColor(Color.GRAY);
        for(int i = 45; i <= 325; i += 40){
                if(i != 125 && i != 245){
                        g.drawLine(i, 5, i, 365);
                }
        }

                // vodorovné čáry ŠEDÉ
        for(int i = 45; i <= 325; i += 40){
                if(i != 125 && i != 245){
                        g.drawLine(5, i, 365, i);
                }
        }

                // svislé čáry ČERNÉ
        g.setColor(Color.BLACK);
        g.fillRect(3, 5, 4, 361);
        g.fillRect(124, 5, 3, 361);
        g.fillRect(244, 5, 3, 361);
        g.fillRect(364, 5, 4, 361);

                // vodorovné čáry ČERNÉ
        g.fillRect(5, 3, 361, 4);
        g.fillRect(5, 124, 361, 3);
        g.fillRect(5, 244, 361, 3);
        g.fillRect(5, 364, 361, 4);


        g.drawRect(4, 4, 362, 362);
        }

        public void start(){
                running = true;
                thread = new Thread(this, "Game Loop");
                thread.start();
        }

        public void stop(){
                running = false;
                try {
                        thread.join();
                }catch(InterruptedException e){
                        e.printStackTrace();
                }
        }

        public void run(){
                while(running){
                        tick();
                        repaint();
                }
        }

        private class Key implements KeyListener {
                public void keyPressed(KeyEvent e) {
                        int key = e.getKeyCode();
                        if(key == KeyEvent.VK_RIGHT){
                                System.out.println("RIGHT");
                                move = 6;
                        }
                        if(key == KeyEvent.VK_LEFT){
                                System.out.println("LEFT");
                                move = 4;
                        }
                        if(key == KeyEvent.VK_UP){
                                System.out.println("UP");
                                move = 8;
                        }
                        if(key == KeyEvent.VK_DOWN){
                                System.out.println("DOWN");
                                move = 2;
                        }

                }
                public void keyReleased(KeyEvent arg0) {
                        // TODO Auto-generated method stub

                }
                public void keyTyped(KeyEvent arg0) {
                        // TODO Auto-generated method stub
                }
        }
}

ale rámeček se už ani nezobrazí :(
Kde mam chybu? Chybí mi tam ještě nějakej kus kódu? Poradí někdo?

Editováno 26.9.2014 18:52
Nahoru Odpovědět 26.9.2014 18:50
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Můžeš ukázat tu třídu Border? Nebo mi upni celej projekt a kouknu na to.

 
Nahoru Odpovědět 26.9.2014 19:40
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Border:

package solver.graphics;

import java.awt.Color;
import java.awt.Graphics;

public class Border {

        private int xCoor, yCoor, width, height;

        Color color1 = new Color(0x4a4aff);
        Color color2 = new Color(0x6d6dff);

        public Border(int xCoor, int yCoor, int borderSize){
                this.xCoor = xCoor;
                this.yCoor = yCoor;
                width = borderSize;
                height = borderSize;

        }

        public void draw(Graphics g){
                g.setColor(color1);
                g.drawRect(xCoor, yCoor, width, height);
                g.setColor(Color.BLUE);
                g.drawRect(xCoor + 1, yCoor + 1, width - 2, height - 2);
                g.setColor(color2);
                g.drawLine(xCoor - 1, yCoor + 1, xCoor - 1, yCoor + 43); // levá
                g.drawLine(xCoor + 45, yCoor + 1, xCoor + 45, yCoor +43); // pravá
                g.drawLine(xCoor + 1, yCoor - 1, xCoor + 43, yCoor - 1); // horní
                g.drawLine(xCoor + 1, yCoor + 45, xCoor + 43, yCoor + 45); // dolní
        }
}
Nahoru Odpovědět 26.9.2014 21:08
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Tak si tam přidej ještě nějaky boolean isSelected a podle toho to vykresluj daný border (třeba).

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +2 26.9.2014 22:01
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

a jak to mam vykreslit?

Nahoru Odpovědět 27.9.2014 11:11
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Tak buď máš normální border a nebo ten označený + obarevný + zesílený. Tak budeš vykreslovat v té metodě draw(...) bud normalni když není selectlý a nebo zesílený když je selectlý.

Editováno 27.9.2014 13:09
 
Nahoru Odpovědět 27.9.2014 13:07
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

nemá to bejt klikací, ale vim jak to myslíš

Nahoru Odpovědět 27.9.2014 16:58
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Já právě nevím jak to máš celé navržené. Máš tam jeden border "b" a pak kolekci borderů... K čemu? Však je vždycky vybarvený jen jeden ne? :D

 
Nahoru Odpovědět 27.9.2014 17:34
Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

Máš to celé nějak divně rozvržené, téměř se v tom nelze vyznat. Zkus si vytvořit [9][9] 3d booleanovou proměnnou, do které budeš zapisovat, které to políčko má být zvýrazněné. Neprogramuju v javě, ale v c#, který mají podobné syntaxe.
Takhle by mohlo vypadat vykreslování, key detekování a proměnné:
Proměnné:

bool[,] selected = new bool[9, 9];
int actualX = 0, actualY = 0;

Vykreslování:

for(int i = 0; i < 9; i++)
            {
                for(int x = 0; x < 9; x++)
                {
                    Pen p = new Pen(
                        (selected[x, i]) ? Color.Blue : Color.Black,
                        (selected[x, i]) ? 3 : 1);
                    e.Graphics.DrawRectangle(p, i*40, x*40, 40, 40);
                }
            }

A key detekování:

if (e.KeyData == Keys.Down || e.KeyData == Keys.Up || e.KeyData == Keys.Right || e.KeyData == Keys.Left)
            {
                selected[actualX, actualY] = false;
                switch(e.KeyData)
                {
                    case Keys.Down:
                    {
                        if (actualX == 8)
                            actualX = 0;
                        else
                        actualX++;
                        break;
                    }
                    case Keys.Up:
                    {
                        if (actualX == 0)
                            actualX = 8;
                        else
                            actualX--;
                        break;
                    }
                    case Keys.Left:
                    {
                        if (actualY == 0)
                            actualY = 8;
                        else
                            actualY--;
                        break;
                    }
                    case Keys.Right:
                    {
                        if (actualY == 8)
                            actualY = 0;
                        else
                            actualY++;
                        break;
                    }
                }
                selected[actualX, actualY] = true;
                pictureBox1.Invalidate();
            }

Snad se v tom nějak vyznáš, zkoušel jsem to a funguje to :).

 
Nahoru Odpovědět 27.9.2014 19:22
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Tomhaus
Lukáš Křehula:

Omlouvám se, zapomněl jsem na odpovědítko :)

 
Nahoru Odpovědět 28.9.2014 10:54
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

jo máš pravdu, dělam to podle jednej předlohy jinej hry, ale tady mi stačí jen jeden rámeček :D

Nahoru Odpovědět 29.9.2014 16:38
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Lukáš Křehula
Tomhaus:

Omezení toho sudoku už mam, jen mě zajímá, jak to mam vykreslit a kde? Jestli v nějakej svojí metodě nebo ve hlavním paintu(Graphics g) a hlavně ten příkaz pro vykreslení. Když nebudu používat ten tvůj návrh.

Editováno 29.9.2014 16:51
Nahoru Odpovědět 29.9.2014 16:46
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Spíš by mě zajímalo, k čemu to mam přidat? Vim jak to definovat v té metodě, ale pořád nevim k čemu to mam přidat. Protože v té jiné hře se to přidává k poli těch objektů(stejnak ani nevim, jak se to tam vykresluje).

border = new Border(xCoor, yCoor, 44);
                        add(border);

takhle mi to hází chybu. že sem to k něčemu (pravděpodobně) nepřidal.

Nahoru Odpovědět 29.9.2014 22:27
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Už sem na to přišel. Stačilo do paintu přidat

border.draw(g);

a bylo hotovo.
Já sem takovej kretén, že mě to nenapadlo hned. :D

Editováno 29.9.2014 22:38
Nahoru Odpovědět 29.9.2014 22:37
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Koukni na mou první reakci ;)

 
Nahoru Odpovědět 29.9.2014 22:43
Avatar
Tomhaus
Člen
Avatar
Tomhaus:
for(int i = 1; i <= 9; i++){
        if(key == KeyEvent.VK_i){

        }
}

vim že to mam špatně, ale poraďte mi, jak můžu za to VK_ dát tu proměnnou i. Nechce se mi to psát 9x pro všechny čísla. Asi tam mam použít nějaký závorky (zkoušel jsem (),{},[],<> ), nebo to mam nechat nejdřív vypsat do pole a potom použít to pole?

Editováno 30.9.2014 16:45
Nahoru Odpovědět 30.9.2014 16:45
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Google it: "parse enum java"..

 
Nahoru Odpovědět 30.9.2014 18:22
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

Já to asi stejnak budu muset udělat přes pole, protože potřebuju, aby mi to vyhodilo stejný číslo do proměnné.

Nahoru Odpovědět 30.9.2014 19:08
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 30.9.2014 19:12
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

do nové proměnné type, kterou si teprve vytvořim :D nějakej návrh jak bych to mohl udělat?

Editováno 30.9.2014 19:19
Nahoru Odpovědět 30.9.2014 19:18
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Vůbec nevím co chceš udělat.

 
Nahoru Odpovědět  +1 30.9.2014 19:38
Avatar
Jiří Gracík
Redaktor
Avatar
Nahoru Odpovědět 30.9.2014 19:40
Creating websites is awesome till you see the result in another browser ...
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

prostě v KeyPressed nechci mít 9x tohle:

if( key == KeyEvent.VK_1){
type = 1;
}
if( key == KeyEvent.VK_2){
type = 2;
}

atd. až do devíti čísel(nula tam není :D) chápeš?

Editováno 30.9.2014 19:42
Nahoru Odpovědět 30.9.2014 19:42
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:
for(int i = 1; i <= 9; i++){
        if(key == "parse enum java"){
            type = i;
        }
 }
 
Nahoru Odpovědět 30.9.2014 19:45
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

to "parse enum java" nahrazuje jen to i ?

Editováno 30.9.2014 19:53
Nahoru Odpovědět 30.9.2014 19:51
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Trošku jsem na to koukal a to není enum, ale normální číslo. si někde ulož první key od kterého chceš počítat (asi KeyEvent.VK1) a k tomu vždycky připočti i a porovnej s tou stlačenou klávesou.

private int ConvertKey(int key)
{
    int first = KeyEvent.VK_1;
    for (int i = 0; i < 9; i++)
        if(key == first + i)
          return i + 1;
    return 0;
}
 
Nahoru Odpovědět 30.9.2014 20:15
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

To je dobrý :D to to radši napíšu 9x :D :D

Nahoru Odpovědět 30.9.2014 20:26
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Napsal jsem ti metodu, která ti to udělá, takže ty ve výsledném kódu napíšeš jen tohle:

type = ConvertKey(key);

ale ok, piš to jak chceš ;)

Editováno 30.9.2014 20:41
 
Nahoru Odpovědět 30.9.2014 20:41
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:

a kam to mam vložit? pod KeyPressed()? nebo do něj?

Nahoru Odpovědět 30.9.2014 20:55
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Nechceš radši nahrát celej kód?

Nahoru Odpovědět 30.9.2014 21:02
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tomhaus
Jan Vargovský:

Vlož to tam, kde chceš zjistit co za klávesu jsi zmáčkl... Btw, pročti si nějaké tutoriály/ zaplať nějaký kurz, ušetří ti to spoustu času nám oběma.

 
Nahoru Odpovědět 30.9.2014 21:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 34 zpráv z 34.