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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2009, 15:36   #371
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

L_M, разбор создания сетевых игр уже противоречит названию этой темы, т.е. не для новичка это дело.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.09.2009, 11:36   #372
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

L_M
Создавай новую тему в таком случае.
VintProg вне форума Ответить с цитированием
Старый 25.10.2009, 22:29   #373
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию

Я хочу сделать игру типа "танчики", для двоих человек, перемещение танков я могу сделать...а вот как сделать стены комнаты...предположим они будут картинками, но стен много, а значит много и картинок, а проверять на столкновение каждую стену - это как-то муторно...

Подскажите пожалуйста.Заранее благодарен.

P.S.
И еще хотелось бы узнать, как сделать так чтобы картинка пули постоянно создавалась....т.е. существует 1 объект - пуля, а как сделать так, чтобы могла вылетать несколько пуль одновременно?
Ckomoroh вне форума Ответить с цитированием
Старый 25.10.2009, 22:36   #374
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Самый подходящий для этого случая вариант, это использовать перемещение танков не по пикселям, а по клеточкам. Читай выше, здесь это уже обсуждалось!
Kostia вне форума Ответить с цитированием
Старый 25.10.2009, 22:41   #375
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
а вот как сделать стены комнаты...предположим они будут картинками, но стен много, а значит много и картинок, а проверять на столкновение каждую стену - это как-то муторно...
Ну назвать это муторным неправильно. Так и должно быть: например сначала проверяются столкновения двух танков, потом первого танка со всеми стенами и второго танка со всеми стенами. OOП сильно облегчает задачу.
Цитата:
т.е. существует 1 объект - пуля, а как сделать так, чтобы могла вылетать несколько пуль одновременно?
То же самое с пулями - создать тип пули TBullet и процедуры для работы с ним (выстрел, удаление, прорисовка, проверка попадания). Все пули хранить в массиве и в таймере проверять каждую пулю массива на столкновение.
Вадим Буренков вне форума Ответить с цитированием
Старый 26.10.2009, 15:16   #376
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Вадим Буренков Посмотреть сообщение
Ну назвать это муторным неправильно. Так и должно быть: например сначала проверяются столкновения двух танков, потом первого танка со всеми стенами и второго танка со всеми стенами. OOП сильно облегчает задачу.
Есть еще один способ - обрабатывая игровые объекты по списку смотреть их окружение на карте по клеточкам вокруг, и в зависимости от препятствий принимать решения. Ресурсов столько же, но цикл один.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.10.2009, 16:14   #377
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Как пример:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  tbullet=class
    x,y:integer;
    force:array[0..1] of integer;
    procedure update;
  end;

var
  Form1: TForm1;
  l:tlist;

implementation

{$R *.dfm}

{ tbullet }

procedure tbullet.update;
begin
x:=x+force[0];
y:=y+force[1];
form1.Canvas.MoveTo(x,y);
form1.Canvas.LineTo(x+40,y+40);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
b:tbullet;
begin
b:=tbullet.Create;
b.x:=x;
b.y:=y;
b.force[0]:=-40;
b.force[1]:=-40;
l.Add(b);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
b:tbullet;
begin
Canvas.Rectangle(0,0,width,height);
if l.Count>0 then
for i:=0 to l.Count-1 do
begin
b:=l.Items[i];
b.update;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
l:=tlist.Create;
timer1.Interval:=50;
end;

end.
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось russian-stalker; 26.10.2009 в 16:22.
russian-stalker вне форума Ответить с цитированием
Старый 26.11.2009, 17:34   #378
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Решил перевести систему координат в своём игровом проекте, и возникла куча вопросов. У каждого объекта есть координата (50*m; 50*n), где m и n - элементы массива. Массив динамический: matrix: array of array of smallint;
В-общем, не стоит говорить и спрашивать насчёт этой системы хранения карты, отрисовки на экран и создания "подложки" (Спасибо, Beermonza, метод всё-таки действительно помог). Поговорим о новом способе.
Итак. Теперь карта (лучше говорить матрица) объектов представляет из себя такую структуру:
Код:
type
  TMatrix = record
    Position: TPoint; // Координаты объекта
    ObjectType: smallint; // Тип объекта (1 - дерево, 2 - камень, 3 - цветок ...)
  end;
var
  matrix: array of array of TMatrix; // Двумерный динамический массив карты
И вот здесь начинаются трудности. Во первых, как рисовать всё это на экран, ведь координаты могу быть такими (135000; 10). Я думаю, что можно пользоваться какими-то формулами, которые переведут координаты для отрисовки... Второе, как хранить все координаты в файле. Вот так:
Код:
for i := 0 to LengthX do  // Длина массива
 for j := 0 to LengthY do 
  Writeln(F, Matrix[i,j].TypeObject, Matrix[i,j].Position.X, Matrix[i,j].Position.Y);
?
Если вы располагаете информацией насчёт этого, напишите пожалуйста в этой теме подробный ответ, буду очень благодарен. Спасибо.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 26.11.2009, 18:05   #379
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Все станет ясно, если вспомнить что карта - матрица. Что есть в матрице? ...ячейки. Что есть ячейка? ...элементарная запись некоторого кода, или индекс на банк ресурсов. Например карта - матрица типа Byte, на каждую клетку приходится 1 байт данный, или индекса, ...т.е. закодирован 1 из 256 возможных объектов. В матрице есть столбец и строка. Допустим, карта имеет размер 100х100 клеток. Здесь видно координаты объекта? ...видно, т.к. мы точно знаем какого размера элементарный тайл клетки карты. Нужно всего лишь умножить порядковые номера в столбце и в строке на высоту и ширину текстуры тайла карты. Что и применил Манжосов Денис
Цитата:
У каждого объекта есть координата (50*m; 50*n)
Сохранять такую матрицу элементарно просто - подряд в одну строку. У нас есть цикл типа (в сообщении выше):
Цитата:
for i := 0 to LengthX do
for j := 0 to LengthY do
...достаточно записывать один единственный индекс объекта из диапазона 0 - 255 командой Write. Как потом считывать с файла? ...нужно предусмотреть запись при сохранении размеров, в виде 2 байт данных: "Длина" "Ширина" "блок данных...."

Это все сохраняется в формате File Of Byte. При считывании мы точно знаем, что первые два байта - это размеры карты, применим эти данные к циклу считывания как его границы. Так же просто в цикле считаем данные посредством команды Read, она не привязана к размерам матрицы и будет при каждом шаге цикла брать следующий байт в файле.

Что получается. Карта есть, считывание есть, ...нужен банк текстур и система их правильного использования. Нет ничего проще. Создаем систему каталогов. Называем ее как нам нужно, один из каталогов - каталог текстур, в нем 256 файлов, которые так и носят имя в виде цифр. Вместе с ними идут допустим текстовые txt или ini файлы с данными, как правильно пользоваться текстурой, с тем же именем.
Что происходит? ...при считывании карты с файла, и взяв индекс объекта, мы точно знаем как он называется, и где лежат его ресурсы. Код выдергивает с каталога все данные по имени файлов и загружает их в одномерный массив банка текстур, в первую свободную ячейку. Разумеется тип банка текстур нужно создать, чтобы в нем были все данные для обработки и отрисовки. Как только ресурс загружен, в массиве карты, вместо индекса объекта записывается номер ячейки в банке текстур. Зачем это делается? ...если в карте есть одинаковые объекты, то код найдет этот ресурс в банке и укажет просто номер ячейки, не загружая ресурсы снова. Т.е. идет ссылка на один и тот же объект в разных местах карты.

Если есть вопросы с плавающей камерой относительно большой карты, или если объектов в игре более чем 256, задавайте вопросы, ...отвечу по мере поступления.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.11.2009, 18:19   #380
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Размер карты 100х100 пикселей вы имели ввиду? И каждый элемент массива (100х100) несёт в себе значение каждого пикселя? Или я не так понял. Дело в том, что столбов нет никаких, то есть объект можно поставить в абсолютно любую клетку (317; 526); (465; 777). Вот в чём проблема, и я не знаю как это реализовать. Надеюсь, мы поняли друг друга, Beermonza? Что именно вы имеете ввиду?
Манжосов Денис :) вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07