Существует ли путь в сценарии пакетной обработки для хранения консоли открытой только если вызванный от менеджера по Windows?

Помните, что нет такой вещи, как дробный пиксель. Для целей перемещения имеет смысл использовать плавающие значения и приводить их к целочисленным пикселям при рисовании. Проблема не в дробных значениях, а в том, как они нарисованы.

Основная причина, по которой столкновения не выглядят корректно, - это масштабирование. Цвета для новых пикселей между диагоналями получают свои цвета путем усреднения * окружающих пикселей. Эффект заставляет изображение выглядеть больше, чем оригинал, особенно на диагонали.

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

Единственное прямое (идеальное по пикселям) решение - сравнивать фактический результат после масштабирования. Это требует рендеринга всего экрана дважды, а масштабный коэффициент требует большего количества вычислений. (не рекомендуется)

Поскольку вы сравниваете немасштабированные изображения, кажется, что ваши столкновения отключены.

Другая проблема - скорость движения. Если вы перемещаетесь быстрее, чем один пиксель на Update (), обнаружения столкновений на пиксель недостаточно, если движение должно быть ограничено препятствием. Вы должны разрешить столкновение.

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

Простой алгоритм разрешения (математическое решение см. Ниже) состоит в том, чтобы разматывать движение наполовину, проверять на столкновение. Если он все еще сталкивается, размотайте движение на четверть, иначе продвиньте его на четверть и проверьте на столкновение. Повторяйте, пока движение не станет менее 1 пикселя. Это запускает журнал скорости.

Что касается верхней стены, которая не сталкивается идеально: если начальное значение Y не кратно скорости вертикального движения, вы не попадете идеально на ноль. Я предпочитаю решить эту проблему, установив Y = 0, когда Y отрицательно. То же самое для X, а также когда X и Y> границы экрана - начало координат, для нижней и правой частей экрана.

Я предпочитаю использовать математические решения для разрешения столкновений. На ваших примерах изображений вы видите коробку, сталкивающуюся с ромбом, форма ромба математически представлена ​​как расстояние Манхэттена (Math.Abs(x1-x2) + Math.Abs(y1-y2)). Из этого факта легко напрямую рассчитать разрешение до столкновения.

Об оптимизации:

Перед вызовом этого метода убедитесь, что ограничивающие прямоугольники перекрываются.

Как вы уже сказали, удалите все Math.Floor с, так как приведение достаточно. все вычисления внутри циклов не зависят от переменной цикла вне цикла.

(int)a.Bounds.Y * a.Texture.Width и (int)b.Bounds.Y * b.Texture.Width не зависят от переменных x или y и должны быть вычислены и сохранены перед циклами. Вычитания 'y- [вышеуказанная переменная] `должны храниться в цикле" y ".

Я бы рекомендовал использовать битборд (1 бит на 8 на 8 квадратов) для коллизий. Это уменьшает широкий (8x8 ) проверки столкновений на O (1). Для разрешения 144x144 все пространство поиска становится 18x18.

11
задан ykaganovich 4 February 2009 в 07:05
поделиться

4 ответа

Посмотрите этот вопрос: Обнаружение, как выполнялся пакетный файл

Этот сценарий не приостановится, если выполнено от консоли команды, но будет, если дважды щелкнули в Проводнике:

@echo off
setlocal enableextensions

set SCRIPT=%0
set DQUOTE="

:: Detect how script was launched
@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1

:: Run your app
java com.example.myApp

:EXIT
if defined PAUSE_ON_CLOSE pause
12
ответ дан 3 December 2019 в 07:14
поделиться

Я предпочитаю использовать %cmdcmdline% как отправлено в комментарии к ответу Patrick на другой вопрос (который я не нашел, хотя посмотрели). Тот путь, даже если кто-то решает использовать кавычки для вызова сценария пакетной обработки, он не инициирует положительную ложь.

Мое конечное решение:

@echo off
java com.example.myApp %1 %2

REM "%SystemRoot%\system32.cmd.exe"   when from console
REM cmd /c ""[d:\path\script.bat]" "  when from windows explorer

@echo %cmdcmdline% | findstr /l "\"\"" >NUL
if %ERRORLEVEL% EQU 0 pause
3
ответ дан 3 December 2019 в 07:14
поделиться

Я часто использую альтернативные оболочки (в основном TCC / LE от jpsoft.com) и подоболочки. Я обнаружил, что этот код работает для более широкого, более общего случая (и не требует FINDSTR):

@echo off & setlocal
if "%CMDEXTVERSION%"=="" ( echo REQUIRES command extensions & exit /b 1 ) &:: REQUIRES command extensions for %cmdcmdline% and %~$PATH:1 syntax

call :_is_similar_command _FROM_CONSOLE "%COMSPEC%" %cmdcmdline%
if "%_PAUSE_NEEDED%"=="0" ( goto :_START )
if "%_PAUSE_NEEDED%"=="1" ( goto :_START )
set _PAUSE_NEEDED=0
if %_FROM_CONSOLE% equ 0 ( set _PAUSE_NEEDED=1 )
goto :_START
::
:_is_similar_command VARNAME FILENAME1 FILENAME2
:: NOTE: not _is_SAME_command; that would entail parsing PATHEXT and concatenating each EXT for any argument with a NULL extension
setlocal
set _RETVAL=0
:: more than 3 ARGS implies %cmdcmdline% has multiple parts (therefore, NOT direct console execution)
if NOT [%4]==[] ( goto :_is_similar_command_RETURN )
:: deal with NULL extensions (if both NULL, leave alone; otherwise, use the non-NULL extension for both)
set _EXT_2=%~x2
set _EXT_3=%~x3
if NOT "%_EXT_2%"=="%_EXT_3%" if "%_EXT_2%"=="" (
    call :_is_similar_command _RETVAL "%~2%_EXT_3%" "%~3"
    goto :_is_similar_command_RETURN
    )
if NOT "%_EXT_2%"=="%_EXT_3%" if "%_EXT_3%"=="" (
    call :_is_similar_command _RETVAL "%~2" "%~3%_EXT_2%"
    goto :_is_similar_command_RETURN
    )
::if /i "%~f2"=="%~f3" ( set _RETVAL=1 )  &:: FAILS for shells executed with non-fully qualified paths (eg, subshells called with 'cmd.exe' or 'tcc')
if /i "%~$PATH:2"=="%~$PATH:3" ( set _RETVAL=1 )
:_is_similar_command_RETURN
endlocal & set "%~1=%_RETVAL%"
goto :EOF
::

:_START

if %_FROM_CONSOLE% EQU 1 (
    echo EXEC directly from command line
  ) else (
    echo EXEC indirectly [from explorer, dopus, perl system call, cmd /c COMMAND, subshell with switches/ARGS, ...]
    )
if %_PAUSE_NEEDED% EQU 1 ( pause )

Первоначально я использовал , если / i "% ~ f2" == "% ~ f3 « в подпрограмме _is_s Similar_command . Изменение на if / i "% ~ $ PATH: 2" == "% ~ $ PATH: 3" и дополнительная проверка кода для расширений NULL позволяет коду работать для оболочек / подоболочек, открытых с не полностью определенные пути (например, подоболочки, вызываемые просто с помощью «cmd.exe» или «tcc»).

Для аргументов без расширений этот код не анализирует и не использует расширения из% PATHEXT%. Это по существу игнорирует иерархию расширений, что CMD. exe используется при поиске команды без расширения (сначала попытка FOO.com, затем FOO.exe, затем FOO.bat и т. д.). Итак, _is_simil_command проверяет сходство, а не эквивалентность, между двумя аргументами в качестве команд оболочки. Это может быть источником путаницы / ошибки, но, по всей вероятности, никогда не возникнет как проблема на практике для этого приложения.

Редактировать: Первоначальный код был старой версией. В настоящее время код обновлен до самой последней версии, в которой: (1) поменялись местами % COMSPEC% и % cmdcmdline% при первоначальном вызове, (2) добавлена ​​проверка множественности % cmdcmdline% аргументов, (3) отраженные сообщения более точны в отношении того, что обнаружено, и (4) была добавлена ​​новая переменная % _ PAUSE_NEEDED% .

Следует отметить, что % _ FROM_CONSOLE% устанавливается в зависимости от того, был ли пакетный файл извлечен непосредственно из командной строки консоли или косвенно через проводник или каким-либо другим способом. Эти «другие средства» могут включать системный вызов perl или выполнение команды, такой как cmd / c COMMAND .

Переменная % _ PAUSE_NEEDED% была добавлена ​​для обработки (например, perl), которые косвенно исполняют пакетный файл, могут обходить паузы внутри пакетного файла. Это было бы важно в тех случаях, когда выходные данные не передаются на видимую консоль (например, perl -e "$ o = qx {COMMAND}" ). Если в таком случае возникает пауза, «Нажмите любую клавишу для продолжения ...» Запрос на паузу никогда не будет отображаться пользователю, и процесс будет зависать в ожидании беспрепятственного ввода данных пользователем. В случаях, когда взаимодействие с пользователем либо невозможно, либо недопустимо, для переменной % _ PAUSE_NEEDED% может быть задано значение «0» или «1» (соответственно, false или true). % _ FROM_CONSOLE% по-прежнему корректно устанавливается кодом, но значение % _ PAUSE_NEEDED% впоследствии не устанавливается на основе % _ FROM_CONSOLE% . Он только что пропущен.

И также обратите внимание, что код будет неправильно определять выполнение как косвенное (% _ FROM_CONSOLE% = 0) внутри подоболочки, если эта подоболочка открывается командой, содержащей переключатели / опции ( например, смд / х ). Как правило, это не

0
ответ дан 3 December 2019 в 07:14
поделиться
cmd /K java com.example.myApp & pause & exit

выполнит эту работу. & Будет выполнять команду одну за другой. Если вы используете &&, вы можете сломаться, если один выйдет из строя.

3
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: