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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пауза в игре 
V
    Опции темы
Pawl
Дата 30.10.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

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



Доброго времени суток!
Не так давно написал мидлет «Змейка» (по мотивам моей любимой игры детства smile ). Получилось довольно забавно – с учетом некоторых модификаций, может, попозже выложу. Однако, перед выкладыванием хочу кое-что доработать. В частности, змейка по экрану ползает у меня в отдельном потоке. При нажатии на кнопку “pause” этот поток завершается, а после возобновления игры запускается уже новый поток. А мне бы хотелось, чтобы запускался только один поток движения змейки, который бы корректно приостанавливался и возобновлялся. Я пытался так сделать, но максимум, чего я добился, это IllegalMonitorStateException’a. Был бы очень благодарен за помощь в этом вопросе!
Спасибо!
P. S. Код игры (только основное) выкладываю и прилагаю в архиве.
Мидлет:
Код

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class SnakeMidlet extends MIDlet {

    private Display display = Display.getDisplay(this);
    private Game game;    

    public void startApp() {
        game = new Game(this);
        display.setCurrent(game);        
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
}

Холст
Код

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class Game extends Canvas implements CommandListener {
    public final int width = getWidth(), height = getHeight();
    private static Command exit = new Command("Exit", Command.EXIT, 0);
    private static Command pause = new Command("Pause", Command.SCREEN, 1);
    private MIDlet p;
    private int direction;
    private boolean end, paused;
    private Snake snake;
    private Stack body;
    
    public Game(MIDlet p) {
        this.p = p;
        addCommand(exit);
        addCommand(pause);
        snake = new Snake(height);
        body = snake.getBody();
        new Thread(snakeDrawer).start();
        setCommandListener(this);       
    }

    public void paint(Graphics g) {
        g.setColor(255, 255, 0);
        g.fillRect(0, 0, width, height);    
        for (int i = 0; i < body.size(); i++) {
            Snake.Part part = (Snake.Part)body.elementAt(i);
            g.drawImage(part.getPartImage(), part.getX(), part.getY(), Graphics.VCENTER | Graphics.HCENTER);
        }        
    }

    public void commandAction(Command cmd, Displayable d) {        
        if (cmd == pause) {
            paused = true;
        } else if (cmd == exit) {
            end = true;
            p.notifyDestroyed();
        }
    }

    protected void keyPressed(int keyCode) {
        if (!end) {
            direction = getGameAction(keyCode);
            if (paused) {
                new Thread(snakeDrawer).start();
            }
            paused = false;
        }
    }
    
    private Runnable snakeDrawer = new Runnable() {
        public void run() {
            while (!end && !paused) {
                snake.move(direction, width, height);
                repaint();
                try {
                    Thread.sleep(360);
                } catch (InterruptedException zxz) {}
            }                       
        }
    };
}

Змейка с внутренним классом - частью змейки
Код

import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;

public class Snake {
    private Image partImage;
    private int partSize;
    private Stack body = new Stack();

    public Snake(int height) {
        try {
            partImage = Image.createImage("/Body.png");
        } catch (IOException e) {}
        partSize = partImage.getWidth() - 1;
        body.addElement(new Part(partSize * 2, height - partSize * 3));
        body.addElement(new Part(partSize * 3, height - partSize * 3));
        body.addElement(new Part(partSize * 4, height - partSize * 3));
    }

    public Stack getBody() {
        return body;
    }    
    
    public class Part {
        private int x, y;
        
        Part(int x, int y) {
            this.x = x;
            this.y = y;             
        }

        public void setX(int x) {
            this.x = x;
        }

        public void setY(int y) {
            this.y = y;
        }        
        
        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
        
        public Image getPartImage() {
            return partImage;
        }                     
    }
    
    public Part move(int direction, int width, int height) {
        Part last = (Part)body.lastElement();
        Part pp = last;    
        switch (direction) {
            case Game.UP:           
                if (last.y <= partSize / 2) {
                    pp = new Part(last.x, height - partSize / 2);
                } else {
                    pp = new Part(last.x, last.y - partSize);
                }

                body.removeElementAt(0);            
                body.addElement(pp);
                break;
            case Game.RIGHT:
                if (last.x >= width - partSize / 2) {
                    pp = new Part(partSize / 2, last.y);
                } else {
                    pp = new Part(last.x + partSize, last.y);
                }

                body.removeElementAt(0);           
                body.addElement(pp);
                break;
            case Game.DOWN:
                if (last.y >= height - partSize / 2) {
                    pp = new Part(last.x, partSize / 2);
                } else {
                    pp = new Part(last.x, last.y + partSize);
                }

                body.removeElementAt(0);          
                body.addElement(pp);
                break;
            case Game.LEFT:
                if (last.x <= partSize / 2) {
                    pp = new Part(width - partSize / 2, last.y);
                } else {
                    pp = new Part(last.x - partSize, last.y);
                }

                body.removeElementAt(0);                        
                body.addElement(pp);
                break;
        }
        return pp;
    }     
}


Добавлено через 44 секунды
Пардон, не приложился код!

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  src.zip 2,54 Kb


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
oxigen
Дата 31.10.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

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



Ну так не выходите из потока по  paused
Если установлен флаг paused, то крутите цикл впустую и ждите, пока флаги не изменятся.
Сделайте что-то вроде
Код

 while (!end) {
    if(paused) {
       Thread.sleep(100);
        continue;
   }

.....
}

PM MAIL   Вверх
Pawl
Дата 31.10.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

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



Цитата(oxigen @  31.10.2011,  15:40 Найти цитируемый пост)
крутите цикл впустую и ждите, пока флаги не изменятся.

спасибо, попробую! У меня была такая мысль, я пытался просто прокрутить пустой цикл, что не получилось. Ваш вариант, думаю, более правильный.

Добавлено через 10 минут и 28 секунд
Да, так получилось, thank You very much! smile  smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

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


 




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


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

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