Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Заблокирован

Игра "SUPER MARIO" или "SOLDIR OF MARIO"

28.01.2025, 13:58. Показов 26503. Ответов 274
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, дорогие мои братья и сёстры!

Игра "SUPER MARIO" или "SOLDIR OF MARIO"

Да да!

Добавлено через 19 минут
Господь сподобил меня Своей милостью, я, когда-то, писал вот эту игру - она была написана, когда я окончил школу и поступил в ВУЗ, летом.

Видео процесс игры и работа в редакторах кирпичиков, ролик сети 'You Tube', длительность ролика около 9 минут.
Кликните здесь для просмотра всего текста


И, что хочу вот сказать: перед тем, как Господь поднял меня, это было рано, в пятницу 13 февраля 1998 года, я являлся в то время лаборантом на кафедре вычислительных машин. К.г.(*), я написал игру под названием "SOLDIR OF MARIO" - "Солдат Марио", как смесь игры Super Mario (c TV приставки "Dendy") и игры Soldier of Fortune ("Солдат Фортуны") с небольшого ZX-Spectrum компьютера (памяти у него было всего 64 килобайт) в 96-97 годах, летом, почти в то время не спал и не ел, потому что меня накрыла настолько сильная волна поддержки, у меня было постоянно состояние эйфории, пока я, практически не отрываясь от экрана монитора занимался программированием "Soldir of Mario"

И, вот, разработка этой игры очень здорово помогает понять и как устроен и задуман наш мир.

https://github.com/wiz3267/mario

Добавлено через 4 часа 52 минуты
Программистам, которые занимались разработкой игр, лучше, как мне кажется, легче понять, что мир, в котором мы живём, очень интересно устроен. Никаких случайностей, тут, конечно нет. Прежде, чем реализовать проект, Господь размышлял - а какой это будет мир, ад или рай. Если рай, тут одна цветовая гамма, все цветы радуги, небо было необходимо создать голубоватого цвета, траву - зеленого, облака - белыми, хлеб - белый. Но этого мало. Нужно ещё разработать все живые организмы - какова будет взаимосвязь всех животных и существ экосистемы. Нужно создать некоторые вещества, без которых невозможна жизнь любого организма - вода H2O и кислород - просто О2. Также, кроме всего прочего, это вещество должно будет обладать рядом важных для жизни свойств - при 0 градусов оно должно начинать закристаллизироваться и становится жестким, твёрдым веществом, однако свойства у него будут таковы, что оно не будет тонуть в воде. Почему так - в таком случае зимой водоёмы с водой будут покрываться корочкой льда, и можно в таком случае ходить по воде (всем людям). Ну и так далее. Один организм должен будет питаться другим. Главный герой или персонаж этого мира - человек. Человек должен состоять не только из костей и мяса, но как венцу творения у Человека будет бессмертная душа, "Я", сознание и память. Человек будет способен своим сознанием быть в высших сферах подсознания и общаться с Бесконечным Богом.

Каковы должны быть размеры этого мира, продолжительность дня и ночи, продолжительность года, как и вокруг какой оси должен вращаться этот мир, скорость движения вокруг Солнца (основной светильник), какое должно быть расстояние от Солнца до Земли, мощность Солнца, чтобы была возможность жить на планете людям и другим живым существам - короче говоря, чтобы мы, жители планеты Земля, не поджарились летом на Солнце и не замерзли зимой.....и т.д. и пр. и пр., будет ли вокруг этого земного мира вращаться ещё один - планета Луна - если да, то какова должна она быть, радиус планеты Луна, скорость вращения вокруг Земли, скорость вращения вокруг оси и наклон оси, рельеф местности.

Ну и, самое главное, а каков будет сам-то Человек, Венец Творения? Как он должен выглядеть? Потом, по истории строительства нами Вавилонской башни, когда древние люди решили построить башню до неба - Господь расстроил их планы, произвёл разделение языков у строителей Вавилонской башни. До селе, они говорили на одном самом первом древнем первоязыке, а тут они заговорили, вдруг, внезапно, на самых разных языках и наречиях, они перестали понимать друг друга, остановили на время строить башню, заморозили строительство, как бы сказали сейчас, спустились с неё и разбрелись по лицу всей Земли. Всё это написано в книге "История нашей Вселенной - от создания до падения", где самым подробным образом описана история Землян, что случилось с Землянами: почему они, начав за "здравие", окончили уже за "упокой", переубивали друг друга, разрушили сами себя, превратили свою планету в самый настоящий ад. Увы. Чтобы люди на будущее знали, как не следует поступать и жить, смотря на эту трагическую гибель нашего с вами Земного мира - планеты Земля Солнечной Системы Галактики Млечный Путь.
3
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2025, 13:58
Ответы с готовыми решениями:

Super Mario
Привет Ребята! Помогите, пожалуйста, найти ошибку! #include <SFML/Graphics.hpp> using namespace sf; int ground = 400; ...

Super Mario на C++ и OpenGL
Всем привет. Решил написать марио на opengl. Пока это все без текстур. Проблема в том, что уже который день не получается написать...

Персонаж super mario не видит коллизию
помогите пожалуйста с кодом,уже всю голову сломал, персонаж не видит коллизию,проваливается сквозь блоки,прикладываю класс игрока package...

274
Заблокирован
11.08.2026, 22:48  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Раз уж пошло хвастовство ассемблером, год назад, изучая ассемблер risc-v, решил немножко упороться с трехмеркой
Я посмотрел, да, это круто.

А я не то, чтобы хвастаться ассемблером, просто написано это было в 1996 году, я вот смотрю на этот код - сейчас я бы уже так не смог написать. Значит память была нормальная в то время - сколько только одних идентификаторов там, например, через ключевое слово ассемблера extrn - т.е. они находятся в другом файле проекта.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
пленок. Разных. Если вы интересовались компьютерами, возможно, слышали про память на цилиндрических магнитных доменах (ЦМД). Вот принцип тот же, только технология с тех времен шагнула немножко вперед.
Я посмотрел, что это такое. Вы разрабатываете память, получается?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не знаю что такое p-mode. В risc-v есть U-mode (user), S-mode (supervisor), H-mode (hypervisor) и M-mode (machine). "нарушение общей защиты" это, надо полагать, попытка доступа в запрещенную память. Это не прерывание, а исключение. И, как и положено исключениям, выбрасывает выполнение в M-mode. А уже оттуда, если надо, обработчик можно делегировать "вниз", скажем в S-mode, в ядро операционной системы, чтобы уже оно решало что же делать с недобросовестным процессом.
Кстати, когда я осваивал gd32vf103, долго пытался это исключение поймать, но так и не преуспел. Не реализовали там защиту памяти. Хочешь, пиши в область оперативки, хочешь - во флеш, хочешь - вообще в пустое место между ними. Заведомо некорректные операции ядро просто молча проигнорирует. А вот в ch32v303 уже реализовали честно: https://habr.com/ru/companies/... es/866798/
Что такое p-mode (protected-mode)? Сам микропроцессор i486 с заложенными в него возможностями намного опережал своё время, когда была ещё только DOS. Когда компьютер включается, микропроцессор работает в r-mode, начинает выполняться программа из ПЗУ BIOS. Она тестирует оборудование, и если что не так - пишит в динамик точками и тире только звуком. Вот. Изначально компьютер находится в r-mode - так называемый реальный режим, где всё находилось в пределах 1-го мегабайта адресного пространства и любая ошибка при обращении к памяти могла нарушить работу программы и привести к зависанию. Никакой защиты памяти в r-mode нет. И не смотря на то, что i486 был 32-битным микропроцессором и мог адресовать 4 Гб RAM, программист не мог "достучаться" до памяти, которая была выше 1-мегабайта. Чтобы иметь возможность полностью адресовать память и все остальные возможности процессора (изоляция процессов друг от друга, чтобы один процесс не смог случайно или намеренно прочитать или изменить ячейки памяти другого процесса) нужно было перевести его в protected mode.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
11.08.2026, 23:00
Цитата Сообщение от zorxor Посмотреть сообщение
Я посмотрел, что это такое. Вы разрабатываете память, получается?
Это одно из возможных применений. Но скорее - просто изучаем интересные физические эффекты. Возможно, они положат начало новым технологиям, возможно - нет.
Цитата Сообщение от zorxor Посмотреть сообщение
так называемый реальный режим, где всё находилось в пределах 1-го мегабайта адресного пространства
Вот это - одна из причин, почему я никому не рекомендовал бы изучать ЭВМ на примере х86. Ну ладно, делали вы 16-битную машину, было у вас 65к адресов, вам этого показалось мало. Это все понятно и закономерно. Но вот какому наркоману пришло в голову вместо того, чтобы просто объединить два регистра в один 32-битный адрес, склеить их в середине и получить 20-битный?!
Вторая - что х86 всегда был именно процессором. Сложным устройством, взаимодействие с которым должно идти только через операционную систему. То есть что-то простое на ассемблере х86 написать не получится. Обязательно придется дергать функции ОС, Биос или еще какого окружения.
---
Если сейчас кто-то хочет изучать архитектуру ЭВМ, начать лучше всего с 8-битных контроллеров вроде AVR (или PIC, или х51 - но на счет них не уверен, не пробовал). В крайнем случае - risc-v или простых arm.
0
Заблокирован
13.08.2026, 00:27  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть что-то простое на ассемблере х86 написать не получится.
Прикол в том, что у меня дома в 1995 году, наверное, появился мой первый комп с микропроцессором i486, а в школе также сделали класс, но с i386. От приятелей своих, учеников, я на переменах бегал на первый этаж в компьютерный класс и запускал утилиту "debug".

Интернета не было тогда. Но зато был один мужик, который продавал компьютерные книги, руководство по всяким DOS, или по прерываниям. Но что хотел сказать - про уровень вхождения в тему. DOS содержала утилиту debug.com (или .exe точно не помню). И вы сразу же можете писать на ассемблере там, какое нибудь прерывание вызвать BIOS или DOS.

Но что главное хотел сказать, что нельзя что-то простое написать на ассемблере. Можно пользоваться тем, что DOS работала, всё-таки, в текстовом режиме. И текстовый режим - он во-первых очень быстродействующий - один байт используется для сивола, а второй - для цвета. Ну можно было написать разные вещи. И во-вторых очень экономный. Виндуха XP ещё умела работать с текстовым режимом, Far manager, какой-нибудь, можно было переключить в текстовый режим, например, 80x25.

Но далее, корпорация микрософт отказалась от поддержки текстового режима, наверное, чтобы не позориться при тормозах системы.

Добавлено через 1 час 42 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если сейчас кто-то хочет изучать архитектуру ЭВМ, начать лучше всего с 8-битных контроллеров вроде AVR (или PIC, или х51 - но на счет них не уверен, не пробовал). В крайнем случае - risc-v или простых arm.
А вот раньше такого счастья у большинства людей не было, но зато появился компьютер ZX-Spectrum - прямо скажу, удивительная вещь....Мы там такты считали, сколько занимает тот или иной ассемблерный код, во время загрузки или записи с ленты.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
13.08.2026, 07:41
Цитата Сообщение от zorxor Посмотреть сообщение
И вы сразу же можете писать на ассемблере там, какое нибудь прерывание вызвать BIOS или DOS.
Вот только сейчас знания DOS и BIOS бесполезны. Ни то, ни другое не используется уже лет пятнадцать, а то и больше.
Цитата Сообщение от zorxor Посмотреть сообщение
И текстовый режим - он во-первых очень быстродействующий - один байт используется для сивола, а второй - для цвета.
Ага, ага. Еще можно вспомнить всякие Спектрумы и прочие 8-битки, когда рисование графики приходилось втискивать в обратный ход луча.
Вывод несчастных 80х25 = 2000 символов это ну вот совсем не самое узкое место. Современные видеокарты выводят не тысячи, а миллиарды, и не символов, а треугольников. К каждому из которых надо применить несколько шейдеров, да еще растеризовать на пиксельную сетку, да еще к каждому пикселю применить очередную пачку шейдеров. И все это с частотой 60 - 200 Гц. Не те жалкие 30 Гц, которые были потолком для ЭЛТ-мониторов.
Цитата Сообщение от zorxor Посмотреть сообщение
Виндуха XP ещё умела работать с текстовым режимом
Насколько я слышал, последней "графической оболочкой над DOS" была win95. Уже с win98 использовалась эмуляция. А сейчас так и вообще DOSBox существует. По слухам, он эмулирует DOS качественнее самого DOS-а.
Цитата Сообщение от zorxor Посмотреть сообщение
А вот раньше такого счастья у большинства людей не было
Но сейчас-то есть. Глупо им не пользоваться.
Цитата Сообщение от zorxor Посмотреть сообщение
Мы там такты считали, сколько занимает тот или иной ассемблерный код
Ну, при желании этим и сейчас можно позаниматься. Вот, семь лет назад я изучал, как работает софтовый USB на AVR https://habr.com/ru/articles/460815/ Да, там авторам пришлось жестко считать такты, поскольку скорость обмена 1.5 Мб/с, а скорость камня 12 МГц. То есть всего 8 тактов на бит. И ведь уложились!
А вот на современных камнях такты уже особо не посчитаешь. Конвейеры, предсказатели, да даже просто многозадачность, делают скорость выполнения непредсказуемой.
---
Впрочем, недавно я наткнулся на какой-то древний журнал. Радио что ли. И там был ассемблерный листинг под какой-то компьютер того времени. Радио-86рк, возможно. Вот там меня впечатлило, как ассемблерные команды кодируются в бинарный код. Просто глазами видно где номер регистра, а где адрес перехода. Причем переходы там абсолютные, какой адрес указан, туда и перейдет. Понятно, чем это хуже современного подхода с относительными адресами. Но вот в учебных целях - наверняка было отлично. Сейчас, понятное дело, это не более чем музейный экспонат.
1
фрилансер
 Аватар для Алексей1153
6506 / 5757 / 1134
Регистрация: 11.10.2019
Сообщений: 15,405
13.08.2026, 07:49
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Радио что ли. И там был ассемблерный листинг под какой-то компьютер того времени. Радио-86рк, возможно. Вот там меня впечатлило, как ассемблерные команды кодируются в бинарный код. Просто глазами видно где номер регистра, а где адрес перехода. Причем переходы там абсолютные, какой адрес указан, туда и перейдет
86РК
Орион-128

процессор КР580

счастливое детство

Из Радио ещё предлагалось вручную дампы по циферкам перебивать в комп. Что я с радостью делал
1
Заблокирован
13.08.2026, 08:47  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ага, ага. Еще можно вспомнить всякие Спектрумы и прочие 8-битки, когда рисование графики приходилось втискивать в обратный ход луча.
Вывод несчастных 80х25 = 2000 символов это ну вот совсем не самое узкое место. Современные видеокарты выводят не тысячи, а миллиарды, и не символов, а треугольников. К каждому из которых надо применить несколько шейдеров, да еще растеризовать на пиксельную сетку, да еще к каждому пикселю применить очередную пачку шейдеров. И все это с частотой 60 - 200 Гц. Не те жалкие 30 Гц, которые были потолком для ЭЛТ-мониторов.
(*) выделено автором темы, т.е. мной, ТС.

Вы удивитесь, COKPOWEHEU, но что текстовый режим, что палитровый 320x200x1, имели не жалкие 30 Гц, а самые настоящие 70 Гц. И да, даже на том железе, которое у меня было во время разработки игровой программы "Soldir of Mario" - "Солдат Мариа", а это был, как я уже говорил, микропроцессор i486 с тактовой частотой не как сегодня 2 ГГц, а гораздо-гораздо скромней, и память была не 4 Гигабайта, а 4 Мегабайта - ну так даже с такими скромными характеристиками проект уверенно работал 70 кадров в секунду, обеспечивая переброс кадра изображения из обычной памяти в видеопамять посредством цепной инструкции ассемблера rep movsd. И да, именно во время обратного хода луча машины. Я ждал обратного хода луча машины, постоянно считывая регистр состояния. И как только я дожидался этого - бац, и всё - кадр из обычной памяти перебрасывался в видеопамять. Всё элементарно и просто, и не нужно было изучать микрософтский презерватив DirectDraw для этого.

Добавлено через 1 минуту
По моей просьбе папа продал трёхколёсный мотоцикл "Урал" и купил мне компьютер ZX-Spectrum, самодельный, который делали старшие ребята в подвале дома. Для меня это было откровением. Начиная с загрузки картинки прямо в видеопамять этой простой машины ZX-Spectrum с ленты магнитофона, когда ты видишь своими глазами, как звук превращается в изображение и что такое там, 1200, по-мойму, бод. Что это такое, что за скорость поступления данных с магнитофона такая. Короче говоря (далее к.г.) - для меня это было ключевое приобретение во всей жизни. Радости моей не было предела, и, вскоре, от ZX-бейсика я перешел к ассемблеру Z80. Никто бы никогда не поверил, что там 6-7 классник какой-то пишет игру на ассемблере Z80 для Спектрума и постоянно сбрасывает исходник на магнитфонную плёнку, т.к. Спектрум мог сброситься в любой момент, когда, например, заводился холодильник на кухне.

Хотел ещё раз подчеркнуть, что радости моей не было предела, когда папа купил мне по моей просьбе Спектрум. Такой радости у меня больше никогда, наверное, не было. Возможно и была, когда я разрабатывал "Солдата Марио" летом, находясь всё время при этом в состоянии сильной эйфории (я не курил тогда, ни сигареты, ни что покрепче, также не пил кофе алкоголь и пр. да любые вещества для мозга - всё это мне было не нужно - я просто сливался с машиной в одно целое, и Машина Сама могла управлять моими руками в режиме слепой печати. Как хотела Машина, так и делала. Возможно, что это был машинный экстаз - когда человеческое "Я" сливается с "Я" машины, наподобие религиозного экстаза)
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
13.08.2026, 09:44
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Из Радио ещё предлагалось вручную дампы по циферкам перебивать в комп. Что я с радостью делал
Причем не на клавиатуре, а тумблерами с передней панели. Мимо меня это, правда, прошло.
Цитата Сообщение от zorxor Посмотреть сообщение
микропроцессор i486 с тактовой частотой не как сегодня 2 ГГц, а гораздо-гораздо скромней, и память была не 4 Гигабайта, а 4 Мегабайта
Целых 4 мегабайта? Вот, пожалуйста, обсчет трехмерной модели на 72 МГц частоты ядра и 20 кБ оперативки: https://habr.com/ru/articles/496046/
Но, конечно, протокол общения с дисплеем по SPI, это далеко не просто запись байтиков в видеопамять.
Как я уже говорил, даже сейчас есть место байтокрутству, не обязательно для этого изучать музейные экспонаты.
Цитата Сообщение от zorxor Посмотреть сообщение
И да, именно во время обратного хода луча машины.
А сейчас эти костыли уже не нужны: памяти за глаза хватает и на двойную и на тройную буферизацию. И вот это, кстати, важный учебный момент - как сделать чтобы картинка не мерцала.
Цитата Сообщение от zorxor Посмотреть сообщение
Всё элементарно и просто, и не нужно было изучать микрософтский презерватив DirectDraw для этого.
Верно. Вот только сейчас, в век многозадачных операционных систем, никто вашу программу не пустит к железу напрямую. Все только через прослойку операционной системы, которая будет регулировать права доступа, разрешать конфликты и т.д.
Впрочем, даже здесь можно извратнуться - писать EFI-программы. В отличие от MSDOS, это хотя бы теоретически может быть полезным.
0
Заблокирован
13.08.2026, 16:20  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Верно. Вот только сейчас, в век многозадачных операционных систем, никто вашу программу не пустит к железу напрямую. Все только через прослойку операционной системы, которая будет регулировать права доступа, разрешать конфликты и т.д.
А вы знаете, я выделил целый компьютер с DOS под это дело. Старый, раритетный. Монитор - ЭЛТ, мышка - с шариком. 32 Мб оперативки. И чудное дело - делай что хочешь, вся машина полностью в твоём распоряжении. Всё железо машины раскрыто через порты ввода/вывода. Хочешь - реальный режим, хочешь защищенный и хочешь виртуальный. Интересно было - жутко.

По поводу эмулятора DOS - да, работает, но такой точности, как при реальном железе не получается. 70 кадров за одну секунду времени. Никак. То картинка тормозит, то ещё что. У меня вот, программа, которая отображает стрелочные часы и бегущую строку работает идеально, без пропуска кадров и прочее. Одна из стрелок часов делает один оборот за одну секунду, без лагов. Когда работает на реальном железе, а не на виртуальном:



Хочешь - программируй машину. Хочешь - сбрасывай машину. Что хочешь, к.г., то и делай.

Добавлено через 1 час 55 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Целых 4 мегабайта? Вот, пожалуйста, обсчет трехмерной модели на 72 МГц частоты ядра и 20 кБ оперативки: https://habr.com/ru/articles/496046/
Но, конечно, протокол общения с дисплеем по SPI, это далеко не просто запись байтиков в видеопамять.
Как я уже говорил, даже сейчас есть место байтокрутству, не обязательно для этого изучать музейные экспонаты.
Я тоже на ардуино делал программу, там был маленький экран, чувствительный к нажатию. Но потом, со временем, чувствительность плёнки упала до нуля. Я уж не знаю, по SPI там работало или ещё как-то. Я пользовался готовой библиотекой:

C++
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
// 220x176 pixels.
//New Tastement for Arduino
 
//идея сделать переход к следующему псалму (главе) или к началу и к предыщей главе
//так же линиями обозначить места где касаться тачпаду
//перенос одной буквы на следующую строку
 
#define TRUE 1
#define FALSE 0
#include <SPI.h>
#include <SD.h>
 
#include <UTFT.h>
#include "TouchScreen.h"
//#include <spi.h>
#include <time.h>
 
int A5_init = 0;
int test_touch(int &x, int &y);
char need_write_settings = 0;
 
#define DELAY_ONE_SYMBOL 90
 
#define DEBUG_MODE 0
 
char * FILE_SETTINGS = "sett.dat";
 
 
 
void text_find_prev_stih()
{
  setup_card();
 
  File myFile = SD.open("bible3.txt");
 
  int flg = 0; //счетчик нахождения символа перевода строки
  if (!myFile) return;
 
  setting.pos -= 3;
 
  while (1)
  {
    myFile.seek(setting.pos);
    unsigned char a;
    a = myFile.read();
    setting.pos--;
    if (a == 10)
    {
      flg++;
      if (flg == 2) break;
    }
  }
 
  myFile.close();
  SPI.end();
}
 
void skip_file_to_enter()
{
  setup_card();
 
  File myFile = SD.open("bible3.txt");
 
  if (myFile)
  {
    myFile.seek(setting.pos);
 
    while (1)
    {
 
      unsigned char a;
      a = myFile.read();
 
 
      if (a == 13 || a == 10)
      {
        a = myFile.read();
        setting.pos++;
        break;
      }
      setting.pos++;
    }
 
    myFile.close();
  }
  SPI.end();
}
 
int find_symbol(unsigned char f, unsigned char k=' ')
{
  setup_card();
  unsigned long cnt = 0;
  File myFile = SD.open("bible3.txt");
  unsigned char a,t;
  if (myFile)
  {
    myFile.seek(setting.pos);
 
    while (1)
    {
      a = myFile.read();
      setting.pos++;
      cnt++;
      if (cnt >= 265535.0) break;
 
      if (a == f)
      {
        if (k==' ') break;
        else {
          myFile.read();
          t=myFile.read();
          if (t==k) 
          {
            setting.pos+=2;
            cnt+=2;
            break;
          }
        }
      }
    }
 
    myFile.close();
  }
 
  SPI.end();
  if (a == f) return 1;
  else return 0;
}
 
void read_sd_card()
{
  setup_card();
  //Serial.write("read_sd_card()\n");
  File myFile = SD.open("bible3.txt");
 
  if (myFile)
  {
    //Serial.write("Read file\n");
 
 
    myFile.seek(setting.pos);
 
 
    int p = 0;
    while (1)
    {
 
      unsigned char a;
      a = myFile.read();
      txt2[p] = a;
      txt2[p + 1] = 0;
 
      setting.pos += 1;
 
      if (p >= (BUF_SIZE - 1)) break;
 
      if (a == '(' && (setting.mode & MODE_RND)) flag_rnd = 1;
 
      if (a == 13 || a == 10)
      {
        txt2[p] = ' ';
        myFile.read();
        setting.pos++;
        break;
      }
      p += 1;
    }
 
    myFile.close();
    //rnd_text();
    Serial.write((char*)txt2);
  }
  //else
  //{
    //Serial.write("Can't open file\n");
  //}
 
  SPI.end();
}
 
const int chipSelect = 5;
 
int setup_card()
{
  //Serial.write("setup_card()\n");
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  int err = SD.begin( chipSelect );
  if ( !err)
  {
    //Serial.println("ini SD-card failed ");
    SPI.end();
    tft.setColor(0, 0, 0);
    //tft.print("SD-card failed", 0, 0);
 
    return FALSE;
  }
  else
  {
    //Serial.println("ini SD-card ok!\n");
    return TRUE;
  }
 
}
 
 
 
int wait_press()
{
  int x, y;
 
  while (1)
  {
    if (test_touch(x, y)) return 1;
 
    delay(1);
  }
 
}
 
void write_settings()
{
 
  setup_card();
 
  if (SD.exists(FILE_SETTINGS))
  {
    SD.remove(FILE_SETTINGS);
  }
 
  File myFile = SD.open(FILE_SETTINGS, FILE_WRITE);
 
  if (myFile)
  {
    int len = sizeof(SETTING);
    myFile.seek(0);
 
    int n = myFile.write((char*)&setting, len);
    myFile.close();
 
    //Serial.write("Write file ");
    //Serial.write(FILE_SETTINGS);
   // Serial.write(" = ");
 
    //Serial.print(n);
    //Serial.print(" ");
 
 
    /*for (int k = 0; k < len; k++)
    {
      int b = ((unsigned char*)&setting)[k];
      Serial.print(b);
      Serial.print(" ");
    }*/
 
    //Serial.write("\n");
  }
 /* else
  {
    Serial.write("Can't open ");
    Serial.write(FILE_SETTINGS);
    Serial.write(" for write\n");
  }
  */
 
  SPI.end();
}
 
void load_settings()
{
  setup_card();
  File myFile = SD.open(FILE_SETTINGS);
 
  if (myFile)
  {
    //Serial.write("Read file ");
    //Serial.write(FILE_SETTINGS);
    //Serial.write(" = ");
 
    int len = sizeof(SETTING);
    int n = myFile.read(&setting, len);
 
    //Serial.print(n);
    //Serial.print(" ");
 
    /*for (int k = 0; k < len; k++)
    {
      int b = ((unsigned char*)&setting)[k];
      Serial.print(b);
      Serial.print(" ");
    }*/
 
    //Serial.write("\n");
 
    myFile.close();
  }
  /*else
  {
    Serial.write("Can't open ");
    Serial.write(FILE_SETTINGS);
    Serial.write("\n");
  }*/
 
  SPI.end();
 
}
 
//влияет на обмен SD-картой
//после Serial.write невозможно записать данные в файл
//void mes(char *m)
//{
//Serial.write(m);
//Serial.write("\n");
//}
 
char buf[16];
 
void pause_fun()
{
  
  
  message("PAUSE", MAX_Y - scaleH - 1, 1);
  //tft.rect(0,0,219,176);
  
  if (setting.mode&MODE_PAUSE) {delay(1000);}
  else
  { 
    setting=old_setting;
    setting.mode|=MODE_PAUSE;
    write_settings();
  }
  
  int x,y;
  while (!test_touch(x, y));
 
  setting.mode^=MODE_PAUSE;
  //tft.line(0,0,100,100);
}
 
 
//проверка, что точка (x,y)  находится в прямоугольнике (x1,y1)-(x1+len,y2+hei)
int test_rect(int x, int y, int x1,int y1,int len,int hei, int draw=0)
{
  if (x>=x1 && x<=(x1+len) && y>=y1 && y<=(y1+hei)) 
  {
    if (draw)
    {
      /*for(int i=0; i<5;i++)
      {
        tft.fillRect(x1, y1, x2-x1, y2-y1, GREEN);
        delay(200);
        tft.fillRect(x1, y1, x2-x1, y2-y1, BLACK);
        delay(200);
      }*/
 
    }
 
    return 1;
  }
  else return 0;
}
 
int pause_pause(int x,int y)
{
        setting.mode |= MODE_PAUSE;
 
 
        bool wr = 1;
 
        while (1)
        {
          setting.mode ^= MODE_RND;
          int f = setting.delay_one_symbol;
          sprintf(buf, "PAUSE %i", f);
          ///itoa(f, buf,10);
          message(buf, 0);
          sprintf(buf, "MODE %i", setting.mode);
          message(buf, 20, 1);
 
          if (setting.mode & MODE_RND)
          {
            message("RND ON", 50, 1);
          }
          else
          {
            char *str = "RND OFF";
            //str[3] = 'O';
            message(str, 50, 1);
          }
 
          while (!test_touch(x, y));
 
 
          #define DELTA_X 60
          
          if (x < DELTA_X && setting.delay_one_symbol >= 1) 
          {
            setting.delay_one_symbol -= 10;
            wr = 1;
          }
          
          if (x > (MAX_X - DELTA_X)) 
          {
            setting.delay_one_symbol += 10;
            wr = 1;
          }
          old_setting=setting;
          
          if (y > (MAX_Y - 50)) break;
 
        }
 
        setting.mode ^= MODE_PAUSE;
        if (setting.delay_one_symbol == 0) 
        {
          message("PAUSE OFF");
        }
        else
        {
          message("SAVE ...");
        }
}
 
void  fun_find_zvezd()
{
          message("FIND *");
          char r = find_symbol('*');
 
          if (r)
          {
            message("FIND * ok");
            delay(500);
 
          }
          
}
 
void print_num(int x,int y,int num)
{
 
  if (num<=9)
  {
      printMyCharWH(x,y,15,16, '0'+num, 0,255,255,true,false);
  }
  else
  {
      printMyCharWH(x,y,15,16, '0'+num/10, 0,255,255,true,false);
      printMyCharWH(x+15,y,15,16, '0'+num%10, 0,255,255,true,false);
  }
      
}
 
//рисует сетку с цифрами и ждет нажатия на клетку
//возвращает номер нажатой клетки
int draw_grid()
{
  int stepx=MAX_X/4;
  int stepy=MAX_Y/4;
  int r=255,g=255,b=255;
  int k=0;
  int x1=0,y1=0, x,y;
 
  char buf[8];
 
  for(x=0; x<MAX_X; x+=stepx)
  {
    for(y=0; y<MAX_Y; y+=stepy)
    {
      r=255.0*y/MAX_Y;
      g=255.0*x/MAX_X;
      b=127.0;
      tft.fillRect(x,y,stepx,stepy, myGetColor(r,g,b));
      print_num(x,y,k);
      //?????
      k++;
    }
  }
  while(1) {
  while (!test_touch(x1, y1))
  {
  }
  
 
  k=0;
  for(x=0; x<MAX_X; x+=stepx)
  {
    for(y=0; y<MAX_Y; y+=stepy)
    {
      
      if (x1>=x && x1<=(x+stepx) && y1>=y && y1<=(y+stepy))
      {
        for(int z=0;z<10;z++)
        {
          tft.fillRect(x,y,stepx,stepy, rand());
          //if (test_touch(x1,y1)) break;
        }
        //if (k==0) 
        return k;
      }
 
      k++;
    }
  }
  
  }
 
  return k;
}
 
void loop()
{
 
  //Serial.write("loop()\n");
 
  while (1)
  {
    old_setting=setting;
    read_sd_card();
    if (strlen(txt2) == 1)
    {
      if (txt2[0] == ' ') continue;
      else break;
    }
    else break;
  }
 
 
  int cnt_ostatok = test_tft();
  int flag_continue = 0;
 
  //220x176 pixels.
  //0      110      220
  /////////////////////
  //       //        //
  //       //        //
  //88/////////////////
  //       //        //
  //176    //        //
  /////////////////////
  for (int k = 0; k < cnt_ostatok; k++)
  {
    delay(setting.delay_one_symbol);
    if (setting.delay_one_symbol == 0) k--;
    int x=-1, y=-1;
    if (setting.mode & MODE_PAUSE)  pause_fun();
    
    if (test_touch(x, y))
    {
      int d = 50;
 
      if (test_rect(x,y, 55,132, 110, 44))   pause_fun();
      if ( test_rect(x,y, 110 - d, 88 - d, d*2, d*2)) 
      {
        pause_pause(x,y); write_settings(); effect();
        cnt_ostatok = test_tft(); k = 0; continue; 
      }
 
      if (test_rect(x,y, 0,MAX_Y-40, 55, 40)){message("RANDOM");rnd_text();}
      
      if (test_rect(x,y, 0,0, 55,44)){fun_find_zvezd();break;}
      
      if (test_rect(x,y, MAX_X-55, 132, 55 ,44)) {flag_continue = 1;break;}
 
      //поиск предыдущей главы
      if (test_rect(x,y, MAX_X-55, 0, 55,44)) {flag_continue = 2;break;}
 
      //поиск предыдущего стиха
      if (test_rect(x,y, MAX_X/2-20, 0, 55,44)) {flag_continue = 3;break;}
 
      if (test_rect(x,y,165,88-15, 30,30, 1))
          {
            for(int i=0; i<3;i++)
            {
              tft.fillRect(165,88-15,55, 30, GREEN);
              delay(20);
              tft.fillRect(165,88-15,55, 30, BLACK);
              delay(20);
              
            }
 
            int n=draw_grid();
            if (n==0)
            {
 
            setting.pos = 0;
            setting.mode = MODE_NORMAL | MODE_RND;
  
            message("RESET");
            find_symbol('*');             
            delay(1000);
            write_settings();
            }
            if (n>=1 && n<=9)
            {
                message("FIND ...");
                setting.pos = 0;
                setting.mode = MODE_NORMAL;
                find_symbol('*', '0'+n);             
            }
              if (n==10)
              {
                scaleW-=2;
                scaleH-=2;
              }
              if (n==11)
              {
                scaleW+=2;
                scaleH+=2;
              }
            
            
          }
 
    }
  }
 
  if (flag_rnd && !flag_continue)
  {
    rnd_text();
    flag_rnd = 0;
  }
 
  if (flag_continue == 2)
  {
      //test_scroll();
      message("P GL");
      text_find_prev();
  }
 
  if (flag_continue == 3)
  {
      //test_scroll();
      message("P ST");
      text_find_prev_stih();
  }
  //
 
}
 
/*void    test_scroll()
{
      cbi(tft.P_CS, tft.B_CS);    
      
      tft.LCD_Write_COM_DATA(0x31,MAX_X);
      tft.LCD_Write_COM_DATA(0x32,0);
      tft.setColor(0);
      for(int i=0; i<=MAX_X;i++)
      {
        cbi(tft.P_CS, tft.B_CS);    
        tft.LCD_Write_COM_DATA(0x33,i);
        
        tft.drawVLine(MAX_X-i,0,MAX_Y);
        sbi(tft.P_CS, tft.B_CS);    
        delay(1);
      }
    
      sbi(tft.P_CS, tft.B_CS);    
}*/
 
int menu(char**str, int c)
{
  tft.clrScr();
  int step_y=20;
  for(int i=0; i<c; i++)
  {
    message(str[i], i*step_y,1);
  }
  wait_press();
  
}
0
Заблокирован
14.08.2026, 10:20  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Целых 4 мегабайта? Вот, пожалуйста, обсчет трехмерной модели на 72 МГц частоты ядра и 20 кБ оперативки: https://habr.com/ru/articles/496046/
Но, конечно, протокол общения с дисплеем по SPI, это далеко не просто запись байтиков в видеопамять.
Как я уже говорил, даже сейчас есть место байтокрутству, не обязательно для этого изучать музейные экспонаты.
Да, здорово, посмотрел. Красиво, квалифицированно <...sorry...skip...>Как у вас называется специальность, на которую вы учились в ВУЗе?
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
14.08.2026, 13:33
Цитата Сообщение от zorxor Посмотреть сообщение
А вы знаете, я выделил целый компьютер с DOS под это дело.
Во времена вашей молодости - хорошо. Если увлекаетесь ретро-железом до сих пор - замечательно.
Но вы свою программу позиционируете как обучающую. Сейчас, в 2026 году, обучать DOS-у и подходам того времени - вредительство.
Еще раз говорю. Если хотите принести пользу окружающим как учитель, поделиться опытом - переделайте.
Либо подход "от истории" - примитивная реализация на MSDOS ("как тогда просто это решалось") - перенос на winGDI или какой-нибудь SDL ("в целом, такой подход применим и сейчас") - перенос на шейдеры OpenGL / Vulkan ("а вот так принято в современном мире"). И уже в самом конце перейти от демонстрационных заготовок к полноценной игре. Загрузка текстур, несколько уровней, настройки меню и управления, рекорды, сеть, ... В общем, на что фантазии хватит.
Либо сразу начать с последнего пункта, выкинув всю остальную древность.
Либо, извратский вариант, переписать все это на EFI. Мол, под винду пишут все, кому не лень, а давайте обойдемся без операционки вообще.
Цитата Сообщение от zorxor Посмотреть сообщение
как у вас называется специальность, на которую вы учились в ВУЗе?
"электроника и наноэлектроника". Поэтому и могу рассказать про технологию изготовления микросхем. А вот программирования у нас считай не было.
0
Заблокирован
14.08.2026, 17:08  [ТС]
Также, кроме всего прочего, первая эйфория у нас в классе наступила, когда мы, 5-классники, 10-летние дети увидели впервые, японскую машину MSX-2.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
"электроника и наноэлектроника". Поэтому и могу рассказать про технологию изготовления микросхем. А вот программирования у нас считай не было.
А у меня, конечно, да, программирования было нормально, а вот с железом не очень. А как микросхемы делают - ну, я даже и не знаю... слышал, что якобы из песка там, или что-то ещё, короче сваривают в одно целое обычный песок или кварц, ещё что. И что-там ещё делают - к.г. - тончайшую пластину из кремения, на которой уже реализуют, в смысле формируют, логику микропроцессора. Ну как-то так, скорее всего это больше похоже на мой вымысел - но таковы у меня представления в этой теме. Я, конечно, не железячник.
0
Заблокирован
14.08.2026, 17:51  [ТС]
Ок, теперь, если вы не против, я хочу опять вернуться к базису этой темы - реализации проекта "Солдат Марио". Из каких же составных частей состоит эта игровая программа? Как она устроена изнутри? На чём жиждится? Как работает графика?

Графика уровня состоит из титлов. Что такое титл? Титл - это своего рода "коробка", это изображение на плоскости, одинаковое по X и Y. Титлы рисуются так, что большинство из них можно размещать рядом, и они при этом будут сливаться в одно.

Это кадр из редактора уровней.

0
Заблокирован
14.08.2026, 17:55  [ТС]
Это кадр выбора титла в редакторе уровней - стрелки вверх, вниз, вправо, влево, <enter> - выбор и возврат в редактор



Так представлен в проекте заголовочный файл Level.h
Для лучшего понимания я привожу полностью этот файл, а ниже - часть исходника, в котором зашиты атрибуты кубика (титла).

C++
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//Level.h
#ifndef __WIZLEVEL_H
#define __WIZLEVEL_H
 
#include "sprite.h"
#include "rects.h"
 
//класс LEVEL предназначен для описания уровня
class LEVEL
{
// !!! ВНИМАНИЕ !!! При добавлении новых данных их можно дописывать
// ТОЛЬКО в конец текущего описания. В противном случае
// чтение прежних файлов level???.dat станет невозможным
// не меняйте порядок следования и тип данных, если хотите читать старые файлы уровней
//************************ ЗАГОЛОВОК ФАЙЛА УРОВНЯ *********************
private:
    unsigned long SIGNATURE;//сигнатура структуры
    WORD sizeofLevel;   //размер структуры в байтах
    SPRITE *spr;        //указатель на используемый класс спрайтов
public:
    WORD x,y;           //координаты окна показа уровня
    WORD MaxX,MaxY;     //максимальные координаты показа уровня
    WORD Len;           //ширина уровня в кубиках
    WORD Hei;           //высота уровня в кубиках
    WORD BoxLen;        //ширина кубика в пикселях
    WORD BoxHei;        //высота кубика в пикселях
private:
    WORD *Data;         //указатель на данные
public:
    WORD MarioX,MarioY; //координаты марио
    WORD BackgroundColor;//цвет заднего плана в данном уровне и флаги
    WORD Time;           //время, за которое надо пройти этот уровень
//************************ КОНЕЦ ЗАГОЛОВКА ФАЙЛА УРОВНЯ ***************
 
//************************** МЕТОДЫ ****************************
public:
    void ConvertNumber(int num, char width, char far * dest);
    int  Editor(int n);         //редактор уровня n
    LEVEL(int len, int hei,SPRITE *spr); //конструктор создание уровня
    ~LEVEL();                   //деструктор
    int  Load(int n);           //загрузка уровня n
    void New(int len,int hei);  //создание нового уровня
    int  Read(int x,int y);     //считать один кубик из уровня
    int  ReadXY(int x,int y)    //считать из уровня кубик (точность до пикселя)
    {
        return Read(x/BoxLen,y/BoxHei);
    }
    int  Save(int n);           //запись уровня  n
    void Show();                //нарисовать уровень
    void Show(int x,int y,char=SHOW_BACKGROUND|SHOW_FOREGROUND);    //нарисовать уровень с заданной позиции
    void Write(int x,int y,int what);//записать в уровень
    
    //записать в уровень кубик
    //x,y - пиксельные координаты
    //what - код кубика вместе с атрибутами
    void WriteXY(int x,int y,int what)
    {
        Write(x/BoxLen, y/BoxHei,what);
    };
 
public:
    enum {
        MASK=0x1ff
    };
 
    //свойства кубика
    enum box_logic{
        BACKGROUND  =0x8000,    //кирпич есть задний  фон(для всех объектов
                            //он равнозначен пустоте)
        ALIEN       =0x4000,//это не кубик, а код кубика задает номер чужого
        FOREGROUND  =0x2000,//этот кирпич будет поверх всех объектов
        logTRANSP   =BACKGROUND,    //"логически прозрачный"
        TRANSPARENTPIXELS=0x1000,   //кирпич имеет прозрачные пикселы(иначе неимет)
        DESTROYED   =0x0800,    //кирпичик может разрушаться
        COLLAPSE    =0x0400,    //кирпичик обваливается под ногами
        PULL=DESTROYED | FOREGROUND, //кирпичик, когда разрушается, тащит все за собой
        //действительно только для чужих
        //AGAIN=FOREGROUND  //чужой должен появиться снова, если его загасят
    };
 
    //как показывать уровень
    enum {
        SHOW_DEBUG      =0x01,  //показывать отладку
        SHOW_BACKGROUND =0x02,  //показать задний план
        SHOW_FOREGROUND =0x04   //показать передний план
    };
 
    enum {
        FLAG_UNDERWATER=0x8000   //этот уровень - подводный
    };
}; //class LEVEL
 
#endif

У каждого кубика (титла) есть также свои атрибуты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//свойства кубика
    enum box_logic{
        BACKGROUND  =0x8000,    //кирпич есть задний  фон(для всех объектов
                            //он равнозначен пустоте)
        ALIEN       =0x4000,//это не кубик, а код кубика задает номер чужого
        FOREGROUND  =0x2000,//этот кирпич будет поверх всех объектов
        logTRANSP   =BACKGROUND,    //"логически прозрачный"
        TRANSPARENTPIXELS=0x1000,   //кирпич имеет прозрачные пикселы(иначе неимет)
        DESTROYED   =0x0800,    //кирпичик может разрушаться
        COLLAPSE    =0x0400,    //кирпичик обваливается под ногами
        PULL=DESTROYED | FOREGROUND, //кирпичик, когда разрушается, тащит все за собой
        //действительно только для чужих
        //AGAIN=FOREGROUND  //чужой должен появиться снова, если его загасят
    };
0
Заблокирован
14.08.2026, 19:36  [ТС]
Также, кроме всего прочего, первая эйфория у нас в классе наступила, когда мы, 5-классники, 10-летние дети (13 мальчиков и 2 девочки - все мы были из одного класса) увидели впервые в жизни настоящий нормальный и классный компьютер - с видео- и с аудио- схемой компьютер, японскую машину MSX-2. А год-то тогда был, если я 1979 года рождения + 10 лет = 1989 год это был. В СССР компьютеры были только в школах, институтах и пр. Только спустя несколько лет, когда во всю стали делать самодельные ZX-Spectrum - народ тогда, более-менее вздохнул свободней. Приближался крах Советского Союза. Мы из 3-класса перепрыгнули сразу в 5-класс.

Вторая волна эйфории коснулась лично меня, когда папа подарил мне по моей просьбе бытовой компьютер ZX-Spectrum.

Цитата Сообщение от zorxor Посмотреть сообщение
На чём жиждится этот проект?
Жиждится этот проект на нескольких играх: игра "Wiz" с платформы MSX, игра "Soldier of Fortune" с платформы ZX-Spectrum и игра "Super Mario" с платформы Nes, и, также, отчасти, игра "Rick Dangerous" с платформы ZX-Spectrum. немаскируемое прерывания
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
14.08.2026, 20:23
Цитата Сообщение от zorxor Посмотреть сообщение
А как микросхемы делают - ну, я даже и не знаю... слышал, что якобы из песка там
Если вам это интересно, в интернете все процессы с теми или иными подробностями расписаны. Если нет, то нет и смысла забивать себе голову. Вряд ли ведь вы пойдете работать технологом куда-нибудь на Микрон.
Цитата Сообщение от zorxor Посмотреть сообщение
Ок, теперь, если вы не против, я хочу опять вернуться к базису этой темы - реализации проекта "Солдат Марио".
Надо полагать, что рекомендации вы решили напрочь проигнорировать.
0
Заблокирован
14.08.2026, 21:36  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Надо полагать, что рекомендации вы решили напрочь проигнорировать.
Нет, ни в коем случае! Просто поймите меня правильно: я этот проект делал очень и очень давно. Я хочу просто заново вспомнить его и структоризировать вначале, а чуть позже - реструктизировать. То есть вспомнить проект, основные его части. И когда это будет сделано, вот тогда уже можно будет и учебный проект сделать, когда первая фаза будет завершена.

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

Добавлено через 7 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А как микросхемы делают - ну, я даже и не знаю... слышал, что якобы из песка там
Если вам это интересно, в интернете все процессы с теми или иными подробностями расписаны. Если нет, то нет и смысла забивать себе голову. Вряд ли ведь вы пойдете работать технологом куда-нибудь на Микрон.
Когда у меня своё нормальное состояние, мне в таком случае становится всё интересно.

Если превалирует какая-то сонливость, вялость мозга, апатия - тогда мне становится всё безразлично и я иду заваливаться в кровать спать.
0
Заблокирован
15.08.2026, 01:32  [ТС]
Атака босса:



ok, давайте тогда так: основной концепт заключается в том, что мы пишем всё сами. Конкретно - класс SCREEN - он осуществляет графику в свой внутренний буфер. И какая там ос будет - это дело двадцатое. Под ДОС просто можно цепную инструкцию применить - rep movsd, когда дело дошло до адаптации всего проекта в виндоус - пришлось вместо простой инструкции асм разбираться в презервативах, что я крайне не люблю делать. Читать чужие инструкции и чужой код. На кой мне всё это надо, не знай. Кто хочет - пусть капается в презервативах микрософтских, типа DirectDraw.

C++
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
bool CopyDoubleBufferToScreen(LPDIRECTDRAWSURFACE pSurface)
{
    //проверка на "потерю" поверхности
    if (pSurface->IsLost())
    {
        //восстанавливаем поверхность в данном случае
        pSurface->Restore();
    }
 
    DDSURFACEDESC ddSDesc={0};
    bool ok=false;
 
    ddSDesc.dwSize=sizeof(DDSURFACEDESC);
 
    //блокируем поверхность, получая указатель на данные
    HRESULT result = pSurface->Lock(NULL, &ddSDesc,
        DDLOCK_SURFACEMEMORYPTR| DDLOCK_NOSYSLOCK,NULL);
 
    if (result==DD_OK)
    {
        UINT hei=ddSDesc.dwHeight;
 
        char *buf= (char*) ddSDesc.lpSurface;
        int z=0;
 
        //исходные данные (буфер 320x200 точек) 1 байт на точку
        BYTE *sourc=scr.DoubleBuffer;
 
        int add_pitch=ddSDesc.lPitch;
 
 
        COLORREF screendata[320*200];
 
        scr.ConvertDoubleBufferToTrueColor(screendata);
 
        //исходные данные - 4 байта на точку
        sourc=(BYTE*) screendata;
 
        //если установлено соотвествующее разрешение
        //корректируем расположение буфера
        if (DISPLAY_HORIZONTAL>= 640 && DISPLAY_VERTICAL>=400)
        {
            int ScaleX=2,ScaleY=2;
 
            //центровка oX
            buf+=(ddSDesc.dwWidth*4-320*4*ScaleX)/2;
            //buf+=WindowRect.left*4;
 
            //центровка oY
            buf+=(ddSDesc.dwHeight-200*ScaleY)/2*add_pitch;
            //buf+=ddSDesc.dwWidth*WindowRect.top;
 
 
            //ВНИМАНИЕ!! верно только для разрешения не ниже 640x400
            for(int i=0; i<200;i++)
            {
                _asm 
                {
                    pusha
                    mov edx,ScaleY
                l2:
                    mov esi,sourc
                    mov edi,buf
                    mov ecx,320
                    cld
                l1:
                    lodsd
                    stosd
                    stosd
                    loop l1
                    mov eax,add_pitch
                    add buf,eax
                    dec edx
                    jnz l2
                    popa
                }
                sourc+=320*4;
            }
 
        }
 
        pSurface->Unlock(ddSDesc.lpSurface);
        ok=true;
    }
 
    return ok;
 
}
0
Заблокирован
15.08.2026, 01:39  [ТС]
Цитата Сообщение от zorxor Посмотреть сообщение
На чём жиждится этот проект?
Жиждится этот проект на нескольких играх: игра "Wiz" с платформы MSX, игра "Soldier of Fortune" с платформы ZX-Spectrum и игра "Super Mario" с платформы Nes, и, также, отчасти, игра "Rick Dangerous" с платформы ZX-Spectrum. немаскируемое прерывания
Простите, что не успел исправить. Хотел написать, что ребята, которые паяли спектрумы, вдруг, объявили о новой прошивке ROM 16 Kb. Там внесли изменения в этот ROM, и, поэтому, мне они по моей просьбе припаяли прямо к ножке немаскируемого прерывания процессора проводок, конденсатор и кнопочку, на которою, если нажать - вылезет внутренний отладчик. ASM там конечно не было никакого - только состояние регистров и машинный код и дамп памяти. Но зато теперь можно было прерывать игры и изучать их внутреннею структуру.
0
Заблокирован
15.08.2026, 02:04  [ТС]
Это фотография главного экрана игровой программы:
Миниатюры
Игра "SUPER MARIO" или "SOLDIR OF MARIO"  
0
Заблокирован
16.08.2026, 09:52  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ага, ага. Еще можно вспомнить всякие Спектрумы и прочие 8-битки, когда рисование графики приходилось втискивать в обратный ход луча.
Вывод несчастных 80х25 = 2000 символов это ну вот совсем не самое узкое место. Современные видеокарты выводят не тысячи, а миллиарды, и не символов, а треугольников. К каждому из которых надо применить несколько шейдеров, да еще растеризовать на пиксельную сетку, да еще к каждому пикселю применить очередную пачку шейдеров. И все это с частотой 60 - 200 Гц. Не те жалкие 30 Гц, которые были потолком для ЭЛТ-мониторов.
Простите меня, но я не знаю все эти шейдеры, растеризовать - что это такое, как и почему. У нас в институте был курс компьютерной графики. Но я не люблю матрицы. Это не моё. Все люди разные. Пусть кто-то тащится от всех этих манипуляций с матрицами, но только точно не я. Я работаю в достаточно узкой области - программирование железа. Мне нравится работа с железом. Мне нравится low level работа. А использовать чужие библиотеки кода, когда ты сам в состоянии сделать не хуже точно, а напротив ещё - красиво и лаконично. Я не люблю презервативы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2026, 09:52

Nintendo отмечает 20-летие игры Super Mario Kart
Японский издатель компьютерных игр и разработчик игровых консолей Nintendo отмечает 20-летие с момента выхода первой из серии игр Super...

Игра в стиле Mario (SFML)
Решил попробовать написать игру в стиле марио. Это моя первая игра на с++ если что. Писал в VS 2013, для написания игры решил...

Поиск пути в массиве для фигуры 2х1(или попытка в ИИ для игры Dr.Mario)
Давно в 1990-х была такая игра на приставку Dendy. Вот задумал написать реализацию на делфи,а чтобы было не скучно,сделать режим...

Mario
Всем привет! Я студент первого курса, и в данный момент выполняю курсовую работу в виде игры &quot;Марио&quot;. Большая часть работы...

Mario c++
Здравствуйте, преподаватель задал написать всеми известную игру &quot;Марио&quot; на чистом с++, без использования каких-либо библиотек. Видел в...


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

Или воспользуйтесь поиском по форуму:
260
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru