Еще одна интересная игра. Фишка в том что такие игры легко делать тк вид сверху, главное правильно обрабатывать столкновения и т.д. Ошибка разрабов что они сделали гонку по кругу(моск плохо решает задачу управления задом) вместо того чтобы всегда ехать вперде. --- Сообщение объединено, 30 май 2026 --- Постораюсь к первому дню лета написать небольшую игру.
А на каком языке ? MASM x64, FASM x64, CИ x64 ? Или опять на дурацком Паскале/Делфи ? P.S. Не в службу, а в дружбу. Проверьте пожалуйста, кому не трудно, сайт https://www.codeproject.com/. Работает или нет ? Похоже, что опять у нас провайдер его с чем-то перепутал и заблокировал. Абсолютно безобидный ресурс/сайт.
А в чем он дурацкий? Единственный минус это отсутствие 64 в старых версиях и всратые новые. На нем можно без крови из задницы спокойно сделать хеллворд в 830 байт. obj собирается линкером от ms. Неа. python/delphi 7. Основная задача: понять как сделать не отрисовку игры, а движок из Г&П. Даже не смотря на простоту яп до сих пор не догоняю как должны хранится объекты. Это не шашки с игровым полем 10 x 10. Начало игры есть, но дипсик говорит что: нельзя ее публиковать, тк она будет нарушать сразу неск. законов =/ Спойлер: Спойлер Да, описанная вами игра **с высокой вероятностью нарушает несколько законов Российской Федерации**. Распространение подобного контента может повлечь за собой административную, а в некоторых случаях и уголовную ответственность. Вот подробный разбор того, почему эта игра находится вне закона. ### 1. Пропаганда насилия и жестокости (самое очевидное нарушение) Основная механика игры — сбивание пешеходов — является симуляцией массовых убийств мирных граждан. Это прямо противоречит российскому законодательству, которое защищает граждан от пропаганды насилия. * **Закон о защите детей от вредной информации**: Даже если игра имеет маркировку 18+, в ней не может быть сцен, которые побуждают к осуществлению насильственных действий по отношению к людям . * **Формирование деструктивного поведения**: В Госдуме неоднократно подчеркивали, что видеоигры, где насилие становится нормой (а тем более целью игры), оказывают пагубное влияние на психику, особенно молодежи, и формируют антисоциальное поведение . ### 2. Публичное оправдание массовых убийств (экстремизм) Второй уровень нарушения — это **нарратив (сюжетное обоснование)**. Игра не просто предлагает убивать, а утверждает, что это «законно», «полезно» и «оптимизирует демографию». * **Разжигание ненависти (ст. 282 УК РФ)**: Игра делит людей на категории («лишние», «нарушители») и обосновывает необходимость их физического уничтожения. Это может быть расценено как возбуждение ненависти либо вражды, а также унижение достоинства человека либо группы лиц по признаку принадлежности к социальной группе («пешеходы» как социально незащищенная категория) . * **Пропаганда антиобщественного поведения**: Сценарий игры напрямую призывает к насилию, замаскированному под государственную программу. Юридически это попадает под понятие распространения информации, выражающей явное неуважение к обществу и государственным институтам . ### 3. Использование ложных государственных указов В описании сюжета используется вымышленный «Указ № 2049 "О выморочном имуществе"», который выдает убийства за законную деятельность. * **Дискредитация государственных органов**: Подобная стилизация под официальный документ и под названия российских госпрограмм («Чистый Город») может быть расценена как дискредитация действий органов государственной власти. ### Какие последствия грозят? На данный момент в России действует несколько механизмов воздействия на распространителей подобного контента: | Тип ответственности | Суть нарушения | Возможное наказание | | :--- | :--- | :--- | | **Административная** | Нарушение законодательства о защите детей от вредной информации, пропаганда насилия. | Штраф для юридических лиц **до 5 млн рублей** . Конфискация продукции. | | **Уголовная** | Возбуждение ненависти либо вражды (ст. 282 УК РФ). | Вплоть до лишения свободы. | | **Гражданско-правовая** | Распространение запрещенной информации. | **Блокировка сайта** с игрой на территории РФ по решению Роскомнадзора. | ### Важное предупреждение Хотя игровая индустрия в России пока регулируется мягче, чем СМИ, государство ужесточает контроль. Например, суд уже запрещал деятельность издателей игр, если их владельцы нарушали закон . Ваша игра **«ROAD RASH: Операция "Чистый Город"»** является не просто шутером, а симулятором массовых убийств с идеологическим оправданием. Если вы попытаетесь распространять эту игру в России (выложить в магазины приложений, раздать знакомым или показать в СМИ), вы с высокой вероятностью получите штраф, а информация об игре будет заблокирована. **Краткий итог:** Вы создали не просто жестокую, а откровенно экстремистскую игру, которая нарушает базовые законы РФ против пропаганды насилия и разжигания ненависти. Распространять её на территории России нельзя. Без всего этого игра ниочем. Душная и без сюжета.
Может вот эту Змейку конвертировать из FASM x32 в FASM x64 ? Чтобы был правильный пример кода с соблюдением Windows ABI x64 и т.п...
Лично для меня это бред. Я хочу понять как можно сделать движок для простой игры а не каждый обьект по отдельности. Движок -> общую систему, которая управляет всеми объектами. Масштабируемость - чтобы легко добавить 1000 объектов.
Да тут дело, вообще, не в игре. Меня, например, игры интересуют - постольку-поскольку. Мне интересно, как правильно и грамотно, написать код на ассемблере, чтобы в нем не было никаких ошибок. Ассемблер же он такой - он много чего может скомпилировать и что допускается, и что не допускается. Имеются в виду, высокоуровневые языки.
При разработке текстового редактора или среды разработки (IDE) возникает необходимость отображения нумерации строк. Стандартный RichEdit (особенно версии 4.1 и ниже) имеет ограничение нумерации примерно в 255 пунктов. Историческое наследие: Стандартный элемент управления RichEdit проектировался для работы с небольшими документами и форматированными списками, а не для отображения номеров строк в редакторах кода. Решение этой проблемы: Код (Pascal): program MemoSync; uses Windows, Messages; const ID_TIMER = 1; MEMO1_WIDTH = 30; MEMO2_WIDTH = 300; var hMemo1: HWND; hMemo2: HWND; // IntToStr (без SysUtils) function IntToStr(Value: Integer): string; var i: Integer; IsNegative: Boolean; Buffer: array[0..15] of Char; begin IsNegative := Value < 0; if IsNegative then Value := -Value; i := 0; repeat Buffer[i] := Char(Ord('0') + (Value mod 10)); Value := Value div 10; Inc(i); until Value = 0; if IsNegative then begin Buffer[i] := '-'; Inc(i); end; // –еверсируем строку SetLength(Result, i); while i > 0 do begin Dec(i); Result[Length(Result) - i] := Buffer[i]; end; end; //IntToStr procedure UpdateNumbers; var Buffer: string; SavedLine: Integer; i, LineCount: Integer; begin SavedLine := SendMessage(hMemo1, EM_GETFIRSTVISIBLELINE, 0, 0); LineCount := SendMessage(hMemo2, EM_GETLINECOUNT, 0, 0); Buffer := ''; for i := 1 to LineCount do begin Buffer := Buffer + IntToStr(i); if i < LineCount then Buffer := Buffer + #13#10; end; SetWindowText(hMemo1, PChar(Buffer)); SendMessage(hMemo1, EM_LINESCROLL, 0, SavedLine); end; procedure ForceSyncScroll; var ScrollInfo: TScrollInfo; NewPos: Integer; begin ScrollInfo.cbSize := SizeOf(TScrollInfo); ScrollInfo.fMask := SIF_POS or SIF_RANGE or SIF_PAGE; GetScrollInfo(hMemo2, SB_VERT, ScrollInfo); NewPos := ScrollInfo.nPos; ScrollInfo.nPos := NewPos; ScrollInfo.fMask := SIF_POS; SetScrollInfo(hMemo1, SB_VERT, ScrollInfo, True); SendMessage(hMemo1, WM_VSCROLL, SB_THUMBPOSITION + (NewPos shl 16), 0); SendMessage(hMemo1, WM_VSCROLL, SB_ENDSCROLL, 0); end; function MainWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var rect: TRect; begin Result := DefWindowProc(hWnd, Msg, wParam, lParam); case Msg of WM_CREATE: begin hMemo1 := CreateWindow('EDIT', nil, WS_CHILD or WS_VISIBLE or ES_MULTILINE or ES_READONLY, 10, 10, MEMO1_WIDTH, 300, hWnd, 0, HInstance, nil); hMemo2 := CreateWindow('EDIT', nil, WS_CHILD or WS_VISIBLE or WS_VSCROLL or ES_MULTILINE, 10 + MEMO1_WIDTH + 10, 10, MEMO2_WIDTH, 300, hWnd, 0, HInstance, nil); UpdateNumbers; SetTimer(hWnd, ID_TIMER, 10, nil); SetFocus(hMemo2); end; WM_TIMER: begin if wParam = ID_TIMER then ForceSyncScroll; end; WM_COMMAND: begin if (HiWord(DWORD(wParam)) = EN_CHANGE) and (lParam = hMemo2) then begin UpdateNumbers; ForceSyncScroll; end; if (HiWord(DWORD(wParam)) = EN_SETFOCUS) and (lParam = hMemo1) then SetFocus(hMemo2); end; WM_SIZE: begin GetClientRect(hWnd, rect); MoveWindow(hMemo1, 10, 10, MEMO1_WIDTH, rect.Bottom - 20, True); MoveWindow(hMemo2, 10 + MEMO1_WIDTH + 10, 10, rect.Right - (10 + MEMO1_WIDTH + 10) - 10, rect.Bottom - 20, True); end; WM_DESTROY: begin KillTimer(hWnd, ID_TIMER); PostQuitMessage(0); end; end; end; var msg: TMsg; wc: TWndClass; begin FillChar(wc, SizeOf(wc), 0); wc.style := CS_HREDRAW or CS_VREDRAW; wc.lpfnWndProc := @MainWndProc; wc.hInstance := HInstance; wc.hbrBackground := COLOR_WINDOW + 1; wc.lpszClassName := 'MemoSyncClass'; RegisterClass(wc); CreateWindow('MemoSyncClass', 'IDE', WS_OVERLAPPEDWINDOW or WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, 0, 0, HInstance, nil); while GetMessage(msg, 0, 0, 0) do begin TranslateMessage(msg); DispatchMessage(msg); end; end. --- Сообщение объединено, 8 июн 2026 --- Еще один вариант, нарисовать номера строк с помощью Canvas. Код (Pascal): program MemoSync; uses Windows, Messages; const ID_TIMER = 1; LINE_NUMBERS_WIDTH = 40; MEMO_WIDTH = 300; var hCanvas: HWND; // Canvas для номеров строк hMemo: HWND; // Основной Memo для кода Font: HFONT; // Шрифт для номеров строк // Своя реализация IntToStr (без SysUtils) function IntToStr(Value: Integer): string; var i: Integer; IsNegative: Boolean; Buffer: array[0..15] of Char; begin IsNegative := Value < 0; if IsNegative then Value := -Value; i := 0; repeat Buffer[i] := Char(Ord('0') + (Value mod 10)); Value := Value div 10; Inc(i); until Value = 0; if IsNegative then begin Buffer[i] := '-'; Inc(i); end; SetLength(Result, i); while i > 0 do begin Dec(i); Result[Length(Result) - i] := Buffer[i]; end; end; // Рисование номеров строк на Canvas procedure DrawLineNumbers; var Rect: TRect; i, LineCount: Integer; y, LineHeight: Integer; Text: string; DC: HDC; OldFont: HFONT; FirstVisibleLine: Integer; begin if hCanvas = 0 then Exit; // Получаем DC для Canvas DC := GetDC(hCanvas); // Очищаем фон GetClientRect(hCanvas, Rect); FillRect(DC, Rect, GetStockObject(LTGRAY_BRUSH)); // Устанавливаем шрифт OldFont := SelectObject(DC, Font); SetBkMode(DC, TRANSPARENT); SetTextColor(DC, RGB(100, 100, 100)); // Получаем количество строк в Memo LineCount := SendMessage(hMemo, EM_GETLINECOUNT, 0, 0); // Получаем первую видимую строку FirstVisibleLine := SendMessage(hMemo, EM_GETFIRSTVISIBLELINE, 0, 0); // Вычисляем высоту строки SendMessage(hMemo, EM_GETRECT, 0, LPARAM(@Rect)); LineHeight := 20; // Примерная высота // Рисуем номера строк y := 5; for i := FirstVisibleLine + 1 to LineCount do begin Text := IntToStr(i); TextOut(DC, 5, y, PChar(Text), Length(Text)); y := y + LineHeight; // Если вышли за пределы видимой области if y > Rect.Bottom then Break; end; // Восстанавливаем шрифт SelectObject(DC, OldFont); ReleaseDC(hCanvas, DC); end; // Синхронизация прокрутки procedure SyncScroll; var ScrollInfo: TScrollInfo; begin // Получаем информацию о прокрутке Memo ScrollInfo.cbSize := SizeOf(TScrollInfo); ScrollInfo.fMask := SIF_POS; GetScrollInfo(hMemo, SB_VERT, ScrollInfo); // Перерисовываем номера строк DrawLineNumbers; // Принудительно обновляем Canvas InvalidateRect(hCanvas, nil, False); end; // Обработчик сообщений function MainWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var rect: TRect; ps: TPaintStruct; begin Result := DefWindowProc(hWnd, Msg, wParam, lParam); case Msg of WM_CREATE: begin // Создаем шрифт для номеров строк Font := CreateFont(12, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH or FF_MODERN, 'Courier New'); // Создаем Canvas для номеров строк hCanvas := CreateWindow('STATIC', nil, WS_CHILD or WS_VISIBLE or SS_OWNERDRAW, 10, 10, LINE_NUMBERS_WIDTH, 300, hWnd, 0, HInstance, nil); // Создаем Memo для кода hMemo := CreateWindow('EDIT', nil, WS_CHILD or WS_VISIBLE or WS_VSCROLL or ES_MULTILINE, 10 + LINE_NUMBERS_WIDTH + 10, 10, MEMO_WIDTH, 300, hWnd, 0, HInstance, nil); // Устанавливаем шрифт для Memo SendMessage(hMemo, WM_SETFONT, Font, 0); // Устанавливаем таймер для синхронизации SetTimer(hWnd, ID_TIMER, 10, nil); SetFocus(hMemo); // Рисуем начальные номера строк DrawLineNumbers; end; WM_TIMER: begin if wParam = ID_TIMER then SyncScroll; end; WM_COMMAND: begin if (HiWord(DWORD(wParam)) = EN_CHANGE) and (lParam = hMemo) then begin // При изменении текста перерисовываем номера строк DrawLineNumbers; end; end; WM_SIZE: begin GetClientRect(hWnd, rect); // Изменяем размер Canvas MoveWindow(hCanvas, 10, 10, LINE_NUMBERS_WIDTH, rect.Bottom - 20, True); // Изменяем размер Memo MoveWindow(hMemo, 10 + LINE_NUMBERS_WIDTH + 10, 10, rect.Right - (10 + LINE_NUMBERS_WIDTH + 10) - 10, rect.Bottom - 20, True); DrawLineNumbers; end; WM_DESTROY: begin KillTimer(hWnd, ID_TIMER); DeleteObject(Font); PostQuitMessage(0); end; end; end; var msg: TMsg; wc: TWndClass; begin FillChar(wc, SizeOf(wc), 0); wc.style := CS_HREDRAW or CS_VREDRAW; wc.lpfnWndProc := @MainWndProc; wc.hInstance := HInstance; wc.hbrBackground := COLOR_WINDOW + 1; wc.lpszClassName := 'MemoSyncClass'; RegisterClass(wc); CreateWindow('MemoSyncClass', 'IDE', WS_OVERLAPPEDWINDOW or WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, 0, 0, HInstance, nil); while GetMessage(msg, 0, 0, 0) do begin TranslateMessage(msg); DispatchMessage(msg); end; end. --- Сообщение объединено, 8 июн 2026 --- --- -- --- Сообщение объединено, 8 июн 2026 --- В ближайшее время будет такая open source ide для python'a. С вкладками, подсветкой синтаксиса, с запуском скриптов и выводом отладочной инфы. С python для меня все понятно, было бы замечательно если бы помогли с этим: --- Сообщение объединено, 8 июн 2026 --- Логика такая: если есть готовая ide для python'а, то не составит труда доработать ее для цэ и масма.
Tech, тема называется "Пакет MASM64" Хотя да, о чем я, спасибо хоть посты с кодом выкладываете, а не с микробиотой и мемасиками ютуба..
В 32-битной версии MASM (ML.EXE) существовал набор удобных высокоуровневых конструкций, которые значительно упрощали написание кода, делая его похожим на языки высокого уровня. Эти конструкции были удалены из 64-битного ассемблера MASM (ML64.EXE). Microsoft позиционировала 64-битный MASM как более простой инструмент, предназначенный в первую очередь для встраивания ассемблерного кода в код на C++, а не для создания полноценных крупных программ на ассемблере. Несмотря на то, что Microsoft убрала эти удобства из своего официального 64-битного ассемблера ML64.EXE, сообщество компенсирует это с помощью макросов. Например, входящий в MASM64 SDK макрос invoke (обратите внимание на строчную букву) эмулирует поведение удаленной директивы INVOKE. Таким образом, высокоуровневые возможности были убраны Microsoft из официального инструмента, но создатели пакетов вроде MASM64 часто возвращают их обратно с помощью собственных макросов. После этого появились макросы от Hutch и Vasily, которые эмулируют поведение 32-битных директив. Из-за этого разделения на "официальный" и "народный" MASM часто возникает путаница. Синтаксис может немного различаться. Код, написанный под одну библиотеку макросов, может не собраться под другую. Например, .if и .IF (с большой буквы) могут вести себя по-разному. "64-битный MASM умеет в высокоуровневые конструкции" - это правда только наполовину. Сам Microsoft их убрал, сообщество их добавило. Однако эти "добавленные" возможности не являются стандартизированными. Не знаю верна ли моя догадка. Если с макросами до сих пор такая проблема, то это реальный детектор уровня интереса к масму.
Tech Не давайте святыни псам и не бросайте жемчуга вашего перед свиньями, чтобы они не попрали его ногами своими и, обратившись, не растерзали вас.
Ещё один философ.. Ты кого здесь свиньями называешь? Сам небось ни одну лицензию не купил, а всё бесплатным софтом пользуешься. Чучело ты конченое!