Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »
реклама
коучинг москва

Почтовая рассылка

Подписчиков: 11855
Последний выпуск: 19.06.2015

Midlet Pascal. Изображения и кнопки

Автор: Есенин Павел aka Ordos
27 декабря 2007 года

Всем привет! Продолжаем изучать Midlet Pascal. В прошлой статье я рассказал о самых основах этого языка. В этой статье погорим о вещах более интересных - немного порисуем, рассмотрим вывод изображений и обработку нажатий пользователя на кнопки.

Стандартные фигуры изображать в Midlet Pascal очень даже просто. Вот, например, нарисуем синий прямоугольник 100х100 и в нем белым текстом напишем что-нибудь. Делается это так. За цвет отвечает процедура SetColor, где в скобках указываются три цвета, из которых получится тот, который нам нужен. Цвета указываются в таком порядке: красный, зеленый, синий. Значение каждого из них может быть от 0 до 255. Например, если написать так:

SetColor(0, 255, 0);

то мы получим ярко-зеленый цвет, а если так:

SetColor(244, 242, 77);

то желтый.

Поехали дальше. Прямоугольник мы возьмем закрашенный - для это есть процедура FillRect, где в скобках пишутся координаты левого верхнего угла это прямоугольника, ширина и высота. В итоге получаем что-то вроде этого:

program graphic;
begin
  SetColor(0,0,255);
  FillRect(10,10,100,40);
  SetColor(255,255,255);
  DrawText('Какой-то текст...',15,20);
  repaint;      
  delay(5000);
end.

Прямоугольники с линиями - это, конечно, хорошо, но явно недостаточно, чтобы сделать хорошую игрушку. Неплохо было бы показать какую-нибудь красивую картинку, чем мы сейчас и займемся. С картинками в Midlet Pascal дело обстоит неважно, поддерживается только формат PNG. Поэтому все изображения, которые Вы хотите вывести на экран нужно переводить именно в этот формат. Для конвертирования изображений есть много программ и я не буду на этом останавливаться. Скажу лишь, что лично мне ближе Photoshop. Там можно и картинку отредактировать и сохранить ее как нужно. Ну так вот. Нашли Вы хорошую картинку, теперь самое время добавить ее к нашей программе. Для этого в меню выбираем "Project -> Import resource file", находим нашу картинку и добавляем ее. Она должна появиться в списке файлов слева (вкладка "Files"). Если у Вас нет такой вкладки, ее можно включить через "View -> Files". Допустим Ваша картинка называется "picture.png". Теперь в программе пишем:

DrawImage(LoadImage('/picture.png'), 10, 10);

Означает это примерно следующее. LoadImage загружает картинку из ресурсного файла (символ "/" перед названием писать обязательно, иначе ничего не выйдет). DrawImage выводит загруженную картинку на экран в точку с координатами (10, 10). Можно (а иногда даже и нужно) сделать немного по-другому. Сначала загрузить изображение в какую-нибудь переменную (которая в этом случае будет иметь тип image), а потом уже действовать через эту переменную. Т.е. примерно так:

var
  PictureVar : image;
begin
  PictureVar := LoadImage('/picture.png');
  DrawImage(PictureVar, 10, 10);
end.

Для чего это нужно? Дело в том, что последний вариант работает гораздо быстрее. Это, в принципе, не имеет значения, если Вам нужно вывести одно-два небольших изображения, а вот если этих изображений несколько десятков и пишете Вы очень динамичную игру - тогда лучше делать через переменные. Да и с переменными удобнее работать, особенно если оформить это дело в массив.

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

Герой игры не сдвинется с места. А все потому, что нужно было еще запрограммировать и обработку нажатий на клавиши. Ну что ж, займемся этим. Здесь все очень просто. Поэтому объясню вкраце. Есть две основных функции: GetKeyClicked и GetKeyPressed, которые возвращают код нажатой клавиши. Разница между ними лишь в том, что первая возвращает последнюю нажатую клавишу, а вторая - клавишу, нажатую в данных момент. Разные телефоны (и устройства вообще) могут возвратить для одной и той же клавиши разные коды и тогда программа, которая прекрасно работала на одном телефоне, совершенно откажется работать на другом. Эту проблему решает функция KeyToAction, которая сама определяет, какая клавиша была нажата и выдает ее значение в виде константы. Например, если был нажат джойстик вверх, то значение будет GA_UP, если вправо, то - GA_RIGHT. А теперь поясню все вышесказанное на практике:

while KeyToAction (GetKeyClicked) <> GA_FIRE do
  begin
    Delay(100);
  end;

Этот пример был взят из помощи по Midlet Pascal. Данный цикл (а значит и программа в данном случае) будет работать до тех пор, пока не будет нажат центр джойстика. Подробнее про константы читайте в справке.

Ну что же. Вы узнали немного о выводе изображений и обработке нажатий на клавиши. А теперь я хочу показать, как все это применить на практике. Напишем небольшую игрушку, применяя сказанное выше. По правде говоря, это даже и не игрушка пока, а лишь заготовка под нее, но для примера вполне сойдет. Мы будем управлять летающей тарелкой. Для этого надо нарисовать картинку самой тарелки и фон космоса, где, собсвенно и будет происходить действие. Далее приведу просто текст программы. Здесь полно комментариев и, я думаю, Вы разберетесь здесь без проблем.

program game;
var
  Cosmos:image; // Переменная для хранения фона
  NLO:image; // Переменная для хранения самой тарелки
  X,Y:integer; // Координаты тарелки
  Key:integer; // Код нажатой кнопки
begin
  // Загружаем картинки
  Cosmos:=LoadImage('/Cosmos.png');
  NLO:=LoadImage('/NLO.png');

  // Задаем начальные координаты тарелки
  X:=50;
  Y:=50;

  // Цикл до нажатия на центр джойстика
  while (Key<>GA_FIRE) do 
    begin
      Выводим изображения и обязательно ставим небольшую паузу 
      DrawImage(Cosmos,0,0);
      DrawImage(NLO,X,Y);
      Delay(100); 
      repaint;
      
      // Обрабатываем нажатия кнопок и меняем координаты тарелки
      Key:=KeyToAction(getKeyPressed);
      if (Key=GA_LEFT) then X:=X-3;
      if (Key=GA_RIGHT) then X:=X+3;
      if (Key=GA_UP) then Y:=Y-3;
      if (Key=GA_DOWN) then Y:=Y+3;
    end; 
end.

Эта программа полностью рабочая, но сделана довольно упрощенно. Вы можете попробовать сделать ее лучше. Картинки я прикладывать не стал, ибо художник из меня неважный.

Ну вот и все на сегодня. В следующий раз мы добавим к нашей игре музыкальное сопроводжение.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
79K
20 декабря 2011 года
it-log
0 / / 20.12.2011
+1 / -1
Мне нравитсяМне не нравится
20 декабря 2011, 14:30:22
Midlet Pascal с каким версий программируете?
2.
70K
26 марта 2011 года
KaPyShOn
0 / / 26.03.2011
+1 / -0
Мне нравитсяМне не нравится
27 марта 2011, 09:43:37
Ааааа всё допёрло
3.
70K
26 марта 2011 года
KaPyShOn
0 / / 26.03.2011
Мне нравитсяМне не нравится
26 марта 2011, 21:40:50
А как вообще открвать эти созданые в Midetpascal игры?
4.
64K
15 сентября 2010 года
Rammleid
0 / / 15.09.2010
+2 / -0
Мне нравитсяМне не нравится
15 сентября 2010, 13:45:46
Почему у меня ошибку выдаёт:
ОШИБКА:неожиданный текст ,DrawImage,после конца
Как эту ошибку исправить??
5.
27K
27 мая 2008 года
David_K800i
36 / / 27.05.2008
Мне нравитсяМне не нравится
27 мая 2008, 15:18:15
имхо конкретный ответ
большое спс!!!
но где другая сатья
ненашел :((
6.
35K
19 декабря 2007 года
sasha_m
0 / / 19.12.2007
+1 / -0
Мне нравитсяМне не нравится
23 января 2008, 19:48:25
Очень интересная программа.за 5 мин игра на телефон.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог