Avatar billede tuidoi Nybegynder
07. oktober 2008 - 21:12 Der er 17 kommentarer og
1 løsning

Flot grafik i java?

Hej

hvordan kan det være at grafikken i flash spil næsten altid er meget mere klart og tydeligt end spil i java..

Se for eks. dette klassiske flash spil:
http://www.totaltiorden.dk/flash/flash_game.php/266

også dette klassiske java-spil:
http://www.java-spil.dk/_spil/kid/i-kid.htm

Er det muligt at lave flot grafik i java?

jeg har læst om at man kan implementerer OpenGL i java, men jeg skal bare bruge grafikken til en simpelt brætspil, så kunne da godt tænke mig at vide hvorfor det altid bliver sådan lidt utydeligt når jeg tegner mine billeder i java med
paintComponent(Graphics g)
g.drawImage()
og især når jeg roterer objekterne bliver det meget utydeligt.

hvordan vil i anbefale at lave grafik i java, hvis man vil have de forskellige komponenter til at vende og dreje som man ser det i flash spil?
Avatar billede gedfrik Nybegynder
12. oktober 2008 - 14:05 #1
Graphics pakken i Java kan ikke særlig meget! Som du nævner, så kan man benytte sig af computerens grafikkort i Java, F.eks. vha. OpenGL. Java har også nogle 3D-grafik biblioteker der kan klare det for dig og man kan lave ligeså pæne spil i Java som man kan i andre sprog.

Det du har brug for er måske mere Graphics2D biblioteket. Graphics2D bruges ligesom Graphics klassen til at tegne i Java, men 2D'eren har en masse udvidet funktionalitet. F.eks. kan du bruge antialiasing der tegner blødere kanter på din grafik og dermed får det til at se mindre pixeleret ud.

Jeg synes du skulle læse lidt om Graphics2D - eller bare gå i gang selv.
Du får fat i et Graphics2D object sådan her:

public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D)g;
}

Hvis ikke dit du synes det går hurtigt nok, så skal du nok læse lidt om OpenGL i java... Men prøv Graphics2D først!
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 12:29 #2
Jeg har allerede leget med Graphics2D. Det har jeg været nødt til for at få de BufferedImages som jeg har lavet roteret, men jeg kunne godt tænke mig at se et eksempel på hvordan du laver de blødere kanter (antialiasing) eftersom jeg ikk rigtig har kunnet finde noget omkring det..

også et andet lille spørgsmål, hvis jeg bruger 3D pakken istedet for 2D pakken laver den så generelt flottere grafik end 2D pakken eller er der blot flere muligheder med denne?. Jeg mener om man i 3D pakken stadig er nødt til at lave antialiasing på sine roterede billeder?
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 18:39 #3
3D pakken gør ikke grafikken flottere som sådan - men den har, som du selv siger, nogle flere muligheder. Den har gjort en masse ting for dig i forvejen, så du ikke selv behøver at lave alt selv - men det virker overkill i forhold til hvad du vil lave.

Antialiasing bliver sat til Graphics2D objektet vha. RenderingHints:

...
//Tekst-antialiasing
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//Grafik, Shapes, Lines, Ovals osv - antialiasing.
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

Der findes en masse forskellige RenderingHints, der alle har til formål at styre satsen mellem ydeevne og udseende.

Håber du kan bruge det. Hvis du er meget engageret og vil læse mere om grafik i java, så skulle du anskaffe dig Filthy Rich Clients af Chet Haase og Romain Guy - den er eminent :)
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 19:22 #4
Jeg har prøvet at implementere det i min kode, men sys ikke det har noget synlig effekt.

Er dette kun beregnet til de ting man selv tegner i java eller hvordan?
Jeg har selv lavet grafikken i Photoshop og kunne godt tænke mig at det stod knivskarpt ligesom i photoshop, men dette er desværre ikke tilfældet.. selvom jeg sætter renderinghints om.

når jeg tegner bilederne ind bruger jeg bare drawImage() er der andre måder at gøre det bedre på ?
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 19:30 #5
RenderingHints virker også når du tegner eksternt grafik. Prøv følgende inden du kalder drawImage():

RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        hints.put(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        hints.put(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
g2d.addRenderingHints(hints);
g2d.drawImage(...);

Så har du tilføjet en masse rendering, der gør kvaliteten bedre. Hvis ikke det gør nogen forskel på du smide din kode op :)
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 19:30 #6
... Hvor g2d selvfølgelig er dit Graphics2D objekt!
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 19:34 #7
ja den er jeg med på :)

har sat det ind som følgende:

        screenImage = new BufferedImage(screenSizeHeight, screenSizeHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D screen = screenImage.createGraphics();
        screen.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        screen.drawImage(bufferedBoardScaled, 0, 0, this);
        screen.drawImage(playerBoardRotated[1], 0, 0, this);
}

Så den burde være dog nok?
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 19:35 #8
også tegner jeg mit screenImage i paintComponent() senere
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 19:38 #9
Nu prøvede jeg lige dette hvor jeg først lavede antialiasing på mit BufferedImage i paintComponent():

    public void paintComponent(Graphics g) {
        Graphics2D twoDee = (Graphics2D) g;
        twoDee.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        twoDee.drawImage(screenImage, 0, 0, this);
    }

Gør det heller ikke bedre, desværre
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 19:48 #10
Jeg fandt lige denne tråd, der siger det ikke kan lade sig gøre i almindelig java2D i hvertfald:

http://forums.sun.com/thread.jspa?forumID=20&threadID=652940
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 19:49 #11
Prøv quality-hintet:

g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 19:50 #12
Ja, når du bruger BufferedImages - altså ekstern grafik. Når du tegner grafikken direkte i java virker det fint. Jeg tror du vil få et bedre resultat med overstående hint?
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 19:53 #13
Kunne ikke få det til at virke, men det gør ikke så meget.. :)
Det er bare til et skole projekt og dem prioriterer jeg ikke ligeså højt som mine egne :P lig bare et svar.

Ellers tak for hjælpen. jeg kan sikkert bruge noget af det på et senere tidspunkt
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 20:00 #14
Hmm... Det undrer mig. Jeg har selv brugt det flittigt og fået det til at virke før! Men okay, man kan ikke vinde hver gang. Håber du får en god karakter :)
Avatar billede tuidoi Nybegynder
13. oktober 2008 - 20:03 #15
Det er bare bestået eller ej bestået, og det opfylder allerede kravene gange 5, så gider ikk ligge flere kræfter i det ligenu, så skulle det kun være hvis det var for egen vindings skyld, men det mener jeg ikk det er nu..

Tak for hjælpen :)
Avatar billede gedfrik Nybegynder
13. oktober 2008 - 20:16 #16
Okay, så tror jeg heller ikke jeg ville gøre så meget ud af det. Noget andet hvis du rent faktisk fik en karakter for det ;)

Selv tak!
Avatar billede tuidoi Nybegynder
13. januar 2009 - 20:48 #17
gedfrik -> Lig et svar som tak for hjælpen!
Avatar billede gedfrik Nybegynder
13. januar 2009 - 20:53 #18
Accepteret svar: gedfrik
13/10-2008 20:00:55
Point: 200,00

Du har accepteret mit svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester