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.