/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
flimmer...
Fra : Jonas Swiatek


Dato : 25-02-01 22:08

Hey.

Jeg har en klasse:
import java.awt.*;

public class Ship extends Component {
Image shipGraphics;

public Ship(Image shipGfx) {
shipGraphics = shipGfx;
}

public void paint(Graphics g) {
g.drawImage(shipGraphics, 0, 0, this);
}
}

Og et Panel - som implementerer KeyListener:

Ship ship = new Ship(shipGra);
ship.setBounds(20,20,19,19);
add(ship);

public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == 37) {
ship.setLocation(ship.getBounds().x - 10, ship.getBounds().y);
}
if(e.getKeyCode() == 38) {
ship.setLocation(ship.getBounds().x, ship.getBounds().y - 10);
}
if(e.getKeyCode() == 39) {
ship.setLocation(ship.getBounds().x + 10, ship.getBounds().y);
}
if(e.getKeyCode() == 40) {
ship.setLocation(ship.getBounds().x, ship.getBounds().y + 10);
}
}

Mit problem er, at det lille ikon (ship), flimmer som bare fanden.

Jeg har prøvet at overkskrivt
update(), så den kun kalder paint(), men den ændre ingen ting.

Jeg har os prøvet med:
Image offImage = createImage(getBounds().width, getBounds().height);
Graphics buffer = offImage.getGraphics();

og så tegne tingene i buffer først, og så paint offImage.
Men jeg får en nullPointerException. <- HVORFOR DET ?

Håber nogle kan hjælpe.

--
Jonas.



 
 
Lars Dam (26-02-2001)
Kommentar
Fra : Lars Dam


Dato : 26-02-01 10:20

On Sun, 25 Feb 2001 22:08:01 +0100, "Jonas Swiatek" <sxt@get2net.dk>
wrote:


>Jeg har os prøvet med:
>Image offImage = createImage(getBounds().width, getBounds().height);
>Graphics buffer = offImage.getGraphics();

Det er helt klart den rigtige løsning hvis du vil undgå flimmer.

>og så tegne tingene i buffer først, og så paint offImage.
>Men jeg får en nullPointerException. <- HVORFOR DET ?

Tjae. Det vides ikke, da du ikke fortæller os hvordan den linie du får
en NPE i ser ud? Prøv at poste det eksempel.

NPE's er et generelt fænomæn og kan som sådan ikke bare lige forklares
væk. Man får NPE, når man arbejder med en reference som peger på null:

String s = "hello world";
System.out.println( s );   // udskriver 'hello world'
s = null;
System.out.println( s );   // giver en NPE

Så i den linie du får NPE refererer du altså til null, og ikke en
instans af et objekt.

>Håber nogle kan hjælpe.

vh. ld
--
"Time is the fire in which we burn"

Jonas Swiatek (26-02-2001)
Kommentar
Fra : Jonas Swiatek


Dato : 26-02-01 18:20

Kilde koden er:
import java.awt.*;

public class Ship extends Component {
Image shipGraphics;

Image bufferImage;
Graphics buffer;

public Ship(Image shipGfx) {
shipGraphics = shipGfx;

bufferImage = createImage(getBounds().width, getBounds().height);
buffer = bufferImage.getGraphics();
}

public void paint(Graphics g) {
buffer.drawImage(shipGraphics, 0, 0, this);
g.drawImage(bufferImage, 0, 0, this);
}

public void update(Graphics g) {
paint(g);
}
}

Dette komponent bliver tegnet på et java.awt.Panel

--
Jonas

"Lars Dam" <lars_simple_spam_protection_dam@post2.tele.dk> skrev i en
meddelelse news:jm7k9tkhhuhgq0ttb0m2angcescfs9ff7n@4ax.com...
> On Sun, 25 Feb 2001 22:08:01 +0100, "Jonas Swiatek" <sxt@get2net.dk>
> wrote:
>
>
> >Jeg har os prøvet med:
> >Image offImage = createImage(getBounds().width, getBounds().height);
> >Graphics buffer = offImage.getGraphics();
>
> Det er helt klart den rigtige løsning hvis du vil undgå flimmer.
>
> >og så tegne tingene i buffer først, og så paint offImage.
> >Men jeg får en nullPointerException. <- HVORFOR DET ?
>
> Tjae. Det vides ikke, da du ikke fortæller os hvordan den linie du får
> en NPE i ser ud? Prøv at poste det eksempel.
>
> NPE's er et generelt fænomæn og kan som sådan ikke bare lige forklares
> væk. Man får NPE, når man arbejder med en reference som peger på null:
>
> String s = "hello world";
> System.out.println( s ); // udskriver 'hello world'
> s = null;
> System.out.println( s ); // giver en NPE
>
> Så i den linie du får NPE refererer du altså til null, og ikke en
> instans af et objekt.
>
> >Håber nogle kan hjælpe.
>
> vh. ld
> --
> "Time is the fire in which we burn"



Ulrik Magnusson (26-02-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 26-02-01 19:46

> public Ship(Image shipGfx) {
> shipGraphics = shipGfx;
>
> bufferImage = createImage(getBounds().width, getBounds().height);
> buffer = bufferImage.getGraphics();
> }

Dette skulle virke:

public Ship(Image shipGfx) {
shipGraphics = shipGfx;
invalidate();
validate();
bufferImage = createImage(getBounds().width, getBounds().height);
buffer = bufferImage.getGraphics();
}

Problemet er nok at du laver et image som er 0*0 - og det dur ikke..

Ulrik Magnusson

--
"I'm a big tough man with a big tough plan
gonna spend my day in a big tough way"
Adam & the Ants - "5 Guns West", Prince Charming 1981
Visit my home page: http://www.geocities.com/ulrikm



Jonas Swiatek (26-02-2001)
Kommentar
Fra : Jonas Swiatek


Dato : 26-02-01 23:21

Nej, det giver den samme nullPointerException.

Men fejlen opstår ifølge appletvieweren her: buffer =
bufferImage.getGraphics();

bufferImage er tilsyneladende null... Men hvorfor det?, jeg kalder
createImage på den.
Jeg har prøvet med: bufferImage = createImage(19, 19);
Samme forbandede Exception...

Koden igen:
import java.awt.*;

public class Ship extends Component {
Image shipGraphics;

Image bufferImage;
Graphics buffer;

public Ship(Image shipGfx) {
shipGraphics = shipGfx;

bufferImage = createImage(getBounds().width, getBounds().height);
buffer = bufferImage.getGraphics();
}

public void paint(Graphics g) {
buffer.drawImage(shipGraphics, 0, 0, this);
g.drawImage(bufferImage, 0, 0, this);
}

public void update(Graphics g) {
paint(g);
}
}
"Ulrik Magnusson" <ulrikm@yahoo.com> skrev i en meddelelse
news:3A9B1EF8.D701DBF7@yahoo.com...
> > public Ship(Image shipGfx) {
> > shipGraphics = shipGfx;
> >
> > bufferImage = createImage(getBounds().width,
getBounds().height);
> > buffer = bufferImage.getGraphics();
> > }
>
> Dette skulle virke:
>
> public Ship(Image shipGfx) {
> shipGraphics = shipGfx;
> invalidate();
> validate();
> bufferImage = createImage(getBounds().width, getBounds().height);
> buffer = bufferImage.getGraphics();
> }
>
> Problemet er nok at du laver et image som er 0*0 - og det dur ikke..
>
> Ulrik Magnusson
>
> --
> "I'm a big tough man with a big tough plan
> gonna spend my day in a big tough way"
> Adam & the Ants - "5 Guns West", Prince Charming 1981
> Visit my home page: http://www.geocities.com/ulrikm
>
>



N/A (26-02-2001)
Kommentar
Fra : N/A


Dato : 26-02-01 23:08



Jonas Swiatek (26-02-2001)
Kommentar
Fra : Jonas Swiatek


Dato : 26-02-01 23:08

En MediaTracker ?

Hvad skulle den gøre godt for i denne sammenhæng?
Jeg har en MediaTracker som preloader grafiken i init()-metode.

--
Jonas

"stigth" <stigth@stofanet.dk> skrev i en meddelelse
news:j7xm6.266$P35.13265@news101.telia.com...
> Har du prøvet med en MediaTracker?
>
> Stig Tanggaard.
>
> Jonas Swiatek <sxt@get2net.dk> skrev i en
> nyhedsmeddelelse:3a9a904a$0$5732$4d4eb98e@news.dk.uu.net...
> > Kilde koden er:
> > import java.awt.*;
> >
> > public class Ship extends Component {
> > Image shipGraphics;
> >
> > Image bufferImage;
> > Graphics buffer;
> >
> > public Ship(Image shipGfx) {
> > shipGraphics = shipGfx;
> >
> > bufferImage = createImage(getBounds().width,
getBounds().height);
> > buffer = bufferImage.getGraphics();
> > }
> >
> > public void paint(Graphics g) {
> > buffer.drawImage(shipGraphics, 0, 0, this);
> > g.drawImage(bufferImage, 0, 0, this);
> > }
> >
> > public void update(Graphics g) {
> > paint(g);
> > }
> > }
> >
> > Dette komponent bliver tegnet på et java.awt.Panel
> >
> > --
> > Jonas
> >
> > "Lars Dam" <lars_simple_spam_protection_dam@post2.tele.dk> skrev i en
> > meddelelse news:jm7k9tkhhuhgq0ttb0m2angcescfs9ff7n@4ax.com...
> > > On Sun, 25 Feb 2001 22:08:01 +0100, "Jonas Swiatek" <sxt@get2net.dk>
> > > wrote:
> > >
> > >
> > > >Jeg har os prøvet med:
> > > >Image offImage = createImage(getBounds().width, getBounds().height);
> > > >Graphics buffer = offImage.getGraphics();
> > >
> > > Det er helt klart den rigtige løsning hvis du vil undgå flimmer.
> > >
> > > >og så tegne tingene i buffer først, og så paint offImage.
> > > >Men jeg får en nullPointerException. <- HVORFOR DET ?
> > >
> > > Tjae. Det vides ikke, da du ikke fortæller os hvordan den linie du får
> > > en NPE i ser ud? Prøv at poste det eksempel.
> > >
> > > NPE's er et generelt fænomæn og kan som sådan ikke bare lige forklares
> > > væk. Man får NPE, når man arbejder med en reference som peger på null:
> > >
> > > String s = "hello world";
> > > System.out.println( s ); // udskriver 'hello world'
> > > s = null;
> > > System.out.println( s ); // giver en NPE
> > >
> > > Så i den linie du får NPE refererer du altså til null, og ikke en
> > > instans af et objekt.
> > >
> > > >Håber nogle kan hjælpe.
> > >
> > > vh. ld
> > > --
> > > "Time is the fire in which we burn"
> >
> >
>
>



Lars Dam (27-02-2001)
Kommentar
Fra : Lars Dam


Dato : 27-02-01 10:22

On Mon, 26 Feb 2001 18:20:08 +0100, "Jonas Swiatek" <sxt@get2net.dk>
wrote:

>Kilde koden er:
>import java.awt.*;
>
>public class Ship extends Component {
> Image shipGraphics;
>
> Image bufferImage;
> Graphics buffer;
>
> public Ship(Image shipGfx) {
> shipGraphics = shipGfx;
>
> bufferImage = createImage(getBounds().width, getBounds().height);

//sikrer at imaget er loadet
Toolkit.getDefaultToolkit().prepareImage( bufferImage,-1,-1,null );

> buffer = bufferImage.getGraphics();
> }
>
> public void paint(Graphics g) {
> buffer.drawImage(shipGraphics, 0, 0, this);
> g.drawImage(bufferImage, 0, 0, this);
> }
>
> public void update(Graphics g) {
> paint(g);
> }
>}
>
>Dette komponent bliver tegnet på et java.awt.Panel

Dit image bliver loaded asynkront med din kodeafvikling. Så
ovenstående linie afventer at billedet er loadet inden det bliver
brugt.

Hvis det ikke hjælper så load billedet med flg.:

bufferImage = Toolkit.getDefaultToolkit().getImage( "blah.gif" );
Toolkit.getDefaultToolkit().prepareImage( bufferImage,-1,-1,null );

vh. ld

--
"Time is the fire in which we burn"

Jonas Swiatek (27-02-2001)
Kommentar
Fra : Jonas Swiatek


Dato : 27-02-01 12:00

public Ship(Image shipGfx) {
shipGraphics = shipGfx;

bufferImage = createImage(getBounds().width, getBounds().height);
Toolkit.getDefaultToolkit().prepareImage(bufferImage, -1, -1,null);
buffer = bufferImage.getGraphics();
}

Giver stadig en NullPointerExcepion...

public Ship(Image shipGfx) {
shipGraphics = shipGfx;

bufferImage = createImage(getBounds().width, getBounds().height);
bufferImage = Toolkit.getDefaultToolkit().getImage("blah.gif");
Toolkit.getDefaultToolkit().prepareImage(bufferImage, -1, -1,null);
buffer = bufferImage.getGraphics();
}

Giver en IO securityException. Formenlig fordi den ikke kan finde billedet.
Jeg har prøvet at placerer det i samme mappe som clasl-filen. Men det ændre
ingenting.

--
Jonas

"Lars Dam" <lars_simple_spam_protection_dam@post2.tele.dk> skrev i en
meddelelse news:n9sm9t4vqmdkvf2belchhrgm0ojhrlrqdl@4ax.com...
> On Mon, 26 Feb 2001 18:20:08 +0100, "Jonas Swiatek" <sxt@get2net.dk>
> wrote:
>
> >Kilde koden er:
> >import java.awt.*;
> >
> >public class Ship extends Component {
> > Image shipGraphics;
> >
> > Image bufferImage;
> > Graphics buffer;
> >
> > public Ship(Image shipGfx) {
> > shipGraphics = shipGfx;
> >
> > bufferImage = createImage(getBounds().width, getBounds().height);
>
> file://sikrer at imaget er loadet
> Toolkit.getDefaultToolkit().prepareImage( bufferImage,-1,-1,null );
>
> > buffer = bufferImage.getGraphics();
> > }
> >
> > public void paint(Graphics g) {
> > buffer.drawImage(shipGraphics, 0, 0, this);
> > g.drawImage(bufferImage, 0, 0, this);
> > }
> >
> > public void update(Graphics g) {
> > paint(g);
> > }
> >}
> >
> >Dette komponent bliver tegnet på et java.awt.Panel
>
> Dit image bliver loaded asynkront med din kodeafvikling. Så
> ovenstående linie afventer at billedet er loadet inden det bliver
> brugt.
>
> Hvis det ikke hjælper så load billedet med flg.:
>
> bufferImage = Toolkit.getDefaultToolkit().getImage( "blah.gif" );
> Toolkit.getDefaultToolkit().prepareImage( bufferImage,-1,-1,null );
>
> vh. ld
>
> --
> "Time is the fire in which we burn"



Lars Dam (27-02-2001)
Kommentar
Fra : Lars Dam


Dato : 27-02-01 12:52

On Tue, 27 Feb 2001 12:00:20 +0100, "Jonas Swiatek" <sxt@get2net.dk>
wrote:

Så er løsningen her. Istedet for at svare ud i det blå, så har jeg
lige testet lidt også

> public Ship(Image shipGfx) {
> shipGraphics = shipGfx;
>
> bufferImage = createImage(getBounds().width, getBounds().height);
> Toolkit.getDefaultToolkit().prepareImage(bufferImage, -1, -1,null);
> buffer = bufferImage.getGraphics();
> }
>
>Giver stadig en NullPointerExcepion...

Det gør det fordi du kalder createImage i din konstruktør. Din
components peer er ikke blevet lavet endnu, og derfor returnerer
createImage null.

'peer'en bliver lavet når din komponent bliver addet til en anden
komponent. Så du kan først udføre disse to linier med success, når din
komponent er added:

bufferImage = createImage(getBounds().width, getBounds().height);
buffer = (bufferImage!=null ? bufferImage.getGraphics() : null );

Du skal selvfølgeligt fjerne de to linier fra din konstruktør. Husk
også lige på at din offscreen buffer skal have den korrekte størrelse
(magen til din komponents), så det ville måske være smartest at du
lavede din buffer i hver resize event der måtte komme.

Læg mærke til at jeg tager højde for null, der hvor buffer får tildelt
sin værdi. Dette skal du også gøre i din paint() event, så du ikke får
NPE'er der

> public Ship(Image shipGfx) {
> shipGraphics = shipGfx;
>
> bufferImage = createImage(getBounds().width, getBounds().height);
> bufferImage = Toolkit.getDefaultToolkit().getImage("blah.gif");
> Toolkit.getDefaultToolkit().prepareImage(bufferImage, -1, -1,null);
> buffer = bufferImage.getGraphics();
> }
>
>Giver en IO securityException. Formenlig fordi den ikke kan finde billedet.
>Jeg har prøvet at placerer det i samme mappe som clasl-filen. Men det ændre
>ingenting.

Det er nok ikke nødvendigt at kalde prepareImage alligevel her, så du
slipper for den exception.

vh. ld

--
"Time is the fire in which we burn"

Jonas Swiatek (27-02-2001)
Kommentar
Fra : Jonas Swiatek


Dato : 27-02-01 18:47

Njah, det virker delvist.

Jeg poster lige en DEL kilde kode... Tilgiv mig dette

Min pain lige nu er, at hvis jeg IKKE adder space, så flimre den ikke...
Rart nok :)
Men, hvis space ER added - hvilket den skal være, så flimre den stadig lige
så flittigt rundt på skærmen.
Jeg flytter den ved at kalde:
ship.setLocation(ship.getBounds().x + 1, ship.getBounds().y +1); i en
thread. - denne kode har jeg klippet fra i dette eksempel.

Jeg er glad for at du/i gidder hjælpe mig

-- Snip -
public class gameBoard extends Panel {
Ship ship;
Space space;

Image ship_Gfx;
Image space_bg;
Image load_bg;

public gameBoard(Image shipGra, Image spaceGra) {
setLayout(null);
setName("gameBoard");
setBackground(java.awt.Color.black);

ship_Gfx = shipGra;
space_bg = spaceGra;

ship = new Ship(ship_Gfx);
ship.setBounds(50,50,19,19);
add(ship);

space = new Space(space_bg);
space.setBounds(0,0,570,520);
add(space);
}

public void paint(Graphics g) {
super.paint(g);
}

public void update(Graphics g) {
paint(g);
}
}

--

import java.awt.*;

public class Ship extends Component {
Image shipGraphics;

Image bufferImage;
Graphics buffer;

public Ship(Image shipGfx) {
shipGraphics = shipGfx;
}

public void createBuffer() {
bufferImage = createImage(getBounds().width, getBounds().height);
buffer = bufferImage.getGraphics();
}

public void paint(Graphics g) {
if(bufferImage == null) {
createBuffer();
System.out.println("Buffer created");
}

buffer.drawImage(shipGraphics, 0, 0, this);
g.drawImage(bufferImage, 0, 0, this);
}

public void update(Graphics g) {
paint(g);
}
}

--

import java.awt.*;
import java.awt.event.*;

public class Space extends Component {
Image background;

Image bufferImage;
Graphics buffer;

public Space(Image space_bg) {
background = space_bg;
}

public void createBuffer() {
bufferImage = createImage(getBounds().width, getBounds().height);
buffer = bufferImage.getGraphics();
}

public void paint(Graphics g) {
if(bufferImage == null) {
createBuffer();
System.out.println("Buffer created");
}

buffer.drawImage(background, 0, 0, this);

g.drawImage(bufferImage,0,0,this);
}

public void update(Graphics g) {
paint(g);
}
}



Lars Dam (28-02-2001)
Kommentar
Fra : Lars Dam


Dato : 28-02-01 13:21

On Tue, 27 Feb 2001 18:46:30 +0100, "Jonas Swiatek" <sxt@get2net.dk>
wrote:

>Njah, det virker delvist.
>
>Jeg poster lige en DEL kilde kode... Tilgiv mig dette
>
>Min pain lige nu er, at hvis jeg IKKE adder space, så flimre den ikke...
>Rart nok :)
>Men, hvis space ER added - hvilket den skal være, så flimre den stadig lige
>så flittigt rundt på skærmen.
>Jeg flytter den ved at kalde:
>ship.setLocation(ship.getBounds().x + 1, ship.getBounds().y +1); i en
>thread. - denne kode har jeg klippet fra i dette eksempel.
>
>Jeg er glad for at du/i gidder hjælpe mig

Jeg har på fornemmelsen at det er fordi du bruger overlappede
komponenter, og da du bruger double buffering på begge, så er det nok
der det går galt.

Jeg tror at det bedste ville være at du kun har _een_ 'skærm', hvorpå
du så painter begge dine images.

E.g.:

class space extends Component{
// har et baggrunds billede
// har andre billede som skal på (ships etc)

public void paint( Graphics g ){
// tegn på double buffer
buffer.paint( baggrund );
buffer.paint( skibe );
//tegn double buffer
g.paint( buffer );
}
}


Dette betyder at dine skibe _ikke_ skal være komponenter som skal
addes, men at de skal ligge som images i din 'space' component.

Din space component skal så være ansvarlig for at alle elementer på
spillefladen tegnes.

vh. ld
--
"Time is the fire in which we burn"

Jonas Swiatek (01-03-2001)
Kommentar
Fra : Jonas Swiatek


Dato : 01-03-01 10:48

Allrighty, den prøver jeg lige...

--
Jonas
"Lars Dam" <lars_simple_spam_protection_dam@post2.tele.dk> skrev i en
meddelelse news:80rp9tkvaajlibormk4qfv8jt0v075fanp@4ax.com...
> On Tue, 27 Feb 2001 18:46:30 +0100, "Jonas Swiatek" <sxt@get2net.dk>
> wrote:
>
> >Njah, det virker delvist.
> >
> >Jeg poster lige en DEL kilde kode... Tilgiv mig dette
> >
> >Min pain lige nu er, at hvis jeg IKKE adder space, så flimre den ikke...
> >Rart nok :)
> >Men, hvis space ER added - hvilket den skal være, så flimre den stadig
lige
> >så flittigt rundt på skærmen.
> >Jeg flytter den ved at kalde:
> >ship.setLocation(ship.getBounds().x + 1, ship.getBounds().y +1); i en
> >thread. - denne kode har jeg klippet fra i dette eksempel.
> >
> >Jeg er glad for at du/i gidder hjælpe mig
>
> Jeg har på fornemmelsen at det er fordi du bruger overlappede
> komponenter, og da du bruger double buffering på begge, så er det nok
> der det går galt.
>
> Jeg tror at det bedste ville være at du kun har _een_ 'skærm', hvorpå
> du så painter begge dine images.
>
> E.g.:
>
> class space extends Component{
> // har et baggrunds billede
> // har andre billede som skal på (ships etc)
>
> public void paint( Graphics g ){
> // tegn på double buffer
> buffer.paint( baggrund );
> buffer.paint( skibe );
> file://tegn double buffer
> g.paint( buffer );
> }
> }
>
>
> Dette betyder at dine skibe _ikke_ skal være komponenter som skal
> addes, men at de skal ligge som images i din 'space' component.
>
> Din space component skal så være ansvarlig for at alle elementer på
> spillefladen tegnes.
>
> vh. ld
> --
> "Time is the fire in which we burn"



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408941
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste