Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2011, 14:23   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
Счастье Стрельба Игрушка 2D

Почитал немного про Canvas, и решил сделать 2D выживалку (Ну это в будущем что получится). Сейчас это image на котором есть картинка игрока, с помощью клавишь можно двигаться. Вобщем, как лучше сделать стрельбу? Ведь снарядов может быть 10, а может быть и 1500 одновременно. Покачто я сделал класс Bullets
Код:
  TBullet=Class
   BullModel:TbitMap;
   X,Y:real;
   Damage:integer;
   Number:integer;
  End;
Код:
procedure Tform1.shoot();
begin
 BulletsCount:=BulletsCount+1;
 Bullets[BulletsCount]:=TBullet.Create;
 bullets[BulletsCount].BullModel:=tBitMap.Create;
 bullets[BulletsCount].BullModel.loadfromfile('bullet.bmp');
 bullets[BulletsCount].Number:=BulletsCount;
 Bullets[BulletsCount].X:=0;
 Bullets[BulletsCount].Y:=0;
end;
Код:
procedure TForm1.Timer3Timer(Sender: TObject);
var
  I: Integer;
begin
if BulletsCount>0 then
begin
for i := 1 to BulletsCount do
begin
Image1.Canvas.Draw(Round(bullets[i].X), Round(bullets[i].Y), bullets[i].BullModel);
bullets[i].x:=bullets[i].x+2;
bullets[i].y:=bullets[i].y+2;
if bullets[i].Y<0 then
begin
bullets[i].Free;
end;
if bullets[i].Y>170 then
begin
bullets[i].Free;
end;
if bullets[i].X<0 then
begin
bullets[i].Free;
end;
if bullets[i].X>316 then
begin
bullets[i].Free;
end;
end;
end;
Код не доработан. Когда один снаряд исчезает дальше пишет Invalid Pointer Operation. Как это все сделать правильно.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 28.09.2011, 15:31   #2
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Нельзя использовать функцию free, это для указателей (Pointer'ов). И вообще, создай список, а не массив.
Код:
 PBullet=^TBullet
TBullet=record
   BullModel:TbitMap;
   X,Y:real;
   Damage:integer;
   Number:integer;
  next, prev:PBullet;
  End;
Доступ ко всем пулям будет осуществляться через 1 переменную - указатель.
Код:
var Bullets:PBullet
BulletsCount:integer //количество
Списки позволяют удалять элементы из середины или из начала, а массивы для этого не предназначены. Поищи информацию про то, как пользоваться указателями.
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 28.09.2011, 15:33   #3
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

И измени параметры пули, например нельзя для каждой пули загружать свою картинку (BullModel), это скажется на производительности. Такие общие данные надо указывать 1 раз и применять во время прорисовки для всех пуль. Во вложении пример использования списков. Смотри всё, что касается Cloud (это облака из моей старой игры). Облака создаются, перемещаются до координаты x=2000 и удаляются.
Для удобства создай тип данных вектор (в моём примере это cpVect из модуля uVect). Функция ssprite_draw из движка omega, на неё не смотри, в этом месте будут твои процедуры рисования картинки на канве
Вложения
Тип файла: rar smWeather.rar (1.3 Кб, 22 просмотров)
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 28.09.2011 в 15:40.
Андрей 93 вне форума Ответить с цитированием
Старый 28.09.2011, 15:59   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

При всём уважении, Андрей 93, не стоит утверждать так категорично.
ТС использует классы и им как раз надо делать Free.
Если захочет списком, то сделает списком, на всякий случай стандартная реализация списка указателей (облеченная в класс) по-моему, лежит в модуле Contnrs.
Данные вроде tbitmap стоит конечно хранить централизованно, но вот иметь ссылку на экземпляр битмапа нисколько не зазорно, поэтому ТС, могу посоветовать вот что:
Создайте некое хранилище графических данных, по первости может сойти массив или даже глобальная переменная (но я советую централизовать и сделать хранилище тоже где-то в классе, доступ к графике в котором осуществляется по идентификатору, в качестве которого можно использовать перечислимый тип или ещё что-то такое)
при создании пули не надо писать
Код:
bullets[BulletsCount].BullModel:=tBitMap.Create;
 bullets[BulletsCount].BullModel.loadfromfile('bullet.bmp');
а просто
Код:
bullets[BulletsCount].BullModel:= graphicsarray[bullet]; // это и есть ссылка на уже загруженный объект Tbitmap
тогда уйдёт 2 проблемы сразу - дублирование данных и потеря производительности и не придётся беспокоиться об освобождении данных, ибо это можно переложить на класс(или массив) хранилища.

Ну и главное )) по поводу почему происходят креши:
Код:
if bullets[i].Y<0 then
begin
bullets[i].Free; // если было выполнено это условие и был освобожден объект
end;
if bullets[i].Y>170 then // то здесь опять происходит обращение к объекту, и это причина креша
begin
bullets[i].Free;
end;
как исправить ? самый простой способ прописать все остальные условия в ветку else соответствующих if'ов
НО я советую пересмотреть логику работы и сделать как-то умнее, например :
Код:
var dofree: boolean;
...
dofree := dofree or (bullets[i].Y>170);
dofree := dofree or (bullets[i].Y<0);
...
if dofree then bullets[i].free;
Надеюсь Вы решите все проблемы, мы поможем если что , Удачи !!!
phomm вне форума Ответить с цитированием
Старый 28.09.2011, 17:16   #5
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Андрей 93 и Phomm, спасибо за ответы, для себя извлек много полезного.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 28.09.2011, 17:19   #6
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Вобщем вот мой первый набросок. Ужас конечно, но чтото же нужно иметь для начала Вобщем у меня назрел вопрос, Как видите в программе модель симпатичного уродца, которым мы управляем спокойно проходит сквозь Эллипс рядом с центром игрового поля. Как сделать чтобы нельзя было пройти сквозь него? Я имею ввиду, что этих эллипсов может быть хоть 100 на игровом поле.
Управление: На стрелки ходить на пробел стрелять.
Вложения
Тип файла: rar Рисование на Image.rar (256.1 Кб, 36 просмотров)
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 28.09.2011, 18:23   #7
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

А теперь попробуйте запустить игру и не трогая стрелок просто нажать на пробел
Invalid floating operator, причем очень жестоким образом
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?
Wicort вне форума Ответить с цитированием
Старый 28.09.2011, 18:54   #8
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Блин Просто когда клавишу (клавишу-Стрелку, не пробел) нажмешь, игроку устанавливается "статус" (куда именно он смотрит, если вверх то статус 1 и т.д.). А при старте статус не определен забыл добавить Вот и ошибка!)
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 28.09.2011, 19:01   #9
jasul
Падаван
Пользователь
 
Аватар для jasul
 
Регистрация: 23.09.2011
Сообщений: 98
По умолчанию

Цитата:
Сообщение от Wicort Посмотреть сообщение
А теперь попробуйте запустить игру и не трогая стрелок просто нажать на пробел
Invalid floating operator, причем очень жестоким образом
Попробовал то что вы рекомендовали результат ужасный))) Не получается выключить программу)
............Сила воли ключ идеальности...........
jasul вне форума Ответить с цитированием
Старый 28.09.2011, 19:25   #10
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

Цитата:
Попробовал то что вы рекомендовали результат ужасный))) Не получается выключить программу)
Вот ведь русские люди... только укажи на косяк, сразу повторить пробуют)
Вы случайно лампочку в рот запихнуть не пытались? )))
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?
Wicort вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игрушка madkot Помощь студентам 2 08.06.2011 19:05
Графика (стрельба из пушки по цели) перевести код с Турбопаскаля в Pascal ABC DANTES68 Помощь студентам 0 07.04.2011 22:27
Игрушка на С/С++ jewel Помощь студентам 2 28.11.2010 23:10
Игрушка Nester Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 15.01.2009 19:02