|
| 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"
| |
|
|