Diskuze: pohyb objektu - objekt se nehýbe, někde je chyba
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 42 zpráv z 42.
//= 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.
Kliky se zachycují na formuláři, navíc tvoje komponenta neimplementuje KeyListener.
Do formuláře si přidej toto:
addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
delo.stisknutaKlavesa(e);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
delo.pustenaKlavesa(e);
}
});
V dělu si potom ty metody přejmenuj. Událost zachytává form a volá metodu na dělu, to si pak sebou pohybuje podle argumentu v metodě.
Nemáš tam žádný timer nebo vlákna btw tohle mi ukázal Fugiczeck když
jsem nevěděl jak na to máš
to tam věchno popsaný. http://zetcode.com/…vingsprites/
Popsal jsem ti přesně jak to udělat. Co konkrétně ti nejde?
Metody většinou pojmenováváme Vložíš to do konstruktoru formuláře. Pokud ti překladač píše
chybu, tak pošli kód, kde je chyba.
děkuji za ochotu
Zde máš kód bez toho co jsi mi posílal protože by jsi se asi hodně
zasmál:
Toto je celá hra co mám
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Color;
import java.awt.*;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Rectangle;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
class mojedelo extends JComponent {
int Y=200;
int X=290;
public void paint(Graphics k) {
Graphics2D g2 = (Graphics2D) k;
Image img1 = Toolkit.getDefaultToolkit().getImage("delo.png");
g2.drawImage(img1, +Y, +X, this);
g2.finalize();
}
public void stisknutaKlavesa(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
X=X+50;
}
if (key == KeyEvent.VK_RIGHT) {
X=X-20;
}
}
public void pustenaKlavesa(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
}
if (key == KeyEvent.VK_RIGHT) {
}
}
}
class BgPanel extends JPanel {
Image bg = new ImageIcon("image.jpg").getImage();
public void paintComponent(Graphics g) {
g.drawImage(bg, 0, 0, this);
}
}
public class delo extends JFrame {
public static void main(String args[]) {
JPanel BgPanel = new BgPanel();
BgPanel.setLayout(new BorderLayout());
BgPanel.add(new mojedelo(), BorderLayout.CENTER);
delo okno = new delo();
Image icon = Toolkit.getDefaultToolkit().getImage("delo.png");
okno.setContentPane(BgPanel);
okno.setIconImage(icon);
okno.setResizable(false);
okno.setTitle("Dělo - hra");
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.setSize(500, 400);
okno.setLocationRelativeTo(null);
okno.setVisible(true);
}
}
Uprav metodu Main takto:
public class delo extends JFrame {
public static void main(String args[]) {
JPanel BgPanel = new BgPanel();
BgPanel.setLayout(new BorderLayout());
mojedelo md = new mojedelo();
BgPanel.add(md, BorderLayout.CENTER);
addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
md.stisknutaKlavesa(e);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
md.pustenaKlavesa(e);
}
});
....
Přidáním KeyListeneru na formulář definuješ metody, co se spustí,
když na formuláři zachytíš klávesu. V těchto metodách voláš pohyb na
instanci tvého děla. Možná to bude chtít ještě volat potom repaint(), aby
se změna projevila. Ten kód mi přijde dost divný, ale to by bylo na déle
jo je dost divný já to
skládám vesměs z toho co najdu na internetu, musím to mít do 27.3 a
bohužel to nedávám, přešel jsem ze základů javy ( úplně ze základů )
do této fáze jen proto abych tohle dal něják dohromady. Sedím u toho 12
hodiny denně a hledám, zkouším, už mi to ani nemyslí...
Je vidět, že je to splácané... pokud jde o ten pohyb, přikládám
ukázku. Snad pomůže, snažil jsem se to v rychlosti trochu okomentovat.
Promiň, ale je v tom hrozný bordel. To addKeyListener se má volat na
okně, nevšiml jsem si že to není konstruktor ale Main. Návrhově je to
úplně blbě, máš i špatně pojmenované třídy atd. V sekci Java máš
tutoriály od Samika, je tma popsané jak se GUI dělá. Zkus ještě tohle, pak
to vzdávám a radši ti to pomůžu napsat znova
public class delo extends JFrame {
public static void main(String args[]) {
JPanel BgPanel = new BgPanel();
BgPanel.setLayout(new BorderLayout());
mojedelo md = new mojedelo();
BgPanel.add(md, BorderLayout.CENTER);
delo okno = new delo();
okno.addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
md.stisknutaKlavesa(e);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
md.pustenaKlavesa(e);
}
});
Image icon = Toolkit.getDefaultToolkit().getImage("delo.png");
okno.setContentPane(BgPanel);
okno.setIconImage(icon);
okno.setResizable(false);
okno.setTitle("Dělo - hra");
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.setSize(500, 400);
okno.setLocationRelativeTo(null);
okno.setVisible(true);
}
}
Možná to bude řvát kvůli tomu že proměnná md není atribut třídy
delo. Pokud ano, napiš sem přesně co chceš dělat a já ti s tím pomůžu,
protože tohle je katastrofa
OK, dojdu dom a hned k tomu sednu, mám to ve středu odevzdávat.... a to
ještě nevíte že tam na hoře má lítat objekt a to dělo má střílet +
počítat sestřelení
říkal sem si že když to udělám tak aby se to dělo hýbalo, na hoře by
asi určitě přes timer lítal objekt ( letadlo ) a dělo by střílelo bez
počítání střetů střely a letadla tak by to stačilo. Já nezvládnu ani
tohle :/
Aha, už to vidím. Máš tam navíc "extends JFrame". Dělo není frame.
Když nepotřebuješ konstruktor, tak často nepotřebuješ ani dědičnost.
K čemu by se dal konstruktor použít? Například pro definování vlastností okna, aby se to zbytečně necpalo do metody main.
mám vytvořit hru kde dole bude dělo které se bude posouvat po ose x, po ose x ale nahoře má přelétávat letadlo a dělo má reagovat na zmáčknutí šipky nahoru tím že vystřelí a pak se budou porovnávat souřadnice letadla a střely... musím hlavně něják zkout pohyb děla, aby tam lítalo to letadlo a střílení děla, zkusím si pomoct http://zetcode.com/…vingsprites/
Stáhni si z tohoto vlákna můj projekt Arkanoid (je tam dole link). Není to zrovna ukázková hra, ale myslím, že tam najdeš přesně to, co hledáš - http://www.itnetwork.cz/…12de33aaf180
prozatím si upravuji to z toho http://zetcode.com potřebuju tam vykreslovat obrázek na pozadí okna a další obrázek je delo, delo sem přebral ze své staré tvorby
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Image img1 = Toolkit.getDefaultToolkit().getImage("delo.png");
g2.drawImage(img1, +y, +x, this);
g2.finalize();
setOpaque(false);
}
a když si vytvořím novou třídu pro pozadí
class BgPanel extends JPanel {
Image bg = new ImageIcon("image.jpg").getImage();
public void paintComponent(Graphics g) {
g.drawImage(bg, 0, 0, this);
}
}
zobrazím ji
....
panel = new Painting();
pozadi = new BgPanel();
...
cont.add(pozadi);
pozadi.add(panel);
tak se delo pohybuje ale nezobrazí se mi pozadí.
Mám vytvořené letadlo
public class Letadlo extends JPanel{
// souřadnice x, y
private int y = 10;
private int x = 0;
private int cas;
public void paint(Graphics g) {
Graphics2D g3 = (Graphics2D) g;
Image img = Toolkit.getDefaultToolkit().getImage("letadlo.png");
g3.drawImage(img, +x, +y, this);
g3.finalize();
setOpaque(false);
}
// getry a setry
public void setY(int y)
{
this.y = y;
}
public void setX(int x)
{
this.x = x;
}
public void setCas(int cas)
{
this.cas = cas;
}
public int getCas()
{
return cas;
}
}
potom mám v časovači nastavené přičítání času v 1 vteřině o 1
a mám to použité jak u panelu ( v mém případě u děla ) tak u
letadla.
Event e = new Event();
// přídání posluchače
addKeyListener(e);
TimerClass listener = new TimerClass();
timer = new Timer(1000, listener);
// začátek počítání
timer.start();
poté jsem chtěl metodu která by měla posunovat letadlo ale potřebuju ji něják propojit s tím časováním a nevím jak, vím že asi není ani správně, popř. mi prosím vysvětlete proč to tak nemůže být a co mám udělat proto aby se mi to posunovalo podle timeru.
public class EventLetadlo
{
int poziceX = 0;
int poziceY = 10;
public void posunLetadlo(String args[]) {
poziceX += 3;
letadlo.setX(poziceX);
letadlo.repaint();
}
}
tohle už je taky vyřešeno, teď mám problém s vykreslením aji letadla a aji dela zaráz, nevím jak na to
kód pro vykreslení mám
cont.add(pozadi);
pozadi.setLayout(new BorderLayout());
pozadi.add(delo, BorderLayout.CENTER);
a delo se mi zobrazí, když takhle místo děla zobrazím letadlo tak to taky funguje ale nevím jak zobrazi obě zaráz ?
Letadlo
public class Letadlo extends JPanel{
private int y = 10;
private int x = 0;
public void paint(Graphics g) {
Graphics2D g3 = (Graphics2D) g;
Image img = Toolkit.getDefaultToolkit().getImage("letadlo.png");
g3.drawImage(img, +x, +y, this);
g3.finalize();
setOpaque(false);
}
..................
a delo je
public class Delo extends JPanel{
private int y = 290;
private int x = 200;
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Image img1 = Toolkit.getDefaultToolkit().getImage("delo.png");
g2.drawImage(img1, +x, +y, this);
g2.finalize();
setOpaque(false);
}
......................
V kódu pro vykreslení nevidím zobrazení letadla i děla. Máš to takhle?
cont.add(pozadi);
pozadi.setLayout(new BorderLayout());
pozadi.add(letadlo, BorderLayout.CENTER);
pozadi.add(delo, BorderLayout.CENTER);
já tam dával kód bez vykreslení letadla, když to dám tak jak si mi to tu napsal ty tak mi delo překryje letadlo a letadlo nejde vidět...
zkoušl sem testovat a když udělám pahýl
cont.add(pozadi);
pozadi.setLayout(new BorderLayout());
pozadi.add(delo, BorderLayout.CENTER);
delo.setLayout(new BorderLayout());
delo.add(letadlo, BorderLayout.CENTER);
a nastavím v letadlu setOpaque(true); tak se mi to zobrazuje a za letadlem jede pochopitelně černá čára s tím že když pohnu s dělem šipkou tak se mi to překreslí a čára pokračuje po zastavení děla, a když dám setOpaque(false); tak se mi letadlo nezobrazí vůbec
pro lepší pochopení to ukážu
takhle za tím letadlem valí černá čára když tam mám
cont.add(pozadi);
pozadi.setLayout(new BorderLayout());
pozadi.add(delo, BorderLayout.CENTER);
delo.setLayout(new BorderLayout());
delo.add(letadlo, BorderLayout.CENTER);
a setOpaque(true);
když pohnu s dělem tak se černá čára přeruší a pokračuje až šipku pustím
delo.add(letadlo) - Proč vkládáš do děla letadlo? To mi nějak nedává smysl. Máš tam nějaké pozadí, nevím co to je, ale vkládáš na to dělo, tak na to vlož i letadlo. Psal jsem ti to výše, zkoušel jsi to?
Takže... že je to dost blbě jsem ti už určitě říkal Nicméně je to mnohem lepší,
než předtím. Ještě to napsat tak 2x nebo 3x odznovu a už jsi docela dobrý
Javista
Aby to mělo
nějaký smysl, musel bych to napsat znovu a na to nemám časové možnosti.
Zprovoznil jsem ti to způsobem, jakým to máš teď udělané.
Vložení objektů:
pozadi.setLayout(new BorderLayout());
pozadi.add(letadlo, BorderLayout.NORTH);
pozadi.add(delo, BorderLayout.SOUTH);
Do třídy Letadlo si přidej konstruktor, který nastaví té komponentě velikost, jinak má 0 a nezobrazí se:
public Letadlo()
{
super();
setPreferredSize(new Dimension(500, 500));
}
Ve třídě Delo to samé:
public Delo()
{
super();
setPreferredSize(new Dimension(500, 500));
}
U děla změň hodnotu v setOpague na false:
setOpaque(false);
Takhle mi to funguje dobře
Můžeš se pokusit o tu střelbu, třeba ti tu pomůže zas někdo jiný nebo
já zítra.
No ten pohyb máš hotový, kdyby ti to nešlo, tak ti to pošlu Střelba bude problém, protože to
máš udělané přes BorderLayout, musel bych zkoumat jak to obejít.
taky mě to napadlo ale pořádně nevím jak mám postupovat, vytvořím si třídu strela ve které se bude vykreslovat teď už ne obrázek ale třeba kulička... kulička bude vystřelovat po ose x v závislosti na čase tak jak to letadlo, teď nastává problém -> vytvořím si ifko na snímání šipky nahoru a zapíšu tam něco ve smysl new strela() ale co potom, jak to udělat aby se mi kulička zobrazila/vystřelila ? popřípadě abych mohl vystřelit několikrát za sebou ?
Zobrazeno 42 zpráv z 42.