Diskuze: Posun rámečku
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

					Člen				
			
Zobrazeno 34 zpráv z 34.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.


Jestli se mění souřadnice tak jen znovu nevykresluješ 
, takže tam musíš zavolat
nějakej repaint nebo něco podobného.
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?
Můžeš ukázat tu třídu Border? Nebo mi upni celej projekt a kouknu na to.
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í
        }
}
					Tak si tam přidej ještě nějaky boolean isSelected a podle toho to vykresluj daný border (třeba).
						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ý.
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?

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 
.
jo máš pravdu, dělam to podle jednej předlohy jinej hry, ale tady mi
stačí jen jeden rámeček 
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.
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.
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?
Já to asi stejnak budu muset udělat přes pole, protože potřebuju, aby mi to vyhodilo stejný číslo do proměnné.
do nové proměnné <i>type</i>, kterou si teprve vytvořim 
 nějakej návrh jak bych to mohl
udělat?
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í 
) chápeš?
for(int i = 1; i <= 9; i++){
        if(key == "parse enum java"){
            type = i;
        }
 }
					to "parse enum java" nahrazuje jen to <i>i</i> ?
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;
}
					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š 
a kam to mam vložit? pod KeyPressed()? nebo do něj?
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.
Zobrazeno 34 zpráv z 34.