2016-04-13 13 views
1

Javaアプレットで移動するトラックの連続アニメーションを作成したいと考えています。このトラックでは、トラックが消えるとすぐに反対側からトラックが再び現れるはずです。 私は1台のトラックを使ってみましたが、一方の側から完全に消えた後にのみ他方の側に現れます。したがって、私は2つを使用しました。続きJavaアプレットを使用した連続アニメーション

は私のコードです:

public class prc1 extends Applet implements Runnable{ 
Thread t; 
int x=0; 
int y=0; 
int i; 
public void start(){ 
    t = new Thread(this); 
    t.start(); 
} 
public void paint(Graphics g){ 
    g.setColor(Color.gray); 
    g.fillRect(x,10,70,45); 
    g.setColor(Color.yellow); 
    g.fillRoundRect(50+x,15,35,35,10,10); 
    g.setColor(Color.black); 
    g.fillArc(5+x,50,10,10,0,360); 
    g.fillArc(55+x,50,10,10,0,360); 

    g.setColor(Color.gray); 
    g.fillRect(y,10,70,45); 
    g.setColor(Color.yellow); 
    g.fillRoundRect(50+y,15,35,35,10,10); 
    g.setColor(Color.black); 
    g.fillArc(5+y,50,10,10,0,360); 
    g.fillArc(55+y,50,10,10,0,360); 
} 
public void run(){ 
    try{ 
     y=-90; 
     x=0;  
     for(; ;){ 
      Thread.sleep(100); 
      repaint(); 
      run(); 
      x=x+5; 
      if(x==400){ 
       for(; ;){ 
        y=y+5; 
        Thread.sleep(100); 
        repaint(); 
        run(); 
        x=x-5; 
        if(x==0){ 
         y=-90;  
         break; 
        } 
       } 
      } 

     } 
    }catch(InterruptedException e){ } 
    } 
} 

今の問題は、トラックが全く動かないということです。

+3

アプレットは、長時間のライブHTMLです。 [Java Plug-in support deprecated](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/)と[プラグインフリーWebへの移行](https:///blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free)と[CS教師がJavaアプレットの教授をやめるべき理由](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-java-applets /) – MadProgrammer

+0

'repaint()'の代わりに 'paint()'を使ってみましたか?あなたが本当に変更する場合、変数 'x'と' y'をコンソールに出力しようとしましたか? –

+0

ノンスイングスレッドから作業する場合、スイングスレッドの慣行を気にしないでください – Ferrybig

答えて

1

基本的な考え方は、トラックが表示可能領域から離れるときを決定し、次にオーバーフローの量を計算する必要があります。これにより、新しい位置にトラックを2回塗りつぶすことができますオーバーフローから。

コードを壊してTruckが自分のクラスであるため、処理が簡単になり、ペイントプロセスを少しだけ制御できます。

​​3210

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private Truck truck; 

     public TestPane() { 
      truck = new Truck(); 
      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        truck.update(getSize()); 
        repaint(); 
       } 
      }); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      truck.paint(g2d); 
      g2d.dispose(); 
     } 

    } 

    public class Truck { 

     private int x, y; 
     // I had to calculate these 
     private int width = 85; 
     private int height = 65; 

     private int xDelta = 4; 

     private int xOverFlow = 0; 

     public void update(Dimension bounds) { 
      x += xDelta; 
      if (x > bounds.width) { 
       x = 0; 
      } 

      if (x + width > bounds.width) { 
       xOverFlow = (x + width) - bounds.width; 
      } else { 
       xOverFlow = -1; 
      } 
     } 

     public void paint(Graphics2D g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.translate(x, y); 
      paintTruck(g2d); 
      g2d.dispose(); 

      if (xOverFlow > 0) { 
       g2d = (Graphics2D) g.create(); 
       g2d.translate(xOverFlow - width, y); 
       paintTruck(g2d); 
       g2d.dispose(); 
      } 
     } 

     protected void paintTruck(Graphics2D g2d) { 
      g2d.setColor(Color.gray); 
      g2d.fillRect(0, 10, 70, 45); 
      g2d.setColor(Color.yellow); 
      g2d.fillRoundRect(50, 15, 35, 35, 10, 10); 
      g2d.setColor(Color.black); 
      g2d.fillArc(5, 50, 10, 10, 0, 360); 
      g2d.fillArc(55, 50, 10, 10, 0, 360); 

      g2d.setColor(Color.gray); 
      g2d.fillRect(0, 10, 70, 45); 
      g2d.setColor(Color.yellow); 
      g2d.fillRoundRect(50, 15, 35, 35, 10, 10); 
      g2d.setColor(Color.black); 
      g2d.fillArc(5, 50, 10, 10, 0, 360); 
      g2d.fillArc(55, 50, 10, 10, 0, 360); 
     } 
    } 

} 

別のオプションは、第1には、あなたが例えば、別の1

を作成することができます閲覧を残すために開始されますように、トラックの複数のインスタンスを持っているかもしれません...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private List<Truck> trucks; 

     public TestPane() { 
      trucks = new ArrayList<>(2); 
      trucks.add(new Truck()); 
      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Truck[] truckArray = trucks.toArray(new Truck[trucks.size()]); 
        for (Truck truck : truckArray) { 
         truck.update(getSize()); 
         if (truck.getX() > getWidth()) { 
          trucks.remove(truck); 
         } else if (truck.getX() + truck.getWidth() > getWidth() && trucks.size() == 1) { 
          trucks.add(new Truck()); 
         } 
        } 
        repaint(); 
       } 
      }); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (Truck truck : trucks) { 
       truck.paint(g2d); 
      } 
      g2d.dispose(); 
     } 

    } 

    public class Truck { 

     // I had to calculate these 
     private int width = 85; 
     private int height = 65; 

     private int x = -width; 
     private int y; 

     private int xDelta = 4; 

     public void update(Dimension bounds) { 
      x += xDelta; 
     } 

     public int getX() { 
      return x; 
     } 

     public int getY() { 
      return y; 
     } 

     public int getWidth() { 
      return width; 
     } 

     public int getHeight() { 
      return height; 
     } 

     public void paint(Graphics2D g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.translate(x, y); 
      paintTruck(g2d); 
      g2d.dispose(); 
     } 

     protected void paintTruck(Graphics2D g2d) { 
      g2d.setColor(Color.gray); 
      g2d.fillRect(0, 10, 70, 45); 
      g2d.setColor(Color.yellow); 
      g2d.fillRoundRect(50, 15, 35, 35, 10, 10); 
      g2d.setColor(Color.black); 
      g2d.fillArc(5, 50, 10, 10, 0, 360); 
      g2d.fillArc(55, 50, 10, 10, 0, 360); 

      g2d.setColor(Color.gray); 
      g2d.fillRect(0, 10, 70, 45); 
      g2d.setColor(Color.yellow); 
      g2d.fillRoundRect(50, 15, 35, 35, 10, 10); 
      g2d.setColor(Color.black); 
      g2d.fillArc(5, 50, 10, 10, 0, 360); 
      g2d.fillArc(55, 50, 10, 10, 0, 360); 
     } 
    } 

} 
+0

返信いただきありがとうございますが、私はちょうどより単純なバージョン(jpanelまたはスイングなし)が欲しいです。私の既存のコードに何らかの変更を提案し、私のコードのバグを見つけてください。 – user3382203

+0

まあ、基本的な解決策は、トラックベースのクラスを使用して、それを使用して、率直に言って、あなたは私のコードはちょうど私を怖がらせる。アプレットはもはやサポートされておらず、AWTの有効期限は16年以上であることに注意する必要があります。そのためにも、サポートは得られません。 – MadProgrammer

関連する問題