Реализация игры на JAVA

Автор: Пользователь скрыл имя, 10 Октября 2011 в 15:33, курсовая работа

Описание работы

Игры на Eclipse

Работа содержит 1 файл

Проект Eclipse.doc

— 336.50 Кб (Скачать)
package com.mycompany.propbuilder; 

import java.io.*;

import java.util.*; 

import org.eclipse.core.resources.*;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.core.runtime.IProgressMonitor; 

public class PropertyBuilder extends IncrementalProjectBuilder

{

  private static final String MARKER_ID =

    "com.mycompany.propbuilder.propmarker"; //$NON-NLS-1$ 

  protected void clean(IProgressMonitor monitor) throws CoreException

  {

    // удалить все маркеры, созданные для файлов в проекте

    List removed = new LinkedList();

    removed.add(getProject());

    removeMarkers(removed);

  } 

  protected IProject[] build(int kind, Map args, IProgressMonitor monitor)

    throws CoreException

  {

    // список файлов, в которых необходимо искать сообщения TODO

    List added = new LinkedList();

    // все маркеры для этих файлов необходимо удалить

    List removed = new LinkedList();

    IResourceDelta delta = getDelta(getProject());

    if (kind == FULL_BUILD

      || (delta.getFlags() & IResourceDelta.DESCRIPTION) != 0)

    {

      // начинаем обработку всех файлов в проекте

     buildAll(added, removed);

    }

    else

    {

      // начинаем обработку файлов, указанных в delta

      buildDelta(delta, added, removed);

    }

    // удалить устаревшие маркеры

    removeMarkers(removed);

    // создать новые маркеры

    processFiles(monitor, added);

    return null;

  } 

  private void buildAll(final List added, final List removed)

  {

    IProject project = getProject();

    // удалить все маркеры, созданные для файлов в проекте

    removed.add(project);

    try

    {

      // посетить все ресурсы, входящие в проект

      project.accept(

        new IResourceVisitor()

        {

          public boolean visit(IResource res) throws CoreException

          {

            // мы ищем файлы с расширением .properties

            if (res instanceof IFile &&

              "properties".equals(res.getFileExtension())) //$NON-NLS-1$

            {

              added.add(res);

            }

            // продолжить обход дочерних ресурсов текущего ресурса

            return true;

          }

        }

      );

    }

    catch (CoreException e)

    {

      PropBuilderPlugin.log(e);

    }

  } 

  private void buildDelta(IResourceDelta delta, final List added,

    final List removed)

  {

    IResourceDeltaVisitor visitor = new IResourceDeltaVisitor()

    {

      public boolean visit(IResourceDelta delta)

      {

        if ((delta.getFlags() & IResourceDelta.CONTENT) == 0)

        {

          // содержимое данного ресурса не менялось

          return true;

        }

       

        IResource resource = delta.getResource();

        // мы ищем файлы с расширением .properties

        if (resource.getType() == IResource.FILE &&

          "properties".equals(resource.getFileExtension())) //$NON-NLS-1$

        {

          switch (delta.getKind())

          {

            case IResourceDelta.ADDED:   added.add(resource);   break;

            case IResourceDelta.REMOVED: removed.add(resource); break;

            case IResourceDelta.CHANGED:

              removed.add(resource);

              added.add(resource);

              break;

          }

        }

        // продолжить обход дочерних ресурсов текущего ресурса

        return true;

      }

    };

    try {

      // посетить все измененные ресурсы

      delta.accept(visitor);

    }

    catch (CoreException e)

    {

      PropBuilderPlugin.log(e);

    }

  } 

  void removeMarkers(final List resources)

  {

    IWorkspaceRunnable operation = new IWorkspaceRunnable()

    {

      public void run(IProgressMonitor monitor) throws CoreException

      {

        Iterator i = resources.iterator();

        while (i.hasNext())

        {

          IResource r = (IResource) i.next();

          // удалить в данном ресурсе все маркеры типа propmarker

          r.deleteMarkers(

            MARKER_ID,

            true,

            IResource.DEPTH_INFINITE);

        }

      }

    };

    try

    {

      // выполнить удаление маркеров как атомарную операцию

      ResourcesPlugin.getWorkspace().run(operation, null);

    }

    catch (CoreException e)

    {

      PropBuilderPlugin.log(e);

    }

  } 

  private void processFiles(IProgressMonitor monitor, final List files)

  {

    IWorkspaceRunnable operation = new IWorkspaceRunnable()

    {

      public void run(IProgressMonitor monitor) throws CoreException

      {

        // всего предстоит обработать files.size() файлов

        monitor.beginTask("Analyzing properties", files.size()); //$NON-NLS-1$

        Iterator i = files.iterator();

        while (i.hasNext())

        {

          readTodos((IFile) i.next());

          // обновить индикатор состояния

          monitor.worked(1);

        }

        // обработка завершена

        monitor.done();

      } 

      // найти все строки, содержащие TODO в данном файле .properties

      private void readTodos(IFile file) throws CoreException

      {

        BufferedReader in = new BufferedReader(

          new InputStreamReader(file.getContents()));

        int line = 1;

        String str;

        try {

          while ((str = in.readLine()) != null)

          {

            if (str.indexOf("TODO") >= 0) { //$NON-NLS-1$

              reportTask(file, line, str);

            }

            line++;

          }

        }

        catch (IOException e)

        {

          PropBuilderPlugin.log(e);

        }

      } 

      private void reportTask(IResource resource, int line, String message)

        throws CoreException

      {

        // создать маркер типа propmarker для данного файла

        IMarker marker = resource.createMarker(MARKER_ID);

        // установить номер строки

        marker.setAttribute(IMarker.LINE_NUMBER, line);

        // используем сам текст строки в качестве наименования задачи

        marker.setAttribute(IMarker.MESSAGE, message);

        // запретить пользователю редактировать и удалять задачу

        marker.setAttribute(IMarker.USER_EDITABLE, false);

      }

    }; 

    try

    {

      // выполнить поиск непереведенных сообщений как атомарную операцию

      ResourcesPlugin.getWorkspace().run(operation, monitor);

    }

    catch (CoreException e)

    {

      PropBuilderPlugin.log(e);

    }

  }

}

СОВЕТ

После каждого создания, изменения или  удаления маркера Workspace рассылает всем зарегистрированным слушателям сообщение  об изменении ресурса. Из-за этого  создание нескольких сотен или тысяч  маркеров может оказаться весьма продолжительной операцией. В таких случаях их следует создавать в контексте метода IWorkspace.run(), вызов которого считается атомарной операцией. Соответственно, независимо от количества созданных маркеров, слушателям будет разослано только одно сообщение.

Как пользоваться новым расширением Eclipse? Прежде всего, необходимо установить плагин com.mycompany.propbuilder. Для этого нужно скопировать  файлы plugin.xml и propbuilder.jar в директорию eclipse/plugins/com.mycompany.propbuilder и перезапустить Eclipse. После этого следует выбрать проекты, в которых мы собираемся искать непереведенные сообщения. В случае реального приложения такая возможность должна быть доступна пользователю через графический интерфейс, однако для упрощения примера мы просто добавим ссылку на билдер PropertyBuilder в файлах .project соответствующих проектов:

<buildSpec>

  ...

  <buildCommand>

    <name>com.mycompany.propbuilder.builder</name>

      <arguments>

      </arguments>

  </buildCommand>

</buildSpec>

Наконец, включим отображение нового типа задач в виде Tasks:

 
Рисунок 5 Настройка вида Tasks.

Теперь в Tasks должны появиться созданные плагином com.mycompany.propbuilder задачи.

 
Рисунок 6 Новые задачи в  виде Tasks.

Разработчикам приложений

Рассмотрим  два аспекта создания приложений на базе Eclipse – правовой и технический.

Юридическую сторону вопроса призваны решить лицензии, под которыми распространяется Eclipse SDK – CPL (Common Public License) и более поздняя EPL (Eclipse Public License). Они позволяют использовать, распространять и продавать лицензированные исходные и бинарные коды без уплаты вознаграждения правообладателям. Этим уже воспользовались для создания коммерческих продуктов на базе Eclipse такие поставщики ПО, как Borland, IBM, SAP.

С технической  точки зрения, подробно проиллюстрированной  в предыдущем разделе, выдающаяся расширяемость Eclipse обусловлена прежде всего его архитектурой и проектными решениями. Модульная архитектура, организация проекта в виде набора расширяемых подсистем Platform, JTD и PDE, возможность расширения сторонними разработчиками практически любой подсистемы Eclipse позволяют использовать его для создания приложений разнообразнейших видов и назначения.

Основной  целью проекта Eclipse является интеграция приложений для разработки в рамках различных IDE (одной из этих IDE является сам Eclipse SDK, а именно Platform, дополненный JDT и PDE). В то же время, Eclipse содержит множество компонентов, которые могут быть использованы приложениями самого широкого спектра, не нуждающимися, вообще говоря, в полной инфраструктуре Eclipse (примерами таких компонентов могут служить SWT и JFace). Для поддержки подобных приложений было введено понятие Rich Client Platform (RCP). RCP – это базовый набор компонентов Eclipse, который позволяет использующим его приложениям полностью контролировать внешний вид создаваемого пользовательского интерфейса (перспективы, меню, панели инструментов и т.п.).

В заключение я хочу еще раз подчеркнуть  два ключевых фактора. Во-первых, с  точки зрения своих создателей, Eclipse является, прежде всего, средством разработки приложений. Во-вторых, приложения Eclipse ни в коей мере не ориентированы только на задачи, так или иначе связанные с Java (хотя сами приложения, безусловно, удобнее всего разрабатывать на Java). Понимание этой концепции поможет вам взглянуть на Eclipse в новом ракурсе.

На прилагающемся  к журналу компакт-диске находится Eclipse SDK 3.0.1.

Информация о работе Реализация игры на JAVA