2013-11-17 2 views
0

Я хочу, чтобы объект прокручивался вверх, когда он достигает y pos = 170. тогда, когда он достигнет 51, он снова прокрутится вниз. Вот мой код ..Прокрутить объект, когда он достиг определенной точки

import java.awt.*; 
import java.applet.*; 

public class ani1 extends Applet implements Runnable{ 

    Thread run01; 
    int spacex = 51,spacey = 91; 
    int score = 0; 

    public void start() { 
     if (run01 == null){ 
      run01 = new Thread(this); 
      run01.start(); 
     } 
    } 
    public void stop() { 
     if(run01 != null){ 
      run01 = null; 
     } 
    } 
    public void run() { 
     while(true){ 
      repaint(); 
      try { 
       Thread.sleep(30); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    public void paint(Graphics g){ 
     g.setColor(Color.gray); 
     g.fillRoundRect(35, 70, 250, 300, 10, 250); 
     g.fillRect(230,20,50,50); 
     g.setColor(Color.white); 
     g.fillRoundRect(45,85,230,100,10,250); 
     g.setColor(Color.black); 
     g.drawRect(50, 90, 150, 90); 
     g.drawString("SPACE-X",215,100); 
     g.drawString("Level: 1",210,120); 
     g.drawString("Score : "+ score, 210,135); 
     g.drawString("Life : - - -",210,150); 
     g.fillRect(spacex, spacey, 10, 10); 
     spacey++; 
     if(spacey >170){ 
      spacey--; 
     } 

    } 

} 
+0

Создать модель, которая может контролировать, где объекты расположены. Когда вы рисуете, используйте эту модель, чтобы нарисовать местоположение объекта ... – MadProgrammer

+0

Я просто хочу сделать это петлей. Я на самом деле не делаю игру из этого. просто простая анимация цикла. – CudoX

+0

проблема в том, что когда он идет 169 или 170, он просто останавливается и больше не прокручивается. – CudoX

ответ

1

В принципе, вы должны пытаться моделировать объект, который вы пытаетесь двигаться, даже если это только моделирование Point, которые вы можете использовать, чтобы сделать некоторую произвольную форму.

Это означает, что у вас не возникнет соблазна принять логические решения в процессе рисования. Процесс рисования должен быть ориентирован только на покраску модели.

Например ...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
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 Spacy { 

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

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

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

    public class TestPane extends JPanel { 

     private List<Movable> movables; 

     public TestPane() { 
      movables = new ArrayList<>(25); 
      movables.add(new SpaceObject()); 

      Timer timer; 
      timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        for (Movable m : movables) { 
         m.move(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(); 
      for (Paintable p : movables) { 
       p.paint(g); 
      } 
      g2d.dispose(); 
     } 
    } 

    public interface Paintable { 

     public void paint(Graphics g); 

    } 

    public interface Movable extends Paintable { 

     public void setLocation(Point p); 
     public Point getLocation(); 
     public void move(Dimension size); 

    } 

    public class SpaceObject implements Movable { 

     private Point p; 

     public SpaceObject() { 
      setLocation(new Point(150, 50)); 
     } 

     @Override 
     public void setLocation(Point p) { 
      this.p = p; 
     } 

     @Override 
     public Point getLocation() { 
      return p; 
     } 

     @Override 
     public void paint(Graphics g) { 

      g.setColor(Color.RED); 
      Point p = getLocation(); 
      int radius = 10; 
      g.fillOval(p.x - (radius/2), p.y - (radius/2), radius, radius); 

     } 

     @Override 
     public void move(Dimension size) { 
      Point p = getLocation(); 
      int delatX = 0; 
      int delatY = 0; 
      int gap = size.height/4; 
      if (p.y == gap) { 
       delatX = 2; 
      } else if (p.y == size.height - gap) { 
       delatX = -2; 
      } 
      gap = size.width/4; 
      if (p.x == gap) { 
       delatY = -2; 
      } else if (p.x == size.width - gap) { 
       delatY = 2; 
      } 
      p.x += delatX; 
      p.y += delatY; 

      if (p.x < (size.width/4)) { 
       p.x = size.width/4; 
      } else if (p.x > (size.width - (size.width/4))) { 
       p.x = size.width - (size.width/4); 
      } 
      if (p.y < (size.height/4)) { 
       p.y = size.height/4; 
      } else if (p.y > (size.height - (size.height/4))) { 
       p.y = size.height - (size.height/4); 
      } 

      setLocation(p); 
     }    
    }   
} 

У вас есть две основные проблемы, с вашим кодом.

  1. Вы пытаетесь принять решение о том, как рисовать результат в методе рисования. Как правило, это нецелесообразно. As you ведет к другим вредным привычкам
  2. Вы не обновите контекст Graphics, прежде чем рисовать. В основном, что происходит, вам предоставлен тот же самый Graphics контекст, который вы использовали в последнем цикле краски, а это означает, что когда вы достигнете конца и хотите начать прокрутку назад, то, что вы ранее нарисовали, все еще существует.

Я бы рекомендовал это;

  1. Вы избегаете Applet и использовать JApplet, на самом деле, я бы избежать апплеты вообще и просто использовать JFrame в качестве базового контейнера, они приходят с меньшим количеством проблем.
  2. Создайте пользовательский компонент, основанный на чем-то вроде JPanel, и переопределите его метод paintComponent и выполните свою собственную покраску.
  3. Убедитесь, что вы звоните super.paintComponent первый, так как это подготовит Graphics контекст для вас
  4. Лично я бы избежать использования Thread для этого случая, он вводит дополнительные осложнения, вместо этого, я хотел бы использовать javax.swing.Timer, но это всего лишь я.

Вы хотели бы взглянуть на Performing Custom Painting для более подробной информации

Смежные вопросы