Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:26.9.2014 17:47

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:26.9.2014 17:57

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:26.9.2014 18:40

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:26.9.2014 18:50

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:26.9.2014 19:40

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:26.9.2014 21:08

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:26.9.2014 22:01

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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
26.9.2014 22:01
Avatar
Tomhaus
Člen
Avatar
Tomhaus:27.9.2014 11:11

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:27.9.2014 13:07

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:27.9.2014 16:58

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:27.9.2014 17:34

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:27.9.2014 19:22

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
Odpovídá na Tomhaus
Lukáš Křehula:28.9.2014 10:54

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:29.9.2014 16:38

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:29.9.2014 16:46

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:29.9.2014 22:27

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:29.9.2014 22:37

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:29.9.2014 22:43

Koukni na mou první reakci ;)

 
Nahoru Odpovědět
29.9.2014 22:43
Avatar
Tomhaus
Člen
Avatar
Tomhaus:30.9.2014 16:45
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 <i>VK_</i> dát tu proměnnou <i>i</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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:30.9.2014 18:22

Google it: "parse enum java"..

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

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:30.9.2014 19:12

Do jaké proměnné?

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

do nové proměnné <i>type</i>, 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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:30.9.2014 19:38

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

 
Nahoru Odpovědět
30.9.2014 19:38
Avatar
Nahoru Odpovědět
30.9.2014 19:40
Neaktivní uživatelský účet
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Jan Vargovský
Tomhaus:30.9.2014 19:42

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:30.9.2014 19:45
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:30.9.2014 19:51

to "parse enum java" nahrazuje jen to <i>i</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ý
Tvůrce
Avatar
Jan Vargovský:30.9.2014 20:15

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:30.9.2014 20:26

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:30.9.2014 20:41

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:30.9.2014 20:55

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:30.9.2014 21:02

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ý
Tvůrce
Avatar
Odpovídá na Tomhaus
Jan Vargovský:30.9.2014 21:07

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.