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

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

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

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

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

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

Цитата:
Сообщение от Alexan-Dwer Посмотреть сообщение
У меня нет проблемы с написанием функции, просто я считаю, что компилятор может решить эту задачу сам
Эту задачу должен сразу решить разработчик. Зная структуру своей программы он должен видеть пересечение переменных и задавать их тип соответственно. Если используются числа от 0 до 255 только! ...то тип их будет Byte, если от 0 до 65535, то - Word, все остальные, включая отрицательные - в тип Integer, а с запятыми, универсальный - Real, или тот же Double. Не нужно так критично подходить к выбору типа данных в нашем случае. Касаемо игры нет смысла применять например ShortInt (от -127 до 127), или Int64. Экономить память нужно в другом месте - при загрузке и хранении графических данных. Нужно хорошо подумать, какие именно диапазоны чисел используются в игре и сделать выводы.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 29.01.2012, 17:31   #632
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Beermonza,
Цитата:
Зная структуру своей программы он должен видеть пересечение переменных и задавать их тип соответственно.
с этим я полностью согласен.

Видимо, я не правильно задал вопрос: есть переменная Month, которая принимает значения от 1 до 12.
Мне нужно получить правильное значение, равное 1, если пользователь ввел 13. Поэтому я привел аналогию с Byte(-4) = 252.
Видимо со своим типом такой возможности нет, кроме как пользоваться дополнительной функцией собственного производства.
Да и с Byte похоже происходит сдвиг на аппаратном уровне, куда и ассемблером не добраться, что уж говорить о Pascal’е.

P.S. Int64 я вообще не разу не использовал, так как не работал с такими числами. А вот почему нет смысла использовать ShortInt я так и не понял
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.01.2012, 19:00   #633
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Alexan-Dwer Посмотреть сообщение
При разработке игр очень часто приходится пользоваться переменными, которые имеют ограниченный тип: здоровье, время или кадр анимации. В языке Pascal есть возможность указать диапазон переменной. Однако иногда необходимо присвоить значение, которое выходит за рамки этого диапазона, и получить новое, например: Byte(-4) = 252.
Про целочисленные типы данные в Pascal хорошо изложено тут: http://it-starter.ru/content/tseloch...-yazyke-pascal
Arigato на форуме Ответить с цитированием
Старый 29.01.2012, 19:17   #634
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Arigato, спасибо, почитал и подтвердил свои предположения:
Цитата:
...с Byte похоже происходит сдвиг на аппаратном уровне
...со своим типом такой возможности нет, кроме как пользоваться дополнительной функцией
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.01.2012, 19:21   #635
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Не пойму, о каком сдвиге идет речь?
Arigato на форуме Ответить с цитированием
Старый 30.01.2012, 15:50   #636
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Не пойму, о каком сдвиге идет речь?
Сдвиг, переполнение, перегрузка - точный термин не знаю...
Выглядит это так:
Код:
var
a: Byte;
begin
a:=Byte(-4);
if a = 252 then ShowMessage('Hello, world!');
end;
Alexan-Dwer вне форума Ответить с цитированием
Старый 30.01.2012, 17:11   #637
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Alexan-Dwer Посмотреть сообщение
есть переменная Month, которая принимает значения от 1 до 12.
Мне нужно получить правильное значение, равное 1, если пользователь ввел 13.
Условие не помогает? ...выход за пределы специфического диапазона всегда обрабатывается фильтром на основе условного оператора: If, Case, While.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 30.01.2012, 17:20   #638
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Ну так Byte не может содержать отрицательных значений.
Arigato на форуме Ответить с цитированием
Старый 30.01.2012, 17:37   #639
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Alexan-Dwer, если тебе нужно не допустить попадания отрицательных начений в переменную байт, диапазона 0 - 255, то есть функция Abs(), ...было -4, станет просто 4:

Код:
x := -4;
ShowMessage(IntToStr(Byte(Abs(x))));
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 31.01.2012, 10:00   #640
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

Если я правильно понял, ему не нужно модуль. Предполагается именно сдвиг влево. Т.е. если тип byte имеет диапазон 0 - 255, то при инициализации byte(-1) получим максимальное значение из диапазона (255). Соответственно, byte(-4) делает сдвиг на 4 влево, получаем 252.
Для своего типа если только самому писать если значение больше максимального, то присвоить разницу
Код:
пока x > max 
 x := x - max;
ну и соответственно, если меньше минимального, то
Код:
пока с < min
 x := max - x;
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?

Последний раз редактировалось Wicort; 31.01.2012 в 10:04.
Wicort вне форума Ответить с цитированием
Ответ


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



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