С Новым годом! Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255

Графика

11.12.2018, 15:59. Показов 757. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю игру на PascalABC.NET
При переходе на новый уровень возникает непонятный "сдвиг" изображения
Вот кусочек кода:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  var a := new System.Threading.Thread(procedure->
  begin
  //Графика и картинка уже существуют
  //GameMap - изображение карты
  //GameMapgr - её графика
    GameMapgr := Graphics.FromImage(GameMap);
    GameMapgr.Clear(Color.Black);
    //Заливаю изображение чёрным цветом
    for var i := 0 to 3 do
    begin
      GameMapgr.DrawImage(new Bitmap(new BitMap($'MapElements\Part{Random(1,10)}.bmp'), 1920, 1920), 0, i * 3760);
      GameMapgr.DrawImage(new Bitmap(new BitMap($'MapElements\Part{Random(1,10)}.bmp'), 1920, 1920), 3760, i * 3760);
      GameMapgr.DrawImage(new BitMap($'MapElements\Transfer{Random(1,10)}.bmp'), 1880, i * 3760);
      GameMapgr.DrawImage(new Bitmap(new BitMap($'MapElements\Part{Random(1,10)}.bmp'), 1920, 1920), 7520, i * 3760);
      GameMapgr.DrawImage(new Bitmap(new BitMap($'MapElements\Part{Random(1,10)}.bmp'), 1920, 1920), 11280, i * 3760);
      GameMapgr.DrawImage(new BitMap($'MapElements\Transfer{Random(1,10)}.bmp'), 5640, i * 3760);
      GameMapgr.DrawImage(new BitMap($'MapElements\Transfer{Random(1,10)}.bmp'), 9400, i * 3760);
      //Части карты
    end;
    for var i := 0 to 3 do
    begin
      var p1 := new Bitmap($'MapElements\Transfer{Random(1,10)}.bmp');
      p1.RotateFlip(rotatefliptype.Rotate90FlipNone);
      GameMapgr.DrawImage(p1, i * 3760, 1880);
    end;
    for var i := 0 to 3 do
    begin
      var p1 := new Bitmap($'MapElements\Transfer{Random(1,10)}.bmp');
      p1.RotateFlip(rotatefliptype.Rotate90FlipNone);
      GameMapgr.DrawImage(p1, i * 3760, 5640);
    end;
    for var i := 0 to 3 do
    begin
      var p1 := new Bitmap($'MapElements\Transfer{Random(1,10)}.bmp');
      p1.RotateFlip(rotatefliptype.Rotate90FlipNone);
      GameMapgr.DrawImage(p1, i * 3760, 9400);
    end;
    Loaded := true;
  end);
  a.ApartmentState := System.Threading.ApartmentState.STA;
  a.Start;
  SetFontSize(50);
  SetFontColor(Color.White);
  Loaded := false;
  var n: string := '';
  Inc(Level);
  while not Loaded do
  begin
    BeginDraw;
    Buffer.Graphics.Clear(Color.Black);
    case Language of
      Russian: TextOut(xekr div 2 - TextWidth('Пожалуйста подождите' + n) div 2, yekr - 200, 'Пожалуйста подождите' + n, Buffer.Graphics);
      English: TextOut(xekr div 2 - TextWidth('Please wait' + n) div 2, yekr - 200, 'Please wait' + n, Buffer.Graphics);
    end;
    EndDraw;
    if n.Length = 3 then n := ''
    else n += '.';
    Sleep(350);
  end;
  gr := Graphics.FromImage(GameScreen);
  gr.DrawImage(GetView(GameMap, new System.Drawing.Rectangle((1920 - xekr) div 2, (1920 - yekr) div 2, xekr, yekr)), 0, 0);
  Scene := 6;
Интересно то, что при первой загрузке абсолютно такой же карты всё проходит гладко
Нужна помощь, из-за чего это может происходить!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2018, 15:59
Ответы с готовыми решениями:

Графика
uses graphABC; type PianoButtonClass=class private PositionX,PositionY:integer; ...

Графика
Здравствуйте, форумчане. Пытаюсь написать более менее графически приятный калькулятор и пока не совсем успешно. Столкнулся с проблемой...

Графика
uses GraphABC; var a,x1,x2:integer; begin x1:=50; //центр первого круга x2:=500;//центр второго круга repeat circle(x1,200,26);...

11
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
11.12.2018, 16:01  [ТС]
Забыл скриншот
Миниатюры
Графика  
0
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
11.12.2018, 16:43  [ТС]
Проблема решена
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
11.12.2018, 22:58
Прикладывайте весь код лучше, чтоб можно было воспроизвести и запустить отладку. Взглянуть не всегда достаточно.

А насчёт игры - выглядит интересно. Где то будете постить?
Предложу сразу гитхаб (там очень удобно оформить, можно даже сайт сделать на github.io) и тему Проекты на форуме паскаля.
0
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
12.12.2018, 14:03  [ТС]
Sun Serega, Спасибо за предложение, но эта игра идёт как проект в кружок по программированию, и на деле всё не так радужно как кажется, так как для плавного скроллинга не очень подходит System.Drawing, но увы моих знаний по OpengGL пока что не достаточно, чтобы делать игры
Но если хотите, могу прислать её
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
12.12.2018, 14:33
Цитата Сообщение от Get_Over_Here Посмотреть сообщение
так как для плавного скроллинга не очень подходит System.Drawing
Недавно на форуме паскаля выяснилось, что если его правильно использовать - вполне подходит. Дайте весь код, я помогу оптимизировать.
0
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
12.12.2018, 14:38  [ТС]
Sun Serega,
Вложения
Тип файла: rar Lost Souls.rar (6.39 Мб, 10 просмотров)
1
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
12.12.2018, 14:48  [ТС]
Sun Serega, Забыл сказать, чтобы зайти в игру нужно нажать на ручку первой двери
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
12.12.2018, 17:12
Ну хорошо, и где именно что лагает?

Стоит поменять вашу собственную буферизацию на свойство формы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}
 
type
  GameForm=class(System.Windows.Forms.Form)
    
    constructor;
    begin
      self.DoubleBuffered := true;
    end;
    
  end;
 
begin
  
end.
Это должно быть раза в 2 быстрее, чем рисовать на отдельном буфере и кидать результат в основной. Потому что если делать по вашему - на форме приходится всё же рисовать. А если использовать стандартную двойную буферизацию - форма лишь меняет ссылку, на то - откуда брать информацию при послании её экрану.

В остальном - полно костылей, и не используйте картёжное присвоение без особой необходимости, оно очень медленное. Таких мелочей полно, но несколько кадров из них выжать выйдет.

Ну и таймер лучше заменить отдельным потоком, который будет сам за себя просчитывать сколько ожидать перед следующей перерисовкой. Таймер кучу лишнего делает, что убивает производительность.

А ещё в обработчиках нажатий рисовать ничего не стоит, вместо этого надо сохранять информацию о том - что нарисовать, где то в глобальных переменных. Блокировка основного потока рисования это медленно.
1
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
12.12.2018, 17:14  [ТС]
Sun Serega, А я и не говорил что лагает. Меня всё вполне устраивает, но за совет всё равно спасибо
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
12.12.2018, 17:18
Цитата Сообщение от Get_Over_Here Посмотреть сообщение
для плавного скроллинга не очень подходит System.Drawing
А это тогда про что? (ес чо - я чёт засыпаю, могу тупить, объясните как то понятней)
0
79 / 49 / 23
Регистрация: 15.07.2018
Сообщений: 255
12.12.2018, 17:22  [ТС]
Просто по сравнению с каким-нибудь OpenGL или DirectX всё рисуется намного медленнее, ведь насколько я знаю GDI графику рисует процессор(могу и ошибаться)
Ещё раз спасибо за советы, учту в будущем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2018, 17:22
Помогаю со студенческими работами здесь

Графика
1) В центре экрана появляется круг произвольного закраса, с начальным диаметром 10 пикселей. Диаметр плавно увеличивается. 2) При...

Графика
Здравствуйте помогите пожалуйста дорисовать улыбку коту и лапы верхние чтоб он ими держался. Заранее спасибо... ОГРОМНОЕ!!! Program...

Графика
Доброго времени суток. Нужно переделать программу чтобы при нажатии на квадрат счет увеличивался и оставался на экране после респавна...

Графика
Задание простое,есть программа(см.ниже).Нужно дополнить ее чтобы случайным образом закрашивались квадраты как в игре морской бой. Т. е. 1...

Вывод графика
Помогите сделать вывод графика, пожаалуйстаа!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru