Еще одна интересная игра. Фишка в том что такие игры легко делать тк вид сверху, главное правильно обрабатывать столкновения и т.д. Ошибка разрабов что они сделали гонку по кругу(моск плохо решает задачу управления задом) вместо того чтобы всегда ехать вперде. --- Сообщение объединено, 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 в 18:07 --- Еще один вариант, нарисовать номера строк с помощью 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 в 18:08 --- --- -- --- Сообщение объединено, 8 июн 2026 в 22:45 --- В ближайшее время будет такая open source ide для python'a. С вкладками, подсветкой синтаксиса, с запуском скриптов и выводом отладочной инфы. С python для меня все понятно, было бы замечательно если бы помогли с этим: --- Сообщение объединено, 8 июн 2026 в 22:52 --- Логика такая: если есть готовая ide для python'а, то не составит труда доработать ее для цэ и масма.
Tech, тема называется "Пакет MASM64" Хотя да, о чем я, спасибо хоть посты с кодом выкладываете, а не с микробиотой и мемасиками ютуба..