Diskuze: Pomoc s hrou nechce mi vykreslit obrazovku
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
vajkuba1234:17.5.2016 0:45
Jasne, posli tady kod (pomoci </>), posli i chyby, ktere ti to pise a klidne i pridej obrazky...
package data;
import java.awt.Image;
/**
*
* @author david
*/
public class Blok{
private Image blok;
byte[] bloky;
private byte b1, b2, b3, b4;
//pre detekciu kolizii
private byte b5;
private int x = 0;
private int y = 0;
private int cisloBloku;
public Blok(Image obrazok, int cislo, byte b1, byte b2, byte b3, byte b4, byte b5) {
this.blok = obrazok;
this.cisloBloku = cislo;
this.b1 = b1;
this.b2 = b2;
this.b3 = b3;
this.b4 = b4;
this.b5 = b5;
this.bloky = new byte[] {b1,b2,b3,b4};
}
public Blok(Blok b) {
this.blok = b.dajBlok();
this.cisloBloku = b.dajCisloBloku();
this.b1 = b.dajBlokByte(0);
this.b2 = b.dajBlokByte(1);
this.b3 = b.dajBlokByte(2);
this.b4 = b.dajBlokByte(3);
this.b5 = b.dajKoliznyTyp();
this.bloky = b.dajBlokyByte();
}
public byte[] dajBlokyByte() {
return bloky;
}
public byte dajBlokByte(int indexBloku) {
if (indexBloku < bloky.length || indexBloku >= 0) {
return bloky[indexBloku];
} else {
System.out.println("Chyba: Nespravny index.");
return 0;
}
}
public byte dajKoliznyTyp() {
return b5;
}
public Image dajBlok() {
return blok;
}
public void nastavnazovBloku(Image obrazok) {
this.blok = obrazok;
}
public void nastavX(int x) {
this.x = x;
}
public void nastavY(int y) {
this.y = y;
}
public int dajX() {
return x;
}
public int dajY() {
return y;
}
public int dajCisloBloku() {
return cisloBloku;
}
public String toString() {
return "Cislo Bloku: " + cisloBloku + " b5: " + b5 + "Kolizne Bloky: " + b1 + ", " + b2 + ", " + b4 + " X: " + dajX() + " Y: " + dajY();
}
}
package data;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Hrac extends JPanel {
int x, y, vzdialenost, key;
private int smerX, smerY;
Image[][] sprite = new Image[4][3];
private int rychlost;
private Rectangle obdlznik;
private Image obrazok;
private boolean prerusenie = false;
private int intPrerusenie;
private BufferedImage postava;
public Hrac(int x, int y, Image[][] sprite) {
this.x = x;
this.y = y;
this.smerX = 0;
this.smerY = 0;
System.arraycopy(sprite[0],0, this.sprite[0], 0, 3);
System.arraycopy(sprite[1],0, this.sprite[1], 0, 3);
System.arraycopy(sprite[2],0, this.sprite[2], 0, 3);
System.arraycopy(sprite[3],0, this.sprite[3], 0, 3);
}
public int dajX() {
return x;
}
public int dajY() {
return y;
}
public int dajVzdialenost() {
return vzdialenost;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(obrazok, x, y, null);
}
void pohyb( boolean[] kolizie, int[] vzdialenosti) {
this.prerusenie = false;
for(int i = 0; i < kolizie.length; i++) {
if(kolizie[i]) {
prerusenie = true;
intPrerusenie = vzdialenosti[i];
break;
}
}
if(prerusenie) {
switch(intPrerusenie){
case 0:
if (smerY != -1) {
y += smerY + 1;
}
break;
case 1:
if(smerX != 1) {
x += smerX - 1;
}
break;
case 2:
if(smerY != 1) {
y += smerY - 1;
}
break;
case 3:
if(smerX != -1) {
x += smerX + 1;
}
break;
}
} else {
x += smerX;
y += smerY;
}
}
public void keyPressed(KeyEvent e) {
key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_UP:
smerY = -1;
vzdialenost = 0;
break;
case KeyEvent.VK_DOWN:
smerY = 1;
vzdialenost = 2;
break;
case KeyEvent.VK_LEFT:
smerX = -1;
vzdialenost = 3;
break;
case KeyEvent.VK_RIGHT:
smerX = 1;
vzdialenost = 1;
break;
}
}
public void keyReleased(KeyEvent e) {
key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_UP:
smerY = 0;
break;
case KeyEvent.VK_DOWN:
smerY = 0;
break;
case KeyEvent.VK_LEFT:
smerX = 0;
break;
case KeyEvent.VK_RIGHT:
smerX = 0;
break;
}
}
}
package data;
import java.awt.Rectangle;
/**
*
* @author david
*/
public class KontrolaKolizii {
private Rectangle obd;
private Rectangle obdCely;
private Rectangle obd1;
private Rectangle obd2;
private Rectangle obd3;
private Rectangle obd4;
private boolean rozdelenieBloku = false;
public boolean kontrolaKolizie(Hrac hrac, Blok blok) {
this.rozdelenieBloku = false;
this.obd = new Rectangle(hrac.dajX(),hrac.dajY(), 24, 32);
if (blok.dajBlokyByte() != null) {
for (int i = 0; i < blok.bloky.length; i++) {
if (blok.bloky[i] != 0) {
rozdelenieBloku = true;
}
}
}
if (blok.dajKoliznyTyp() != 0 && rozdelenieBloku == false) {
obdCely = new Rectangle(blok.dajX(), blok.dajY(), 32, 32);
if (obd.intersects(obdCely)) {
return true;
}else return obdCely.intersects(obd);
}else if (rozdelenieBloku) {
obd1 = new Rectangle(blok.dajX(), blok.dajY(), 16, 16);
obd2 = new Rectangle(blok.dajX() + 16, blok.dajY(), 16, 16);
obd3 = new Rectangle(blok.dajX(), blok.dajY() + 16, 16, 16);
obd4 = new Rectangle(blok.dajX() + 16, blok.dajY() + 16, 16, 16);
if (blok.bloky[0] == 1) {
if (obd.intersects(obd1)) {
return true;
} else return obd1.intersects(obd);
} else if (blok.bloky[1] == 1) {
if (obd.intersects(obd2)) {
return true;
} else return obd2.intersects(obd);
} else if (blok.bloky[2] == 1) {
if (obd.intersects(obd3)) {
return true;
} else return obd3.intersects(obd);
} else if (blok.bloky[3] == 1) {
if (obd.intersects(obd4)) {
return true;
} else return obd4.intersects(obd);
} else {
return false;
}
} else {
return false;
}
}
public int vzdialenostKolizie(Hrac hrac) {
return hrac.dajVzdialenost();
}
}
package data;
import Loader.BlokLoader;
import Loader.MapaLoader;
import Loader.SpriteLoader;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Program implements ActionListener {
JFrame ram;
Vykreslovac panel;
Posluchac klavesnica;
MapaLoader citac;
Timer cas;
Hrac hrac;
BlokLoader nacitavacBlokov;
KontrolaKolizii kontrolor;
SpriteLoader nacitavacObrazkov;
private Blok[] bloks;
private int animacia;
private int[][] cislaBlokovMapa;
private int x = 0, y = 0, m = 0, n =0, zvys = 0, t = 0;
private boolean[] koliziaBoolean = new boolean[25000];
private int[] koliziaInt = new int[25000];
public Program() {
this.nacitavacBlokov = new BlokLoader();
this.nacitavacBlokov.nacitajBloky();
this.ram = new JFrame("Epic Game 3000 !!!");
this.panel = new Vykreslovac();
this.klavesnica = new Posluchac();
this.citac = new MapaLoader();
this.citac.nacitajMapu();
this.nacitavacObrazkov = new SpriteLoader();
this.nacitavacObrazkov.nacitaj();
this.hrac = new Hrac(0,0,nacitavacObrazkov.dajSprite());
this.cislaBlokovMapa = citac.dajBloky();
this.bloks = new Blok[25000];
this.kontrolor = new KontrolaKolizii();
}
public static void main(String[] args) {
Program program = new Program();
program.nastavenieProgramu();
}
public void nastavenieProgramu() {
ram.setSize(800, 600);
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.getContentPane().add(BorderLayout.CENTER, panel);
panel.setFocusable(true);
panel.addKeyListener(klavesnica);
ram.setVisible(true);
vytvorenieMapy();
this.cas = new Timer(5, this);
this.cas.start();
}
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < bloks.length; i++) {
if (bloks[i] != null) {
koliziaBoolean[i] = kontrolor.kontrolaKolizie(hrac, bloks[i]);
koliziaInt[i] = kontrolor.vzdialenostKolizie(hrac);
}
}
hrac.pohyb(koliziaBoolean, koliziaInt);
ram.repaint();
}
public void vytvorenieMapy() {
for (int i = 0; i < cislaBlokovMapa.length * 32; i++) {
if (x == cislaBlokovMapa.length * 32) {
this.x = 0;
this.y = y + 32;
}
if (n > cislaBlokovMapa[m].length - 1) {
this.n = 0;
this.m ++;
}
for (int j = 1; j < nacitavacBlokov.bloky.length; j++) {
if (cislaBlokovMapa[m][n] == j) {
bloks[zvys] = new Blok(nacitavacBlokov.dajBlok(j));
bloks[zvys].nastavX(x);
bloks[zvys].nastavY(y);
zvys++;
}
}
n++;
x = x + 32;
}
}
public class Vykreslovac extends JPanel {
@Override
public void paintComponent(Graphics g) {
g.drawRect(0,0,ram.getWidth(), ram.getHeight());
for (int i = 0; i < bloks.length; i++) {
if(bloks[i] != null) {
g.drawImage(bloks[i].dajBlok(), bloks[i].dajX(), bloks[i].dajY(), 32, 32, null);
}
}
boolean drawImage = g.drawImage(hrac.sprite[hrac.dajVzdialenost()][1], hrac.x, hrac.y, 24, 32, null);
animacia++;
if(animacia >= 30 && animacia < 80) {
g.drawImage(hrac.sprite[hrac.dajVzdialenost()][0], hrac.x, hrac.y, 24, 32, null);
} else if (animacia >= 80 && animacia < 150) {
g.drawImage(hrac.sprite[hrac.dajVzdialenost()][2], hrac.x, hrac.y, 24, 32, null);
animacia = 0;
}
g.drawString("Kolizia: (" + hrac.dajX() + ", " + hrac.dajY() + ")", 0, 290);
for(int i = 0; i < koliziaBoolean.length; i++) {
if(koliziaBoolean[i]) {
g.drawString("KOLIZIA!", 0, 300);
}
}
}
}
public class Posluchac extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
hrac.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
hrac.keyReleased(e);
}
}
}
package Loader;
import data.Blok;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author david
*/
public class BlokLoader {
public Blok[] bloky = new Blok[256];
private int cisloBloku;
private int i;
private int x;
public void nacitajBloky() {
BufferedImage obrazokBloku = null;
try {
obrazokBloku = ImageIO.read(new File("build\\classes\\res\\obrazky\\tilesheet2.png"));
i = 0;
x = 0;
for(int y = 0; y < 512; y += 0) {
if(i < bloky.length) {
switch(i) {
case 0:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0);
break;
case 1:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0);
break;
case 2:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)1,(byte)1,(byte)1,(byte)1);
break;
case 3:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)1,(byte)1,(byte)1,(byte)1);
break;
case 4:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)1,(byte)0,(byte)0,(byte)10);
break;
case 5:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)1,(byte)0,(byte)1,(byte)10);
break;
case 6:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)1,(byte)0,(byte)0,(byte)10);
break;
case 7:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)0,(byte)1,(byte)10);
break;
case 8:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)1,(byte)1,(byte)10);
break;
case 9:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)0,(byte)1,(byte)0,(byte)10);
break;
case 10:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)1,(byte)0,(byte)10);
break;
case 11:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)0,(byte)0,(byte)0,(byte)10);
break;
case 12:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 13:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 14:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 15:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 16:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 17:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 18:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 19:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
}
}
i++;
x = x+ 32;
if(x == 512) {
x = 0;
y = + 32;
}
if(y == 512) {
break;
}
}
}catch (IOException e) {
System.out.println("CHYBA: Neuspesne nacitanie obrazku.");
}
}
public Blok[] dajBloky() {
return bloky;
}
public Blok dajBlok(int cislo) {
return bloky[cislo-1];
}
}
package Loader;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
/**
*
* @author david
*/
public class MapaLoader {
private File mapa;
private Scanner skener;
private String[][] stringCisloBloku = new String[500][500];
private int[][] cislaBlokov = new int[500][500];
public MapaLoader(File f) {
this.mapa = f;
}
public MapaLoader() {
this.mapa = new File("build\\classes\\res\\mapa\\map.txt");
}
public void nacitajMapu() {
try {
this.skener = new Scanner(mapa);
int x = 0;
int y = 0;
while(skener.hasNext()) {
stringCisloBloku[y] = skener.next().split(",");
y++;
}
for (int i = 0; i < stringCisloBloku.length; i++) {
for (int j = 0; j < stringCisloBloku[i].length; j++) {
if (stringCisloBloku[i][j] == null) {
cislaBlokov[i][j] = -1;
}else {
cislaBlokov[i][j] = Integer.parseInt(stringCisloBloku[i][j]);
}
}
}
} catch (IOException ex) {
}
}
public int [][] dajBloky() {
return cislaBlokov;
}
}
package Loader;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;
/**
*
* @author david
*/
public class SpriteLoader {
File sprites;
BufferedImage spriteSheet;
Image[][] hracSprites = new Image[4][3];
public SpriteLoader() {
this.sprites = new File("build\\classes\\res\\obrazky\\spritesheet.png");
}
public void nacitaj() {
try {
spriteSheet = ImageIO.read(sprites);
int i = 0;
int j = 0;
for (int y = 2; y < 135; y = y +32) {
for (int x = 0; x < 71; x = x + 24) {
if (j == 4) {
break;
}else {
hracSprites[j][i] = spriteSheet.getSubimage(x, y, 24, 32);
i++;
}
}
i =0;
j++;
}
}catch (IOException ex) {
System.out.println("CHYBA: Neuspesne nacitanie sprites.");
}
}
public Image[][] dajSprite() {
return hracSprites;
}
}
plus je tam este mapa.txt subor nechce mi vykreslit hraca a ani mapu a ked dam spustit main tak mi stale bezi a nic neukaze ale ako nahle program skompilujem a spravim jar subor spustim ho vykresli mi okno a suradnice bez hraca a mapy
S Debuggerom sme sa nejak extra neucili robit takze som to neprechadzal :/ jedine kde sme sa to ucili bol Bluej prvy semester bol by som ti vdacny za pomoc ak by sa dalo Dakujem
vajkuba1234:17.5.2016 1:20
Tam kde vytvaris hrace a mapu si dej breakpoint (treba na zacatek metody) - pomoci kliknuti na cislo radku na leve strane (NetBeans) a pote vyber v hornim menu Debug a pomoci sipek v menu to krokuj. Uvidis co se kde dela hezky postupne... Staci takhle?
No skor by som preferoval riesenie mojho problemu kedze nemam moc casu :/ ale aj tak dakujem
ach jo... kdybys fakt aspoń napsal co a kde ti hází exceptionu-.- nezdá se ti hloupé to sem tak hodit a defakto všem říct: "postarejte se o to"? soudím, že to máš za úkol do školy a moc tomu nerozumíš, ale příště zkus ten problém trošku specifikovat...
jdu se ti na to mrknout, ale mezitím zkus aspoň napsat účel programu, ať mám aspoň představu o výsledku...
hoď sem ještě i třídu BlokLoader
package Loader;
import data.Blok;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author david
*/
public class BlokLoader {
public Blok[] bloky = new Blok[256];
private int cisloBloku;
private int i;
private int x;
public void nacitajBloky() {
BufferedImage obrazokBloku = null;
try {
obrazokBloku = ImageIO.read(new File("build\\classes\\res\\obrazky\\tilesheet2.png"));
i = 0;
x = 0;
for(int y = 0; y < 512; y += 0) {
if(i < bloky.length) {
switch(i) {
case 0:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0);
break;
case 1:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0);
break;
case 2:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)1,(byte)1,(byte)1,(byte)1);
break;
case 3:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)1,(byte)1,(byte)1,(byte)1);
break;
case 4:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)1,(byte)0,(byte)0,(byte)10);
break;
case 5:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)1,(byte)0,(byte)1,(byte)10);
break;
case 6:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)1,(byte)0,(byte)0,(byte)10);
break;
case 7:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)0,(byte)1,(byte)10);
break;
case 8:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)1,(byte)1,(byte)10);
break;
case 9:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)0,(byte)1,(byte)0,(byte)10);
break;
case 10:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)0,(byte)0,(byte)1,(byte)0,(byte)10);
break;
case 11:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)1,(byte)0,(byte)0,(byte)0,(byte)10);
break;
case 12:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 13:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 14:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 15:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 16:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 17:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 18:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
case 19:
bloky[i] = new Blok(obrazokBloku.getSubimage(x, y, 32, 32),i,(byte)10,(byte)10,(byte)10,(byte)10,(byte)1);
break;
}
}
i++;
x = x+ 32;
if(x == 512) {
x = 0;
y = + 32;
}
if(y == 512) {
break;
}
}
}catch (IOException e) {
System.out.println("CHYBA: Neuspesne nacitanie obrazku.");
}
}
public Blok[] dajBloky() {
return bloky;
}
public Blok dajBlok(int cislo) {
return bloky[cislo-1];
}
}
Zobrazeno 13 zpráv z 13.