Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Основной форум

Основной форум Сюда все проблемы связанные с программированием.

Ответ
 
Опции темы
Старый 04.06.2011, 07:53   #1
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Правильная загрузка

Помогите разобраться с загрузкой. Из-за округления определенный процент теряется.
Пробовал real, но у него свои "причуды"

program gauge_sample;

var 
gauge_wgauge_hinteger;

procedure draw_gauge(progressinteger);
begin
  setcolor
(160,160,160);
  
drawrect(55gauge_w+3gauge_h+3);
  
setcolor(90,90,90);
  
fillrect(77progress*(gauge_w/100), gauge_h);
end;

begin
  
//задаем размеры:
  
gauge_w:=getWidth-14;
  
gauge_h:=10;
  
//рисуем прогрессбар
  
draw_gauge(100);
  
repaint;
  
repeat until GetKeyClicked=KE_STAR;
end
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 04.06.2011, 08:28   #2
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Правильная загрузка

Проблема решена! Нашел в другом разделе (был не внимателен). Тема закрыта!
Нужно было просто перевести int в real.
(код ↓)
program gauge_sample;

var 
gauge_wgauge_hinteger;

procedure draw_gauge(progressreal);
var 
p1p2p3real// <<=1=
begin
  setcolor
(160,160,160);
  
drawrect(55gauge_w+3gauge_h+3);
  
setcolor(90,90,90);
  
p1:=progressp2:=gauge_wp3:=100.0// <<=2=
  
fillrect(77trunc(p1*(p2/p3)), gauge_h); // <<=3=
end;

begin
  gauge_w
:=getWidth-14;
  
gauge_h:=10;
  
draw_gauge(50);
  
repaint;
  
repeat until GetKeyClicked=KE_STAR;
end
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 04.06.2011, 21:22   #3
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: Правильная загрузка

Можно заставить исходный код работать корректно, если поменять скобки местами в fillRect:
fillrect(7, 7, (progress * gauge_w) / 100, gauge_h);
Допустим что ширина экрана = 240
Тогда gauge_w = 226
В вашем изначальном коде формула задана как progress * (gauge_w / 100).

При выполнении с progress = 100 выполняются следующие операции:
n = gauge_w = 226
n = n / 100 = 2 (переменная целочисленная - дробная часть отброшена)
n = n * progress = 200
ширина = 200 (должно было быть 226)

Если поменять порядок скобок на упомянутый мной, то действия будут изменены на:
n = progress = 100
n = n * gauge_w = 22 600 (к счастью, максимальное значение целочисленной 2 147 483 64
n = n / 100 = 226 (успех!)

В случае, когда производится большое количество прорисовок экрана, использование целочисленных может оказатся выгоднее чем использование несомненно хорошего, но медлительного класса Real из MP.
Надеюсь эта информация оказалась полезной.
Хорошего дня.
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Trazzy (05.06.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:58.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com