2016-05-19 6 views
0

私は4つのコーナーからイメージが入ってきて、あなたを攻撃しようとするミニゲームを作ろうとしています。しかし、私はイメージが真ん中に向かって前進し始めるように見えることはできません。私のコードは通常1つの画像を印刷し、その後は何もしません。私はイメージを中心に向かって動かしたいと思っていますが、タイマーをループさせてその作業をする方法がわかりません。私は説明があまりよくありませんので、ここにすべてのコードを載せておきます。どのようにタイマーを使用して画像を移動し、タイマーのループを作成しますか?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Game extends JPanel { 
private static int PREF_W = 700; 
private static int PREF_H = PREF_W; 
public int count = 0; 
private int randCount = (int)(Math.random()*3000 + 10000); 
private int randCount1 = (int)(Math.random()*100 + 50); 
private int count1,count2,count3 = 0; 
boolean x = true; 
private static Timer t; 

public Game() { 
    setFocusable(true); 
    requestFocusInWindow(); 

    addKeyListener(new KeyAdapter() { 

    @Override 
    public void keyTyped(KeyEvent e) { 
     myKeyEvt(e, "keyTyped"); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     myKeyEvt(e, "keyReleased"); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     myKeyEvt(e, "keyPressed"); 
    } 

    private void myKeyEvt(KeyEvent e, String text) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_KP_UP || key == KeyEvent.VK_UP) 
     { 
      count = 1; 

      repaint(); 
      //Call some function 
     } 
     if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT) 
     { 
      count =2; 

      repaint(); 
      //Call some function 
     } 
     if (key == KeyEvent.VK_KP_DOWN || key == KeyEvent.VK_DOWN) 
     { 
      count = 3; 

      repaint(); 
      //Call some function 
     } 

     else if (key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_RIGHT) 
     { 
      count = 4; 

      repaint(); 
      //Call some function 
     } 

    } 

    }); 

    t = new Timer(randCount, new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent evt){ 
      if(count1 == 0) 
      { 
       PREF_H = ((PREF_H/15)+randCount1); 
       count2 = 5; 
       System.out.print("dasfasfdsadf"); 
       repaint(count2); 
       count1 += 1; 
       t = new Timer(randCount1,this); 
       if(PREF_H > (PREF_H/2)) 
       { 
        t.stop(); 
       } 

      } 
      else if(count1 == 1) 
      { 
       count2 = 10; 

       System.out.print("dasfasfdsadf"); 
       repaint(count2); 
       count1 = 2; 
       t = new Timer(randCount1,this); 
       count1 = 2; 
       if(PREF_W > (PREF_W/2)) 
       { 
        t.stop(); 
       } 
      } 
      else if(count1 == 2) 
      { 
       count2 = 15; 

       System.out.print("dasfasfdsadf"); 
       repaint(count2); 
       count1 = 3; 
       t = new Timer(randCount1,this); 
       count1 = 3; 
       if(PREF_H > (PREF_H/2)) 
       { 
        t.stop(); 
       } 
      } 
      else if(count1 == 3) 
      { 
       count2 = 20; 

       System.out.print("dasfasfdsadf"); 
       repaint(count2); 
       count1 = 0; 
       t = new Timer(randCount1,this); 
       count1 = 0; 
       if(PREF_W > (PREF_W/2)) 
       { 
        t.stop(); 
       } 
      } 

     } 
    }); 

     Game.start();  

    } 

    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 

public static void start() 
{ 

t.start(); 
System.out.print("ssssssssssssss"); 

    } 

    public void paintComponent(Graphics g) 
      { 
       Image StartScreenImage =  Toolkit.getDefaultToolkit().getImage("GameField.jpg"); 
        g.drawImage(StartScreenImage,0,0,PREF_W,PREF_H,0,0,900,504,this); 

       Color pokemonGreen = new Color(185,235,160); 
       setBackground(pokemonGreen); 

       if(count==3) 
       { 
        Image Player = Toolkit.getDefaultToolkit().getImage("Player.jpg"); 
       g.drawImage(Player,(PREF_W/2),(PREF_H/2),((PREF_W/2)+46),((PREF_H/2)+40),0,0,46,40,this); 


       } 
       if(count == 2) 
       { 
        Image Player2 = Toolkit.getDefaultToolkit().getImage("Player2.jpg"); 
       g.drawImage(Player2,(PREF_W/2),(PREF_H/2),((PREF_W/2)+46),((PREF_H/2)+40),0,0,46,40,this); 

       } 
       if(count == 4) 
       { 
        Image Player4 = Toolkit.getDefaultToolkit().getImage("Player4.jpg"); 
       g.drawImage(Player4,(PREF_W/2),(PREF_H/2),((PREF_W/2)+46),((PREF_H/2)+40),0,0,46,40,this);  
       } 
       if(count == 1) 
       { 
        Image Player3 = Toolkit.getDefaultToolkit().getImage("Player3.jpg"); 
       g.drawImage(Player3,(PREF_W/2),(PREF_H/2),((PREF_W/2)+46),((PREF_H/2)+40),0,0,46,40,this);  
       } 
       if(count2 == 5) 
       { 
         Image Zubat = Toolkit.getDefaultToolkit().getImage("Zubat.jpg"); 
       g.drawImage(Zubat,((PREF_W/2)-27),(PREF_H),this); 
        System.out.print("11111111"); 
        count1 += 1; 
        t.stop(); 
        start(); 
       } 
       if(count2 == 10) 
       { 
         Image Zubat4 = Toolkit.getDefaultToolkit().getImage("Zubat4.jpg"); 
       g.drawImage(Zubat4,((PREF_W/15)+randCount1),((PREF_H/2)),this); 
        System.out.print("22222222222222"); 
        count1 += 1; 
        t.stop(); 
        start(); 

       } 
       if(count2 == 15) 
       { 
         Image Zubat3 = Toolkit.getDefaultToolkit().getImage("Zubat3.jpg"); 
       g.drawImage(Zubat3,((PREF_W/2)+randCount1),((PREF_H/15)),this); 
        System.out.print("3333333333333"); 
        count1 += 1; 
        t.stop(); 
        start(); 

       } 
       if(count2 == 20) 
       { 
         Image Zubat2 = Toolkit.getDefaultToolkit().getImage("Zubat2.jpg"); 
       g.drawImage(Zubat2,((PREF_W/15)-randCount1),((PREF_H/2)),this); 
        System.out.print("44444444444444"); 
        count1=0; 
        t.stop(); 
        start(); 

       } 

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

    private static void createAndShowGui() { 
    Game mainPanel = new Game(); 

    JFrame frame = new JFrame("Dungeon Of Geometry"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(mainPanel); 
    frame.pack(); 
    frame.setLocationByPlatform(true); 
    frame.setVisible(true); 

    } 
    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     createAndShowGui(); 
    } 
    }); 
    } 
    } 
+0

1. paintComponentの最初の行は 'super.paintComponent(g);'でなければなりません。 2.塗装するたびに画像を読み込まないでください!それらをコンストラクタにロードし、フィールドに格納します。ペイントメソッドは、通常、printlnステートメントが示すように、1秒間に数回*呼び出され、ディスクからイメージをロードするのは遅い操作です。詳細は、[AWT and Swingのペイント](http://www.oracle.com/technetwork/java/painting-140037.html)を参照してください。 – VGR

+0

[Timerがデフォルトで繰り返す]ため、これらの新しいTimerオブジェクトはすべてActionListenerを繰り返し呼び出しています(http://docs.oracle.com/javase/8/docs/api/javax/swing/Timer.html#isRepeats-- )。新しいTimerオブジェクトを作成する代わりに、[setDelay](http://docs.oracle.com/javase/8/docs/api/javax/swing/Timer.html#setDelay-int-)をあなたがすでに持っているタイマー。 – VGR

答えて

0

私はこれがあなたが欲しいものに類似していると信じています。 JPanelを作成し、タイマーがメッセージを表示する時間を超えてパネル内に赤い点をランダムに移動します。私の理解では、あなたの主な問題は、予定されている行動を開始しようとしていたことでした、私はこれがそれを行うと信じています。

package bradleyross.experiments; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyListener; 
import java.lang.reflect.InvocationTargetException; 
import java.awt.event.KeyEvent; 
import java.awt.Graphics; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.SwingUtilities; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 
/** 
* This Swing demo creates a JPanel component and randomly 
* moves a red dot within the panel when triggered by a 
* timer. 
* 
* @author Bradley Ross 
* 
*/ 
public class SwingTimer implements Runnable{ 
    protected JFrame mainFrame; 
    protected FlowLayout layout; 
    protected MyPanel panel; 
    protected int xPos = 0; 
    protected int yPos = 0; 
    protected Random random = new Random(); 
    protected Timer timer = new Timer(); 
    public void run() { 
     buildFrame(); 
    } 
    /** 
    * Action listener for this application. 
    * @author Bradley Ross 
    * 
    */ 
    protected class Listener1 implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      System.out.println("Action " + e.getActionCommand()); 
     } 

    } 
    /** 
    * Key listener for this application. 
    * @author Bradley Ross 
    * 
    */ 
    protected class Listener2 implements KeyListener { 
     /** 
     * Action when key event is detected. 
     * @param e key event 
     */ 
     public void keyTyped(KeyEvent e) { 
      System.out.println("Keystroke received " + e.getKeyChar()); 
     } 
     public void keyPressed(KeyEvent e) { ; } 
     public void keyReleased(KeyEvent e) { ; } 

    } 
    /** 
    * This subclass of JPanel repaints the 
    * the dot using {@link SwingTimer#xPos} and 
    * {@link SwingTimer#yPos}. 
    * 
    * @author Bradley Ross 
    * 
    */ 
    @SuppressWarnings("serial") 
    public class MyPanel extends JPanel { 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.fillOval(xPos, yPos, 5, 5); 
     } 
    } 
    /** 
    * Executed each time the timer triggers an event. 
    * 
    * <p>It randomly repositions the dot within the 
    * panel.</p> 
    * @author Bradley Ross 
    * 
    */ 
    public class Motion extends TimerTask { 
     public void run() { 
      xPos = random.nextInt(300); 
      yPos = random.nextInt(300); 
      panel.repaint(); 
     } 
    } 
    public void buildFrame() { 
     xPos = random.nextInt(300); 
     yPos = random.nextInt(300); 
     KeyListener listener2 = new Listener2(); 
     ActionListener listener1 = new Listener1(); 
     mainFrame = new JFrame(); 
     layout = new FlowLayout(FlowLayout.LEADING); 
     mainFrame.setLayout(layout); 
     mainFrame.addKeyListener(listener2); 
     JButton first = new JButton("First"); 
     first.setActionCommand("first"); 
     first.addActionListener(listener1); 
     first.addKeyListener(listener2); 
     first.setFocusable(false); 
     mainFrame.add(first); 
     mainFrame.setFocusable(true); 
     panel = new MyPanel(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     panel.setPreferredSize(new Dimension(300,300)); 
     panel.setForeground(Color.red); 
     panel.addKeyListener(listener2); 
     panel.repaint(); 
     timer.scheduleAtFixedRate(new Motion(), 0 , 2000); 
     mainFrame.add(panel); 
     mainFrame.setSize(500, 500); 
     mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     mainFrame.setVisible(true); 
    } 
    /** 
    * Main driver. 
    * @param args not used in this example 
    */ 
    public static void main(String[] args) { 
     try { 
      SwingUtilities.invokeAndWait(new SwingTimer()); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
関連する問題