|
Основной форум Сюда все проблемы связанные с программированием. |
21.09.2007, 22:08
|
#1
|
AnyKey`щик
Регистрация: 16.09.2007
Сообщений: 1
Написано 0 полезных сообщений (для 0 пользователей)
|
Как одновременно анимировань несколько обьектов
Не могу разобраться, как к примеру сделать, чтоб летела пуля, выпущенная персонажем, сам фон игры был анимирован(движение обьектов сверху вниз рандомно) и при этом чтоб игрок мог продолжать управлять персонажем и срелять не по одному снаряду, а по нескольку. Пробовал делать всё внутри цикла repeat..until, выносить движение пули, и фона в отдельные repeat..until, но тогда внутри них приходится прописывать и отрисовку всего остального, а потом сравнивать координаты(громоздко и все равно не то, что нужно), через функции не получилось.
опыта программирования почти нет.
|
(Offline)
|
|
21.09.2007, 22:21
|
#2
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Re: Как одновременно анимировань несколько обьектов
|
(Offline)
|
|
21.09.2007, 22:38
|
#3
|
ПроЭктировщик
Регистрация: 25.12.2006
Сообщений: 163
Написано 7 полезных сообщений (для 12 пользователей)
|
Re: Как одновременно анимировань несколько обьектов
плохо, что МР не поддерживает масиивы записей и вообще с многомерными массивами не очень работает... в общем, я решал проблему "многозадачности" движения объектов так: делал массив координат всех объектов, массив номеров текущего спрайта, в общем - кучу массивов, в которых хранились все параметры, необходимые для анимации. Потом в основном цикле вызывал процедуру рисования всех объектов, которая в цикле брала i-ый элемент из всех массивов и на их основе рисовала i-й объект... получалось, в основном цикле вызывается только одна процедура, что в общем не мешает работе с клавиатурой и т.п.
Где-то я выкладывал тут на форуме свой проект на этом принципе..."Муха" назывался кажется... в наработках по-моему...
|
(Offline)
|
|
21.09.2007, 23:39
|
#4
|
Нуждающийся
Регистрация: 22.07.2006
Сообщений: 50
Написано 6 полезных сообщений (для 19 пользователей)
|
Re: Как одновременно анимировань несколько обьектов
Сообщение от ARV
плохо, что МР не поддерживает масиивы записей
|
Вроде все поддерживается...
например так:
const MansCount=2567; // Общее кол-во человек в базе
type typMans = record // Тип записи про человека
name: string; // Ф.И.О.
addr: string; // Адрес
numb: string; // Телефон
end;
var Man: array [1..MansCount] of typMans; // Массивчик для людей
// ....................... и т.д.
Man[i].name:='Вован';
|
(Offline)
|
|
22.09.2007, 01:16
|
#5
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Как одновременно анимировань несколько обьектов
Может поможет.
//для удобства зададим числа для размера массива в начале
const
min_bullets=1; //минимальное количество пуль
max_bullets=20;//максимальное кол-во пуль
//создадим тип данных типа record, те "название типа" bulletType, в нем содержаться переменные x,y и скорости пули, картинка пули
type bulletType = record
bullet_x,bullet_y,bullet_speed: integer;
bullet_img:image;
end;
//переменные
var
game:boolean;//используется для того что бы определять выполняется главный цикл игры или нет
bullets_arr:array[min_bullets..max_bullets] of bulletType;//массив пуль типа bulletType, размером от min_bullets до max_bullets,
//в каждой ячейке массива содержиться запись с полями x,y, скорости и картинки пули.
bullet_img:image;//картинка пули для массива
i,lastBulletUpdate:integer;//i - вспомогательная переменная, lastBulletUpdate - относительное время в миллисекундах
//Начало самой программы, начинаем назначать переменные, заполнять массив, вобщем подготавливаем данные для игры
begin
LastBulletUpdate := GetRelativeTimeMs; // запоминаем время (значенеи представляет из себя просто число в целом (integer) формате
game:=true; // это нужно для того что бы заработалглавный цикл
bullet_img:=loadImage('/icon.png');//загрузка картинки пули, используется стандартный значек в midletpascal, для совместимости
//начинаем запонять массив данными
for i:=min_bullets to max_bullets do //начинается цикл который выполниться от min_bullets До max_bullets (те 20 раз, мы установили значение этой константы в начале) раз
begin
//принцип заполнение массива типа record такой: имя_массива[номер ячейки].переменная_которая_есть_в_данном_типе:=значение;
bullets_arr[i].bullet_x:=random(getWidth);//ставим положение по x (ширина) случайным (при помощи random()) значение которого от 0 до getWidth (функция возвращает ширину экрана телефона, те x)
bullets_arr[i].bullet_y:=0;//ставим y=0, тк пуля должна по задумке падать :) те ставим на самый верх экрана. Y - высота
bullets_arr[i].bullet_img:=bullet_img; //назначаем ячейке под номером i и полю которая в нем содержиться рисунок который мы ранее загрузили в переменную bullet_img
bullets_arr[i].bullet_speed:=random(3)+1;//ставим случайно скорость пули от 1 до 4, "+1" нужно для того, что бы скорость не была равна 0 (random возвращает значение от 0)
end;
//главный цикл(цыкл) :))
while (game=true) do //"пока game=true выполнять следующий код"
begin
while isMidletPaused do//смысл в следующем:"если мидлет приостоновлен (свернули, приостоновили - те например вышли на главный экран у мобилы)
begin // то выполнять следующий код - "задержка 100 мсек". Все это нужно что бы в свернутом состоянии мидлет не грузил телефон - становился на "паузу"
delay(100);
end;
if getKeyClicked = KE_KEY1 then //"если нажать 1 то game станет равно false" и мидлет завершит свою работу
begin
game:=false;
end;
setColor(0, 0, 0);//ставим цвет рисования rgb как черный
fillRect(0, 0, getwidth, getheight); //рисуем черный квадрат во весь экран, это нжно для того что бы за объектами не оставался шлейф
//смысл в следующем: в самом начале кода мы запомнили значение LastBulletUpdate, теперь вычитая из текушего значения времени (GetRelativeTimeMs) ранее запомненое значение LastBulletUpdate мы получим сколько прошло с того момента,
//если значение >100 (те 0.1 сек(1000=1сек)) выполняется нижеследующий код.
if ((GetRelativeTimeMs - LastBulletUpdate) > 100) then
begin
LastBulletUpdate := GetRelativeTimeMs;//снова запоминаем текущее время, оно нам понадобиться для того что бы узнать что снова прошло еще 0.1сек
//начинаем перебор массива
for i:=min_bullets to max_bullets do
begin
bullets_arr[i].bullet_y:=bullets_arr[i].bullet_y+bullets_arr[i].bullet_speed;//увеличиваем y (высоту) положения пули на скоростьс которой она литит
//проверяем если пуля ушла ли пуля за экран (те опустилась ниже высоты экрана)
if bullets_arr[i].bullet_y>=getheight then
begin
//если условие выполняется, те пуля ниже высоты экрана
bullets_arr[i].bullet_y:=0;//поднимает пулю опять на верх
bullets_arr[i].bullet_speed:=random(3)+1;//снова случайно назначаем скорость пули
bullets_arr[i].bullet_x:=random(getwidth);//и случайно ставим по ширине экрана
end;
end;
end;
//теперь снова перебирая массив пуль отрисовываем каждую пулю в определенной точке экрана, этот перебор нужен потому,что если поствить его в предыдущий (где изменяется координаты пули) пуля будет отрисовывать только раз в секунду.
for i:=min_bullets to max_bullets do
begin
drawImage(bullets_arr[i].bullet_img, bullets_arr[i].bullet_x, bullets_arr[i].bullet_y);
end;
//обновляем экран
repaint;
end;
end.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:36.
|