0

剪切代码:这是代码,我无法摆脱渲染 tank2 的行,当我切换正在向该服务器发送数据的客户端时它工作正常。这是我正在制作的游戏的服务器端:-

package dataEx;

import java.applet.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;

import javax.imageio.ImageIO;


public class test extends Applet implements Runnable, ActionListener,MouseListener, MouseMotionListener,Serializable 
{

    dataToExchange xc;

    public static Image makeColorTransparent(Image im, final Color color) 
          {
            ImageFilter filter = new RGBImageFilter() 
            {

                  public int markerRGB = color.getRGB() | 0xFF000000;               //color to make transparent

                  public final int filterRGB(int x, int y, int rgb) 
                  {
                    if ( ( rgb | 0xFF000000 ) == markerRGB ) 
                    {
                      // Mark the alpha bits as zero - transparent
                      return 0x00FFFFFF & rgb;
                    }

                    else 
                    {
                      // nothing to do
                      return rgb;
                    }
                 }
            }; 

         ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
         return Toolkit.getDefaultToolkit().createImage(ip);

    }

    private Image dbImage;
    private Graphics dbg;

    ServerSocket server;
    Socket connection;

    dataToExchange data_recv=null;  
    Thread t;


    int frameNumber=0;  
    int speed=5,block_front=0,block_end=0;
    int fire=0,tankSpeed=0,pressing=0;
    int topnose_x1,topnose_x2,topnose_y1,topnose_y2;
    int bck_x=-500;
    int init_x=500,tank_y=500;
    int hand_x,hand_y,mouth_x,mouth_y;
    double theta =0.785,angle;
    int moveWithBck=0,glass_x=500;
    Boolean shoot=false;

    Image cannon[]=new Image[6];
    Image glass,glass_t;    
    Image background;

    //String[] tankSeq=new String[6];

    ObjectInputStream input;
    ObjectOutputStream output;



    public void init()
    {   
        setCursor (Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        try
        {
            connect();
        } catch (ClassNotFoundException e) {

            e.printStackTrace();
        }

          setSize(1350,640);
          setBackground( Color.white);  



          cannon[0]=getImage (getCodeBase (), "1.png");
          cannon[1]=getImage (getCodeBase (), "2.png");
          cannon[2]=getImage (getCodeBase (), "3.png");
          cannon[3]=getImage (getCodeBase (), "4.png");
          cannon[4]=getImage (getCodeBase (), "5.png");
          cannon[5]=getImage (getCodeBase (), "6.png");




          glass = getImage (getCodeBase (), "glass.png");
          glass_t = makeColorTransparent(glass, Color.red);


          background = getImage (getCodeBase (), "wall2.jpg");



    }

    private void connect() throws ClassNotFoundException
    {
        int portNumber=1232;
        server = null;
        try 
        {
            server=new ServerSocket(portNumber,1);

        while(true)
        {
            System.out.println("wainting for clients");
            connection=server.accept();


            input=new ObjectInputStream(connection.getInputStream()); 
            output= new ObjectOutputStream(connection.getOutputStream());



            String message=(String)input.readObject();
            System.out.println("message "+message);     
            break;          
        }   

        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    public void start()
    {       
        Thread t = null;
        t = new Thread( this );
        t.start();
        try {
            SendTheChange();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }  


    public void update (Graphics g)                                             //overriding the update for double buffering
    {       
        // initialize buffer
        dbImage = createImage (this.getSize().width, this.getSize().height);
        dbg = dbImage.getGraphics ();


        // clear screen in background
        dbg.setColor (getBackground());
        dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);


        // draw elements in background
        dbg.setColor (getForeground());
        paint (dbg);

        // draw image on the screen
        g.drawImage (dbImage, 0, 0, this);      
    }




    void drawTank(Graphics g) throws MalformedURLException, IOException 
    {
        int tank_x=tankSpeed+init_x;


        if(frameNumber<5)
        {
            if(pressing==1)
                frameNumber=frameNumber+1;          
        }
        else
            frameNumber=0;


        Image tank= ImageIO.read(new URL(getCodeBase(), "1.png"));  
        Image  tank2 = makeColorTransparent(tank, new Color(0).white);               

        **g.drawImage (tank2, tank_x,tank_y, this)**; //I just cant get rid of this line        


        g.drawImage (cannon[frameNumber], tank_x,tank_y, this);

        topnose_x1=tank_x+100;
        topnose_x2=tank_x+150;
        topnose_y1= tank_y+65;
        topnose_y2=tank_y+50;


        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(7));


        double base,height;


        base=hand_x-topnose_x1;
        height=topnose_y1-hand_y;



        if(base<2)  
        {
            base=2;
        }

        if(height<4)    
        {
            height=4;
        }

        double tantheta=height/base;

        theta=-Math.atan(tantheta);

        topnose_x2=(int) (53*Math.cos(theta)+topnose_x1);
        topnose_y2=(int) (53*Math.sin(theta)+topnose_y1);   



        g2.drawLine(topnose_x1,topnose_y1 , topnose_x2, topnose_y2);        
        g2.drawLine(topnose_x1+5,topnose_y1+4 , topnose_x2+2, topnose_y2+1);        
        g2.drawLine(topnose_x1+10, topnose_y1+5, topnose_x2+4, topnose_y2+2);
        pressing=0;     
    }

    void drawBackground(Graphics g)
    {

        g.drawImage (background,bck_x,0, this);
    }




    public void paint( Graphics g)      
    {           
        drawBackground(g);      

        try {

            drawTank(g);



            } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   


    }

    public void run()
    {       
        while (true)
        {
            try {
                recieveChanges();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }{
            // repaint the applet
            repaint();

            try
            {
                Thread.sleep (20);
            }
            catch (InterruptedException ex)
            {

            }

            }
        }
    }


    private void recieveChanges() throws IOException, ClassNotFoundException 
    {           
        data_recv=(dataToExchange)input.readObject();
        //System.out.println("ds"+data_recv.xOffsetTank);   
    }
    int checkBckRange()
    {
        int p_bck_x = 0;

        if(bck_x<0)
        {
            p_bck_x=bck_x*-1;
            block_front=0;
        }
        else
        {
            block_front=1;
        }
        //if(bck_x+bck_length>)

        return p_bck_x;

    }
    private void SendTheChange() throws IOException 
    {

        dataToExchange data=new dataToExchange() ;


        int p_bck_x=checkBckRange();

        int offset=p_bck_x+init_x;


        data.frameIndex=frameNumber;
        data.xOffsetTank=offset;

        output.writeObject(data);       
        output.flush();     
    }

    public boolean mouseMove (Event e, int x, int y)
    {
        hand_x=x;
        hand_y=y;       


        return false;   
    }

     public boolean mouseDrag (Event e, int x, int y)
     {


        hand_x=x;
        hand_y=y;       

        return false; 

     }
     public boolean mouseDown (Event e, int x, int y) 
     {
         if(shoot==false)
         {
             shoot=true;
             mouth_x=topnose_x1;
             mouth_y=topnose_y1-2;
             moveWithBck=0;
             angle=-theta;
             //System.out.println(x+"     "+y+"\n");
         }
         return true;
     }


    public boolean keyDown(Event e, int key) 
    {
        // user presses left cursor key


            if (key == 'a'&& block_front==0)
            {       

                bck_x=bck_x+speed;  
                moveWithBck=moveWithBck+speed;
                pressing=1;
            }
            // user presses right cursor key 
            else if (key == 'd')
            {       
                bck_x=bck_x-speed;
                moveWithBck=moveWithBck-speed;
                pressing=1;
            }
            else if (key == 'w')
            {       
                tank_y=tank_y-200;
            }

            else if (key == 's')
            {       
                tank_y=tank_y-200;
            }

        try {
            SendTheChange();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


        return true;
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }



}
4

1 回答 1

0

在我看来,在绘画方法中这样做是一个非常糟糕的主意:

tank= ImageIO.read(new URL(getCodeBase(), "1.png"));

当您的小程序启动时,您应该这样做一次。我想知道它是否只是把所有时间都花在阅读图像上......

于 2012-04-05T08:08:46.853 回答