Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем вызывать super.paint(g) в Апплете, super.paint(g) 
V
    Опции темы
invis87
Дата 31.3.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 1.11.2007
Где: город Королёв

Репутация: нет
Всего: нет



Задался вопросом, пришлось погуглить и нарвался вот на такую вещь:
Код

import javax.swing.JApplet;
import java.awt.Graphics;

public class ShapesApplet extends JApplet
{
  public void paint( Graphics g )
  {
    super.paint( g );
    g.drawRect( 900, 40, 30, 900 );
    g.fillRect( 200, 70, 80, 80 ); 
    g.fillOval( 100, 50, 40, 100 ); 
    g.drawOval( 100, 200, 100, 40 ); 
    int X = 250, Y = 225;
    int r = 25;
   g.drawOval( X - r, Y - r, r * 2, r * 2 ); 
 }
}

Зачем тут super.paint( g ); ???
Насколько я понимаю эта строка вызывает метод, в котором она же и находится, но зачем ???



А вообще я просто для себя решил написать змейку и никак не пойму куда мне впихнуть Snake.step и Snake.paint(Graphics g), которые должны вызываться каждые пол секунды на протяжении всего выполнения апплета. Пытался создать внутренний поток в JApplet.paint(Graphics g), и в этом потоке написал:
Код

for(;;){
  snake.step;
  snake.paint(g);
}

Апплет рисовал змейку, всё было чётко, но он ни на что не реагировал и выключить можно было только через ctrl+alt+del, в принципе понятно почему. Но куда впихнуть эти два метода я так и не догадался, сидел кучу времени эксперементировал :(
Люди с опытом - подскажите, пожалуйста.

PM MAIL   Вверх
goodday1941
Дата 31.3.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: нет
Всего: 9



метод paint в классе ShapesApplet - есть переопредление метода paint в классе JApplet
Код

super.paint( g );
 - вызывает метод paint суперкласса, в Вашем случае это JApplet

ps... советую почитать что то по поводу ООП, тогда все прояснится
pss... по поводу змейки ничего сказать не могу, так как кода не достаточно, но на вскидку ваш блок
Код

for(;;){
  snake.step;
  snake.paint(g);
}

должен выполнятся в отдельном потоке
что то по типу

Код

final snake ...
new Thread(){
public void run(){
for(;;){
  snake.step;
  snake.paint(g);
try{
sleep(500);
}catch(Exception e){
}
}
}
}.start();



--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
invis87
Дата 31.3.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 1.11.2007
Где: город Королёв

Репутация: нет
Всего: нет



Код

public class Snake {
    /**
     * Ширина и высота одной части змеи
     */
    private final int part = 6;
    /**
     * Текущие координаты.
     */
    private int x=200,y=225;
    /**
     * Кол-во точек хвоста змейки.
     */
    private int xvoctov = 2;
    /**
     * Координата для рисования хвоста
     */
    private int x_xv,y_xv;
    /**
     * Конструктор, создаёт змейку в заданном положении, желательно центре,
     * имеющую 2 клетки, кроме головы.
     * @param x
     * @param y
     */
    Snake(){
    }

    /**
     * Рисование змеи.
     * @param g
     */
    protected void paint(Graphics g){
        g.setColor(Color.green); //змейка изначально зелёная
        g.fillRect(x-part/2, y-part/2, part, part); //рисуем голову
    }

    protected void step(Direction d){
        switch(d.getNOW()){
            case Direction.UP:
                y -= 5;break;
            case Direction.DOWN:
                y += 5;break;
            case Direction.LEFT:
                x -= 5;break;
            case Direction.RIGHT:
                x += 5;break;
        }
    }
}


Код

public class Direction {
    protected static final byte UP=0, DOWN=1, LEFT=3, RIGHT=2;
    /**
     * текущее направление
     */
    private byte NOW;
    /**
     * Конструктор, первоначально змея смотрит вверх.
     */
    public Direction(){
        NOW=UP;
    }
    /**
     * Поворачивает змею.
     * @param WHERE куда повернуть
     */
    public void turn(byte WHERE){
        if(NOW!=WHERE ||
          (NOW==UP && WHERE!=DOWN) ||
          (NOW==LEFT && WHERE!=RIGHT) ||
          (NOW==DOWN && WHERE!=UP) ||
          (NOW==RIGHT && WHERE!=LEFT))
            NOW=WHERE;
    }
    
    public byte getNOW(){
        return NOW;
    }
}


Код


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class Game extends JApplet{
    private Direction direction = new Direction();
    Graphics g;
    
    @Override
    public void init(){
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
        JButton jb = new JButton("Start");
        jb.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                class MainThread implements Runnable{
                    Thread t = Thread.currentThread();

                    public void run() {
                        Snake our_snake = new Snake(g);
                        try {
                            t.sleep(500);
                        } catch (InterruptedException ex){}
                        our_snake.step(direction);
                        our_snake.paint(g);
                    }
                }
                MainThread main = new MainThread();
                main.run();
            }          
        });
        contentPane.add(jb, BorderLayout.SOUTH);
        addKeyListener(new KeyAdapter(){
            @Override
            public void keyPressed(KeyEvent e) {
               switch(e.getKeyCode()){
                   case KeyEvent.VK_DOWN:
                       direction.turn(Direction.DOWN);break;
                   case KeyEvent.VK_UP:
                       direction.turn(Direction.UP);break;
                   case KeyEvent.VK_LEFT:
                       direction.turn(Direction.LEFT);break;
                   case KeyEvent.VK_RIGHT:
                       direction.turn(Direction.RIGHT);break;
               }
            }
        });
    }

    @Override
    public void paint(Graphics g){

    }
  }


Вот в последнем, главном классе вообще не представляю куда впихнуть
                       our_snake.step(direction);
                       our_snake.paint(g);
И как грамотно Graphics передать. Что только не пробовал уже.


Это сообщение отредактировал(а) invis87 - 1.4.2009, 20:06
PM MAIL   Вверх
invis87
Дата 1.4.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 1.11.2007
Где: город Королёв

Репутация: нет
Всего: нет



Покопавшись в Sun примерах по Graphics2D воде немного разобрался.
во-первых пофиксил небольшой косяк в логике smile
Код

    public void turn(byte WHERE){
        if((NOW==UP && WHERE!=DOWN) ||
           (NOW==LEFT && WHERE!=RIGHT) ||
           (NOW==DOWN && WHERE!=UP) ||
           (NOW==RIGHT && WHERE!=LEFT))
             NOW=WHERE;
    }


А во вторых 
Код


import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class Game extends JApplet implements Runnable{
    private Direction direction = new Direction();
    Snake our_snake = new Snake();
    
    @Override
    public void init(){
        addKeyListener(new KeyAdapter(){
            @Override
            public void keyPressed(KeyEvent e) {
               switch(e.getKeyCode()){
                   case KeyEvent.VK_DOWN:
                       direction.turn(Direction.DOWN);
                       showStatus("DOWN");break;
                   case KeyEvent.VK_UP:
                       direction.turn(Direction.UP);
                       showStatus("UP");break;
                   case KeyEvent.VK_LEFT:
                       direction.turn(Direction.LEFT);
                       showStatus("LEFT");break;
                   case KeyEvent.VK_RIGHT:
                       direction.turn(Direction.RIGHT);
                       showStatus("RIGHT");break;
               }
            }
        });
    }

    @Override
    public void paint(Graphics g){
        our_snake.step(direction);
        our_snake.paint(g);
    }

    public void run() {
        for(;;){
            try {
            Thread.sleep(250);
            } catch (InterruptedException ex) {}
        repaint();
      }
    }

    @Override
    public void start() {
    Thread thread = new Thread(this);
    thread.setPriority(Thread.MIN_PRIORITY);
    thread.start(); // вот из-за этой строки нормально заработало, 
         //хотя почему я так и не понял :( если её удалить то будет рисовать только 
        // первые два квадратика
       // Может кто-нибудь пояснит ???
    }

  }



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Апплеты | Следующая тема »


 




[ Время генерации скрипта: 0.0878 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.