Results 1 to 2 of 2

Thread: Help paint problem

  1. #1

    Thread Starter
    Hyperactive Member
    Join Date
    May 2000
    Posts
    367

    Help Gurus or anyone paint problem??

    Hi, I am trying to make a java slider applet, this code seems to work perfectly in netscape and in appletviewer but with ie, i have to resize or move the browser before it will display the whole photo. If you can help me out that would rock.

    I have included the file with this post also in case you dont feel like cut and paste.
    Just rename file to Slider.java instead of .c
    // CODE STARTS HERE

    import java.applet.Applet;
    import java.applet.AudioClip;
    import java.lang.Object;
    import java.awt.*;
    import java.awt.image.*;
    import java.net.*;

    // Slider.java



    public class Slider extends Applet implements Runnable {
    Tile grid[][];
    public static AudioClip clinkSound,introSound,winSound,badSound;
    public boolean intro = true, random = false;
    Dimension GridSize;
    Point blank;
    Thread kicker = null;
    Dimension appletSize;
    int appletHeight;
    int appletWidth;
    Image imgBlock; // the image block
    Image images[][]; // the constituent images
    int num_images = 16; // number of images in block
    int width; // width of each image in block
    int height; // height of each image in block
    int temp;
    boolean first = true;
    MediaTracker track;

    public void init() {
    int x,y,block=1,maxBlocks=16;

    appletSize = this.getSize();
    appletHeight = appletSize.height;
    appletWidth = appletSize.width;

    track = new MediaTracker(this);

    // Set height and width
    GridSize = new Dimension(4,4);
    grid = new Tile[GridSize.height][GridSize.width];

    // Layout the applet

    setLayout(new BorderLayout());
    resize(appletHeight,appletWidth);
    Panel p = new Panel();
    add("South",p);
    p.add(new Button("Randomize"));
    // Load sounds...
    try {
    introSound = getAudioClip(new
    URL(getDocumentBase(),"sound/spacemusics.au"));
    introSound.loop();
    clinkSound = getAudioClip(new URL(getDocumentBase(),"sound/clink.au"));
    winSound = getAudioClip(new
    URL(getDocumentBase(),"sound/laughter.au"));
    badSound = getAudioClip(new URL(getDocumentBase(),"sound/crash.au"));
    } catch ( java.net.MalformedURLException e) {}


    // Load the blocks...
    cut("graphics/clock.jpg");
    for (y=0;y<GridSize.height;y++)
    for (x=0;x<GridSize.width;x++) {
    if ( block < maxBlocks ) {
    grid[y][x] = new Tile(images[x][y],block);
    block++;
    }
    else {
    grid[y][x] = new Tile(null,0);
    blank = new Point(x,y);
    }
    }
    update(this.getGraphics());
    // repaint();

    }

    public boolean action(Event evt, Object arg) {

    if ( arg.equals("Randomize") ) {
    random = true;
    repaint();
    }

    return true;
    }

    private void randomize(Graphics g){

    int i,iter=GridSize.height*GridSize.width*GridSize.width;
    Point from;

    for (i=0; i<iter;i++) {
    if ( Math.random() > 0.5 )
    move(new Point(blank.x,(int)(Math.random() * GridSize.height)));
    else
    move(new Point((int)(Math.random() * GridSize.width),blank.y));

    drawGrid(g);
    }
    }

    public void run() {
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
    while (kicker != null) {
    repaint();
    try {
    Thread.sleep(100);
    } catch (InterruptedException e){}
    }
    }

    private void drawAll() {
    int x,y;

    for (y=0;y<GridSize.height;y++)
    for (x=0;x<GridSize.width;x++)
    grid[y][x].changed = true;

    repaint();
    }

    public void paint(Graphics g) {

    drawAll();

    }

    public void start() {
    if ( kicker == null ) {
    kicker = new Thread(this);
    kicker.start();
    }
    }

    public void stop() {
    if ( intro )
    introSound.stop();
    kicker = null;
    }

    public void update(Graphics g) {

    if ( random )
    randomize(g);
    else{
    drawGrid(g);
    }
    random = false;
    }

    private void drawGrid(Graphics g) {
    int x,y;

    // Only draw blocks that have changed to improve display speed.

    for (y=0;y<GridSize.height;y++)
    for (x=0;x<GridSize.width;x++) {
    if ( grid[y][x].changed ) {
    if ( grid[y][x].number != 0 )
    g.drawImage(grid[y][x].img,x*width,y*height,this);
    else {
    g.clearRect(x*width,y*height,width,height);
    }
    grid[y][x].changed = false;
    }
    }
    }

    private boolean solved() {

    // Return true if the puzzle is solved, otherwise false

    int y,x,block=1,iter = GridSize.height * GridSize.width;
    for (y=0;y<GridSize.height;y++)
    for (x=0;x<GridSize.width;x++)
    if ( block < iter )
    if ( grid[y][x].number != block++ )
    return false;
    return true;
    }

    private int delta(int a,int b) {

    // Return the direction to move the block in

    if ( a == b ) return 0;
    else return((b-a)/Math.abs(b-a));
    }

    public boolean mouseDown(Event evt, int x, int y) {

    // Mouse clicked somewhere

    Point from;

    // Translate to block coordinates

    from = new Point(x/width,y/height);

    // Kill the intro sound if still playing...

    if ( intro )
    introSound.stop();
    intro = false;

    if ( from.x >= GridSize.width || from.y >= GridSize.height )
    return true;

    // If on the same row or column as the blank we can move

    if ( move(from) ) {
    clinkSound.play();

    // Wait for about 250ms so that the sound and the
    // animation appear to be in sync.

    try {
    Thread.sleep(250);
    } catch (InterruptedException e) {}
    repaint();
    if ( solved() )
    winSound.play();
    }
    else
    badSound.play();

    return true;
    }

    private boolean move(Point from) {
    Point to,by;

    by = new Point(delta(from.x,blank.x),delta(from.y,blank.y));

    if ( (by.x == 0 && by.y == 0) || (by.x != 0 && by.y != 0) )
    return false;

    to = new Point(from.x + by.x, from.y + by.y);

    // Try and move, if blocked by another block, move it first...

    if ( grid[to.y][to.x].number != 0 )
    move(to);

    // Move the block and repaint

    grid[to.y][to.x].number = grid[from.y][from.x].number; // to here...
    grid[to.y][to.x].img = grid[from.y][from.x].img;
    grid[to.y][to.x].changed = true;

    grid[from.y][from.x].number = 0; // from here...
    grid[from.y][from.x].img = null;
    grid[from.y][from.x].changed = true;

    blank = from; // blank is now here...
    return true;
    }

    public void cut(String inStr) {
    Image imgBlock = getImage(getCodeBase(), inStr);
    System.out.println(getCodeBase() + "\n" + inStr);
    // wait for image to load
    // (here's how to do it without using MediaTracker)
    //while (imgBlock.getWidth(this) <0);

    track.addImage(imgBlock,0);
    System.out.println("Loading Images");
    //wait for image to finish loading //
    try{
    track.waitForAll();
    } catch (InterruptedException e){}

    // check for errors//
    if(track.isErrorID(0)){
    System.out.println("error");
    }
    else if(track.checkID(0)){
    System.out.println("successfully loaded");
    }

    //define width of each image
    width = imgBlock.getWidth(this);
    temp = width % 4;
    width = width - temp;
    width = width/4;

    // define height of each image
    height = imgBlock.getHeight(this);
    temp = height % 4;
    height = height - temp;
    height = height/4;

    // define array of constituent images
    images = new Image[4][4];

    // extract constituent images
    extractImages(imgBlock,images,num_images,width,height);
    }

    /////////////////////////////////////////////////////////////////
    // Extract the constituent images from a imgBlock.
    // There are num_images to extract, each with the
    // specified width and height.

    public void extractImages(Image imgBlock,
    Image images[][],
    int num_images,
    int width,
    int height) {
    ImageProducer source = imgBlock.getSource();

    for (int i = 0; i<4; i++) {
    for (int j = 0; j<4; j++) {
    // define filter to pull image at (i*width,j*height) with
    // dimensions (width,height)
    ImageFilter extractFilter = new CropImageFilter(i*width,
    j*height,
    width,
    height);

    // define producer from source and filter
    ImageProducer producer =
    new FilteredImageSource(source,extractFilter);

    // extract the subimage!
    images[i][j] = createImage(producer);
    }
    }
    }
    }

    class Tile {
    Image img=null;
    int number=0;
    boolean changed=true;

    public Tile(Image theImage,int i) {

    number = i;
    img = theImage;
    }
    }
    Attached Files Attached Files

  2. #2
    Guest
    Do you have a url where we can see this in action? I'm using version 1.3, so I don't know if I converted the deprecated methods correctly (action, mouseDown). Plus the phony graphics/clock.jpg I used supposedly errors out.

    Also, do you have a suggested height and width? So far, all I get is the button "Randomize" and on the console, I get:

    file:myCodeBase
    graphics/clock.jpg
    Loading Images
    error

    when I try appletviewer.

    From what I understand, the order is repaint, update, paint. But you have paint calling drawAll which calls repaint (which would eventually call paint which calls drawAll). Did you want an infinite loop?

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width