Bleenda Skrevet 26. september 2012 Del Skrevet 26. september 2012 Hei, kronglete tittel men har et par spørsmål. Jobber med en oppgave å har støtt på noen problemer. Bruker g2d.draw for å tegne bilder i spillet mitt, disse er importert inn i koden og tegnes på skjermen. Poenget er at en bil skal fange coins og "frode" for å så få poeng. Alt fungerer egentlig fint, bortsett fra da jeg la til "frode" på samme måte som coin tuller ting litt. Det som skjer er at om jeg plukker på "frode_r" så går coin helt vill.. spretter fram og tilbake.. som om dem reagerer på hverandre.. om jeg tar coin og ikke r_frode går alt helt fint. Noen måte å fikse dette på? I tillegg "flasher" programmet når det tegnes på nytt, noen måte jeg kan unngå dette på? import java.awt.*; import java.awt.event.*; import java.io.File; import java.lang.management.ManagementFactory; import java.util.Random; import javax.swing.*; public class BilFrame extends JFrame{ public int bil_yposisjon = 0; public int bil_xposisjon = 0; public int mynt_yposisjon = 0; public int mynt_xposisjon = 0; public int frode_ypos = 0; public int frode_xpos = 0; public int bredde = 1024; public int hoyde = 720; public int poengsum = 0; public int minuspoeng = 0; public int JoptionOK = 0; public BilFrame(){ setSize(bredde, hoyde); add(new Vindu(this)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setFocusable(true); setVisible(true); } public void kjoerHoyre(){ //bil_xposisjon += 8; } public void kjoerVenstre(){ //bil_xposisjon -= 8; } public void myntFall(){ /*mynt_yposisjon += 5; if(mynt_yposisjon>hoyde){ mynt_yposisjon = 0; Random rg = new Random(); mynt_xposisjon = rg.nextInt(bredde); }*/ } public void frodeFall () { frode_ypos += 5; if(frode_ypos>hoyde){ frode_ypos = 0; Random rg = new Random(); frode_xpos = rg.nextInt(bredde);} } public void kollision(){ /*poengsum += 1; mynt_yposisjon = 0;*/ frode_ypos = 0; } private class Vindu extends JPanel implements ActionListener { /** * @param args */ ImageIcon bil; ImageIcon mynt; ImageIcon frode; BilFrame parent; Timer timer; JLabel pointslabel; public Vindu(BilFrame parent){ this.parent = parent; this.setBackground(Color.BLACK); setFocusable(true); setBackground(Color.BLACK); setDoubleBuffered(true); setTitle("EliseSpillet - Fang sjokoladen før den stikker av!"); this.setVisible(true); //bil = new ImageIcon("src/car_oppgave.jpg"); bil = new ImageIcon(this.getClass().getResource("bunny.png")); //mynt = new ImageIcon("src/coin.jpg"); mynt = new ImageIcon(this.getClass().getResource("catch.png")); frode = new ImageIcon(this.getClass().getResource("frode.png")); this.parent.bil_xposisjon = 0; this.parent.bil_yposisjon = 300 ; //System.out.println(this.yposisjon); setDoubleBuffered(true); addKeyListener(new TAdapter()); timer = new Timer(5,this); timer.start(); pointslabel = new JLabel(); this.add(pointslabel); } public void paint(Graphics g) { if (minuspoeng > 10) { UIManager.put("OptionPane.okButtonText", "Prøv igjen bitch!"); JOptionPane.showMessageDialog(null, "Du døde av dårlig samvittighet over sløst sjokolade!" ); if (JoptionOK == JOptionPane.OK_OPTION){ if (JoptionOK == 0) { minuspoeng = 0; poengsum = 0; } } } else { super.paint(g); Graphics2D g2d = (Graphics2D)g; try{ g2d.drawImage(mynt.getImage(), this.parent.mynt_xposisjon, this.parent.mynt_yposisjon, this); g2d.drawImage(frode.getImage(), this.parent.frode_xpos, this.parent.frode_ypos, this); g2d.drawImage(bil.getImage(), this.parent.bil_xposisjon, this.parent.bil_yposisjon, this); Toolkit.getDefaultToolkit().sync(); g.dispose(); pointslabel.setText("Dine poeng er: "+parent.poengsum + " Du har : " + parent.minuspoeng + " minuspoeng!"); } catch(NullPointerException e){ System.out.println("Kunne ikke tegne opp"); } } } public void tegnPaaNytt(){ repaint(); paint(getGraphics()); try { Thread.sleep(10); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } checkCollision(); } public void checkCollision(){ Rectangle mynt_r = new Rectangle(this.parent.mynt_xposisjon, this.parent.mynt_yposisjon, mynt.getImage().getWidth(this), mynt.getImage().getHeight(this)); Rectangle frode_r = new Rectangle(this.parent.frode_xpos, this.parent.frode_ypos, frode.getImage().getWidth(this), frode.getImage().getHeight(this)); Rectangle bil_r = new Rectangle(this.parent.bil_xposisjon, this.parent.bil_yposisjon, bil.getImage().getWidth(this), bil.getImage().getHeight(this)); if(mynt_r.intersects(bil_r) || frode_r.intersects(bil_r)){ parent.kollision(); System.out.println("Kollisjon"); } } public void actionPerformed(ActionEvent arg0) { parent.myntFall(); parent.frodeFall(); tegnPaaNytt(); } private class TAdapter extends KeyAdapter{ public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if (key == KeyEvent.VK_RIGHT) { parent.kjoerHoyre(); } if (key == KeyEvent.VK_LEFT) { parent.kjoerVenstre(); } tegnPaaNytt(); } } } } Lenke til kommentar
Cemi Skrevet 27. september 2012 Del Skrevet 27. september 2012 (endret) Vet ikke hva du mener med å plukke på frode, antar du kanskje mener når du skrur på kollisjon så blir mynt_ypos og frode_ypos satt til 0 når noe kolliderer? For å se hva som skjer feil i tegninga, så kan du se på Exceptionen (NullpointerException e) du får. Den gir som regel litt informasjon om hva som gikk galt. Lykke til med Dat101 på UiA Endret 28. september 2012 av Cemi 1 Lenke til kommentar
RaaneHolmg Skrevet 27. september 2012 Del Skrevet 27. september 2012 Har ikke jobbet spesifikt med g2d før, men jeg antar at årsaken til flashingen på skjermen er at du tømmer skjermen før du kaller getGraphics() og så tegner den. Hvis du endrer repaint(); paint(getGraphics()); til noe slikt som Graphics grafikkTilTegning = getGraphics(); repaint(); paint(grafikkTilTegning); Burde den hjelpe. Årsaken er at bildet ditt står tomt mens du genererer grafikk, og det kan ta litt tid. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå