約 4,509,183 件
https://w.atwiki.jp/bad_soldier/pages/14.html
バグ、チートなどを紹介してるビデオへの直リンク集 注:重複あり、リンク切れあるかも YouTube Backstab Backstab Backstab Backstab Backstab Backstab Backstab Backstab Backstab Backstab Backstab Deadly pass Deadly pass Bridge too far Bridge too far Bridge too far Bridge too far Bridge too far Bridge too far Bridge too far Bridge too far Bridge too far Dammage Dammage Dammage Dammage Dammage Dammage Dammage Dammage Dammage Dammage Harbor edge Harbor edge Harbor edge Harbor edge Harbor edge Harbor edge Honor Honor Honor Honor Missile crisis Russian border Russian border Russian border Special Op Special Op Special Op The black gold The nest The nest PutFile http //media.putfile.com/LittleBigEye-67 http //media.putfile.com/Russain-Border-6 http //media.putfile.com/Russain-Border-7 http //media.putfile.com/Russain-Border-Get-on-Roof http //media.putfile.com/Spec-Op-2 http //media.putfile.com/Missle-Crisis-3-by-Zipzap http //media.putfile.com/Missle-Crissis-4 http //media.putfile.com/Missle-Crisis-5 http //media.putfile.com/Missle-Crisis-6 http //media.putfile.com/Missle-Crisis-7 http //media.putfile.com/Missle-Crisis-8 http //media.putfile.com/Harbour-Edge-Glitch-1 http //media.putfile.com/Harbour-Edge-2 http //media.putfile.com/Coldfront-Glitch http //media.putfile.com/Coldfront-Get-on-Bridge http //media.putfile.com/Dammage-Glitch-4 http //media.putfile.com/Dammage-Glitch-3 http //media.putfile.com/Bridge-Too-Far-5 http //media.putfile.com/Bridge-Too-Far-6 http //media.putfile.com/Bridge-Too-Far-7 http //media.putfile.com/Bridge-Too-Far-8 http //media.putfile.com/Bridge-Too-Far-9 ZippyVideo http //www.zippyvideos.com/6907165993875146/btfrealgltich/ http //www.zippyvideos.com/2369592574757886/btf2/ http //www.zippyvideos.com/4681616873370506/btfglitch/ http //www.zippyvideos.com/5907363254415706/misslecrissis1/ http //www.zippyvideos.com/6091037754415696/missle_2/ http //www.zippyvideos.com/6689890253370006/glitchthenest1/ http //www.zippyvideos.com/7298402563998306/the_nest2/ http //www.zippyvideos.com/5243623114757766/nest_glitch_3/ http //www.zippyvideos.com/3407846804757866/nest_glitch_4/ http //www.zippyvideos.com/1154103793374046/russglitch/ http //www.zippyvideos.com/5298010853997346/russian_border_2/ http //www.zippyvideos.com/5298010853997346/russian_border_3/ http //www.zippyvideos.com/6123006924018536/russian_border_4/ http //www.zippyvideos.com/6363997854202486/russian_border_5/ http //www.zippyvideos.com/9188170215949026/uvs060907-001/ http //www.zippyvideos.com/1975902774149506/dammage_glitch/ http //www.zippyvideos.com/4119773384166436/dammage_glitch_2/ END
https://w.atwiki.jp/cod4mod/pages/63.html
The purpose of this section is to give people an outline of things that they should do in order to create a multiplayer map and get it working properly. Step 1 Create map geometry in Radiant The first step is to create some sort of map geometry for the gameplay to take place in. The more details you have sorted out about what you're making before you open Radiant, the better. Know the locale, the theme, and the kind of gameplay flow that you want. Iteration is key to making a good MP map, but having a good plan beforehand will save you lots of time in the long haul. Use this Radiant Basics tutorial to get you started with the map creation. 第1ステップは起きるべきゲームプレイのためのある種のマップジオメトリを作るはずです。あなたがあなたがあなたの前に何をしているかについて分類したディテールが明るくて、もっと良く開けるさらに多く。現場、主題とあなたが欲する種類のゲームプレイフローを知ってください。繰返しは良いMPマップを作ることへの鍵です、しかしあらかじめ良い計画を持っていることはあなたにとってロングホールでのたくさんの時間を節約するでしょう。 この明るい基礎学習をマップ生成であなたが始められるようにするために使ってください。 Radiant Basics Step 2 Set up the map for MP Once you have geo to a playable state, you're going to want to set it up for gameplay ASAP. Don't focus on detailing geo out before the gameplay is exactly as you want it. This MP Mapping tutorial describes how to implement the items from this section. あなたがプレーすることができる状態に geo を持っている途端に、あなたはゲームプレイ陸軍科学顧問団に適格でそれを設定することを望もうとしています。あなたがそれを欲するように、ゲームプレイが正確にである前に、外に geo を詳述することに焦点をあてないでください。 このMPマッピング学習はどれほどこの項からインプリメント、アイテム、までか記述します。 MP Mapping The following is required to set up a MP map's gameplay 次のことがMPの上にマップのゲームプレイを設定することを必要とされます: Place a global_intermission entity (Spectator location during scoreboard) Set up Free-For-All Set up Team Deathmatch Set up Domination Set up Sabotage Set up Search and Destroy Set up Headquarters Set up Old-School Mode Create a Radar map image (Required for UAV and air strikes) Set up helicopter paths (Required for helicopter strikes) Step 3 Add reflection probes At least one reflection probe is necessary to prevent the compiled map from being tinted red. More are recommended for accurate reflections in-game. The following section talks about reflection probes more in-depth. 少なくとも1本の反射プローブが編集されたマップが赤く色づけられるのを阻止するために必要です。さらに多くがゲーム内正確な反射のために推薦されています。次の項はいっそう深く反射プローブについて話をします。 Reflection Probes Step 4 Create a load screen A custom load screen isn't necessary for operation of the map, but the alternative is for the ugly default texture to show whenever your custom map is loaded. To avoid that, follow this tutorial on load screen creation. カスタムロードスクリーンがマップのオペレーションに必要ではありません、しかし、あなたのカスタムマップがロードされるときはいつでも、選択肢は見せるべき醜いデフォルトテクスチャのためです。それを避けるために、フォローがこの学習後にスクリーン生成をロードします。 Making a custom MP load screen Step 5 Create .GSC (Game script files) The level.gsc is needed in order for MP maps to run properly. Other .gsc files can also be added to control various other things. This section covers the various .gsc files used for multiplayer maps. level.gsc はMPマップが適切に走るために必要とされます。他の .gsc ファイルはさまざまな他のことをコントロールするために同じく加えられることができます。この項はマルチプレ-ヤーマップのために使われた種々の .gsc ファイルをカバーします。 MP Game Script Files Step 6 Create .CSV (Zone files) Zone Files load items into memory that the map requires, like sounds, effects, script files, images, etc. This section covers how to set up the .csv files used for multiplayer maps. 区間ファイルはマップが音、効果、スクリプトファイル、イメージ、などのように、必要とするメモリの中にアイテムをロードします。この項はどのように .csv の上にマルチプレ-ヤーマップのために使われたファイルを設定するべきかを取り扱います。 MP Zone Files Step 7 Compile and run map Once everything above is done, you simply need to compile the map and you're set for some multiplayer action in your own custom map! Check out the following tutorial on compiling maps in order to do this. 上のすべてがされる、あなたがただマップを編集する必要がある、そしてあなたが設定される途端にあなた自身のカスタムマップで若干のマルチプレ-ヤーの行動のためですか! これをするためにコンパイルマップの上に次の学習をチェックしてください。 Compile Tools Step 8 (optional) Add a .vision file Coming soon. (Original "http //www.infinityward.com/wiki/index.php?title=MP_Map_Checklist") 名前 すべて読む
https://w.atwiki.jp/nogyo/pages/30.html
DatControl Page2 DatControl http //page2.xrea.jp/pub/DatControl.phps Page2 http //page2.xrea.jp/
https://w.atwiki.jp/intensity/pages/29.html
//----------------------------------------------------------------------------- // $Id DecklinkCaptureDlg.cpp,v 1.9 2006/04/11 01 11 07 ivanr Exp $ // // Desc DirectShow capture sample // // Copyright (c) Blackmagic Design 2005. All rights reserved. //----------------------------------------------------------------------------- #include "stdafx.h" #include "DecklinkCapture.h" #include "DecklinkCaptureDlg.h" #include initguid.h // TODO move this to a lib #include "DecklinkSample_uuids.h" #undef lstrlenW #ifdef _DEBUG #define new DEBUG_NEW #endif #define WM_GRAPHNOTIFYWM_APP+1// for Filter Graph event notification //----------------------------------------------------------------------------- // CAboutDlg //----------------------------------------------------------------------------- // CAboutDlg dialog used for App About class CAboutDlg public CDialog { public CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected DECLARE_MESSAGE_MAP() }; CAboutDlg CAboutDlg() CDialog(CAboutDlg IDD) { } void CAboutDlg DoDataExchange(CDataExchange* pDX) { CDialog DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() //----------------------------------------------------------------------------- // CDecklinkCaptureDlg dialog //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Constructor // CDecklinkCaptureDlg CDecklinkCaptureDlg(CWnd* pParent /*=NULL*/) CDialog(CDecklinkCaptureDlg IDD, pParent) , m_pIVW(NULL) { m_hIcon = AfxGetApp()- LoadIcon(IDR_MAINFRAME); } //----------------------------------------------------------------------------- // DoDataExchange // void CDecklinkCaptureDlg DoDataExchange(CDataExchange* pDX) { CDialog DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_VIDEOFORMATS, m_videoFormatCtrl); DDX_Control(pDX, IDC_COMBO_AUDIOFORMATS, m_audioFormatCtrl); DDX_Control(pDX, IDC_STATIC_PREVIEW, m_preview); DDX_Control(pDX, IDC_EDIT_CAPTUREFILE, m_captureFileCtrl); DDX_Control(pDX, IDC_COMBO_COMPRESSION, m_compressionCtrl); DDX_Control(pDX, IDC_COMBO_VIDEODEVICE, m_videoDeviceCtrl); DDX_Control(pDX, IDC_COMBO_AUDIODEVICE, m_audioDeviceCtrl); } BEGIN_MESSAGE_MAP(CDecklinkCaptureDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_CBN_SELCHANGE(IDC_COMBO_VIDEOFORMATS, OnCbnSelchangeComboVideoformats) ON_CBN_SELCHANGE(IDC_COMBO_AUDIOFORMATS, OnCbnSelchangeComboAudioformats) ON_BN_CLICKED(IDC_CHECK_AUDIOMUTE, OnBnClickedCheckAudiomute) ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnBnClickedButtonBrowse) ON_BN_CLICKED(IDC_BUTTON_CAPTURE, OnBnClickedButtonCapture) ON_BN_CLICKED(IDC_BUTTON_STOP, OnBnClickedButtonStop) ON_CBN_SELCHANGE(IDC_COMBO_COMPRESSION, OnCbnSelchangeComboCompression) ON_CBN_SELCHANGE(IDC_COMBO_VIDEODEVICE, OnCbnSelchangeComboVideodevice) ON_CBN_SELCHANGE(IDC_COMBO_AUDIODEVICE, OnCbnSelchangeComboAudiodevice) END_MESSAGE_MAP() //----------------------------------------------------------------------------- // CDecklinkCaptureDlg message handlers //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // OnInitDialog // Called before the dialog is displayed, use this message handler to initialise // our app BOOL CDecklinkCaptureDlg OnInitDialog() { CDialog OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu- AppendMenu(MF_SEPARATOR); pSysMenu- AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application s main window is not a dialog SetIcon(m_hIcon, TRUE);// Set big icon SetIcon(m_hIcon, FALSE);// Set small icon // create a basic capture graph and preview the incoming video m_pGraph = NULL; m_pVideoCapture = NULL; m_pAudioCapture = NULL; m_pVideoRenderer = NULL; m_pSmartT = NULL; m_pControl = NULL; m_pIVW = NULL; m_pMediaEvent = NULL; m_ROTRegister = 0; m_bAudioMute = FALSE; m_compressor = 0; m_bEnableCompressionCtrl = TRUE; m_captureFile = " Select File "; // initialise default video media type ZeroMemory( m_vihDefault, sizeof(m_vihDefault)); m_vihDefault.AvgTimePerFrame = 333667; m_vihDefault.bmiHeader.biWidth = 720; m_vihDefault.bmiHeader.biHeight = 486; m_vihDefault.bmiHeader.biBitCount = 16; m_vihDefault.bmiHeader.biCompression = YVYU ; // initialise default audio media type ZeroMemory( m_wfexDefault, sizeof(m_wfexDefault)); m_wfexDefault.nChannels = 2;// the only field of interest // retrieve last state QueryRegistry(); m_captureFileCtrl.SetWindowText(m_captureFile); EnableControls(); // create a preview graph // add the filters that will be used by all the graphs; preview, uncompressed capture, dv capture, // mpeg capture and windows media capture HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, reinterpret_cast void** ( m_pGraph)); if (SUCCEEDED(hr)) { #ifdef _DEBUG hr = CDSUtils AddGraphToRot(m_pGraph, m_ROTRegister); #endif hr = m_pGraph- QueryInterface(IID_IMediaControl, reinterpret_cast void** ( m_pControl)); if (SUCCEEDED(hr)) { // locate the video capture devices hr = PopulateDeviceControl( CLSID_VideoInputDeviceCategory, m_videoDeviceCtrl); if (SUCCEEDED(hr)) { hr = PopulateDeviceControl( CLSID_AudioInputDeviceCategory, m_audioDeviceCtrl); if (SUCCEEDED(hr)) { PWSTR pVideoName = (PWSTR)m_videoDeviceCtrl.GetItemData(m_videoDeviceCtrl.SetCurSel(0)); PWSTR pAudioName = (PWSTR)m_audioDeviceCtrl.GetItemData(m_audioDeviceCtrl.SetCurSel(0)); if (pVideoName pAudioName) { hr = CDSUtils AddFilter2(m_pGraph, CLSID_VideoInputDeviceCategory, pVideoName, m_pVideoCapture); if (SUCCEEDED(hr)) { hr = CDSUtils AddFilter2(m_pGraph, CLSID_AudioInputDeviceCategory, pAudioName, m_pAudioCapture); if (SUCCEEDED(hr)) { PopulateVideoControl();// populate the video format control with the video formats of the currently selected device PopulateAudioControl();// populate the audio format control with the audio formats of the currently selected device PopulateCompressionControl(); // locate video screen renderer for the preview window hr = CDSUtils AddFilter(m_pGraph, CLSID_VideoRendererDefault, L"Video Renderer", m_pVideoRenderer); if (SUCCEEDED(hr)) { hr = CreatePreviewGraph(); } } } } } } } } return TRUE; // return TRUE unless you set the focus to a control } //----------------------------------------------------------------------------- // DestroyWindow // Called when the window is being destroyed, clean up and free all resources. BOOL CDecklinkCaptureDlg DestroyWindow() { m_regUtils.Close(); #ifdef _DEBUG CDSUtils RemoveGraphFromRot(m_ROTRegister); #endif DestroyGraph(); SAFE_RELEASE(m_pControl); // Hide Video Window and remove owner. This has to be done prior to // destroying any window that displays video/still. if (m_pIVW) { m_pIVW- put_Visible(OAFALSE); m_pIVW- put_Owner(NULL); } SAFE_RELEASE(m_pIVW); SAFE_RELEASE(m_pMediaEvent); SAFE_RELEASE(m_pVideoRenderer); SAFE_RELEASE(m_pAudioCapture); SAFE_RELEASE(m_pVideoCapture); SAFE_RELEASE(m_pGraph); // free mediatypes attached to format controls int count = m_videoFormatCtrl.GetCount(); for (int item=0; item count; ++item) { DeleteMediaType((AM_MEDIA_TYPE*)m_videoFormatCtrl.GetItemData(item)); } count = m_audioFormatCtrl.GetCount(); for (int item=0; item count; ++item) { DeleteMediaType((AM_MEDIA_TYPE*)m_audioFormatCtrl.GetItemData(item)); } // release the device names attached to the item s data count = m_videoDeviceCtrl.GetCount(); for (item=0; item count; ++item) { PWSTR pName = (PWSTR)m_videoDeviceCtrl.GetItemData(item); delete [] pName; } count = m_audioDeviceCtrl.GetCount(); for (item=0; item count; ++item) { PWSTR pName = (PWSTR)m_audioDeviceCtrl.GetItemData(item); delete [] pName; } return CDialog DestroyWindow(); } //----------------------------------------------------------------------------- // OnSysCommand // void CDecklinkCaptureDlg OnSysCommand(UINT nID, LPARAM lParam) { if ((nID 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog OnSysCommand(nID, lParam); } } //----------------------------------------------------------------------------- // OnPaint // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDecklinkCaptureDlg OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast WPARAM (dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog OnPaint(); } } //----------------------------------------------------------------------------- // HandleGraphEvent // At the moment we just read the event, discard it and release memory used to store it. void CDecklinkCaptureDlg HandleGraphEvent(void) { LONG lEventCode, lEventParam1, lEventParam2; if (!m_pMediaEvent) { return; } while (SUCCEEDED(m_pMediaEvent- GetEvent( lEventCode, reinterpret_cast LONG_PTR * ( lEventParam1), reinterpret_cast LONG_PTR * ( lEventParam2), 0))) { // just free memory associated with event m_pMediaEvent- FreeEventParams(lEventCode, lEventParam1, lEventParam2); } } //----------------------------------------------------------------------------- // WindowProc // Have to add our own message handling loop to handle events from the preview video // window and to pass Window events onto it - this is so it redraws itself correctly etc. LRESULT CDecklinkCaptureDlg WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_GRAPHNOTIFY HandleGraphEvent(); break; } // Pass all msgs to video window. vid window exists as child of static // picture frame. This ensures video window redraws itself etc. if (m_pIVW) { m_pIVW- NotifyOwnerMessage(reinterpret_cast LONG_PTR (m_hWnd) /* from me */, message, wParam, lParam); } return CDialog WindowProc(message, wParam, lParam); } //----------------------------------------------------------------------------- // OnQueryDragIcon // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDecklinkCaptureDlg OnQueryDragIcon() { return static_cast HCURSOR (m_hIcon); } //----------------------------------------------------------------------------- // CreatePreviewGraph // Create a graph to preview the input // NOTE There are many ways of building graphs, you could opt for the ICaptureGraphBuilder interface which would // make things are lot simpler, however it doesn t always build the most efficient graphs. HRESULT CDecklinkCaptureDlg CreatePreviewGraph() { HRESULT hr = S_OK; if (m_pGraph) { // locate smart-T // NOTE The smart-T appears to hold references to its upstream connections even when its input pin // is diconnected. The smart-T has to be removed from the graph in order to clear these references which // is why the filter is enumerated and added every time the preview graph is built and removed whenever // it is destroyed. ASSERT(NULL == m_pSmartT); hr = CDSUtils AddFilter(m_pGraph, CLSID_SmartTee, L"Smart Tee", m_pSmartT); if (SUCCEEDED(hr)) { // DV preview is slightly different to all other previews if (ENC_DV != m_compressionCtrl.GetItemData(m_compressionCtrl.GetCurSel())) { // uncompressed, mpeg and wm preview // create the following // // Decklink Video Capture - Smart-T - AVI Decompressor - Video Renderer // Decklink Audio Capture - Default Audio Renderer // // render the preview pin on the smart-T filter // first connect the Decklink video capture pin to the smart-T hr = CDSUtils ConnectFilters(m_pGraph, m_pVideoCapture, NULL, m_pSmartT, NULL); if (SUCCEEDED(hr)) { // now connect the preview pin of the smart-T to the video renderer hr = CDSUtils ConnectFilters(m_pGraph, m_pSmartT, L"Preview", m_pVideoRenderer, NULL); } } else { // DV Preview // create the following // // Decklink Video Capture - AVI Decompressor - Smart-T - Colour Space Converter - Video Renderer // Decklink Audio Capture - Default Audio Renderer // // this is a more efficient graph than created by the ICaptureGraphBuilder2 interface // add the AVI decompressor and colour space converter filters CComPtr IBaseFilter pAVIDecompressor = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_AVIDec, L"AVI Decompressor", pAVIDecompressor); if (SUCCEEDED(hr)) { CComPtr IBaseFilter pColourSpaceConverter = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_Colour, L"Color Space Converter", pColourSpaceConverter); if (SUCCEEDED(hr)) { // conect the Decklink video capture pin to the AVI decompressor hr = CDSUtils ConnectFilters(m_pGraph, m_pVideoCapture, NULL, pAVIDecompressor, NULL); if (SUCCEEDED(hr)) { // connect AVI decompressor to the smart-T hr = CDSUtils ConnectFilters(m_pGraph, pAVIDecompressor, NULL, m_pSmartT, NULL); if (SUCCEEDED(hr)) { // connect the preview pin of the smart-T to the colour space converter hr = CDSUtils ConnectFilters(m_pGraph, m_pSmartT, L"Preview", pColourSpaceConverter, NULL); if (SUCCEEDED(hr)) { // connect the colour space converter to the video renderer hr = CDSUtils ConnectFilters(m_pGraph, pColourSpaceConverter, NULL, m_pVideoRenderer, NULL); } } } } } } } } else { hr = E_POINTER; } if (SUCCEEDED(hr)) { // the video path has been connected, initialise the preview window InitialiseVideoPreview(); // optionally connect the audio path if (FALSE == m_bAudioMute) { // connect the Decklink audio capture pin to the mux hr = CDSUtils RenderFilter(m_pGraph, m_pAudioCapture, L"Capture"); } // run the graph so that we can preview the input video if (m_pControl) { hr = m_pControl- Run(); } else { hr = E_POINTER; } } return hr; } //----------------------------------------------------------------------------- // CreateCaptureGraph // Create a graph to capture the input HRESULT CDecklinkCaptureDlg CreateCaptureGraph() { HRESULT hr = S_OK; // tack the file writer onto the preview graph if (m_pGraph m_pControl) { // stop the graph as we are about to modify it m_pControl- Stop(); // remove the default audio renderer so the Decklink audio capture filter // can be connected to the AVI mux, we will not preview audio whilst capturing CComPtr IPin pIPinOutput = NULL; hr = CDSUtils GetPin(m_pAudioCapture, L"Capture", pIPinOutput); if (SUCCEEDED(hr)) { // to disconnect both pins must be disconnected // find the pin connected to the Decklink audio capture pin CComPtr IPin pIPinConnection = NULL; hr = pIPinOutput- ConnectedTo( pIPinConnection); if (SUCCEEDED(hr)) { // disconnect the pins hr = m_pGraph- Disconnect(pIPinOutput); hr = m_pGraph- Disconnect(pIPinConnection); // get the owning filter of the downstream pin and remove it from the graph PIN_INFO pinInfo = {0}; hr = pIPinConnection- QueryPinInfo( pinInfo); if (SUCCEEDED(hr)) { if (pinInfo.pFilter) { hr = m_pGraph- RemoveFilter(pinInfo.pFilter); pinInfo.pFilter- Release(); } } } } // retrieve the capture filename m_captureFileCtrl.GetWindowText(m_captureFile); // store filename USES_CONVERSION; WCHAR captureFile[MAX_PATH]; wcsncpy(captureFile, A2W(m_captureFile), MAX_PATH); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetString("CaptureFile", reinterpret_cast const BYTE* (captureFile), sizeof(captureFile))); // decide the type of capture graph to build switch (m_compressionCtrl.GetItemData(m_compressionCtrl.GetCurSel())) { default case ENC_NONE hr = CreateUncompressedCaptureGraph(); break; case ENC_DV hr = CreateDVCaptureGraph(); break; case ENC_WM hr = CreateWMCaptureGraph(); break; } if (FAILED(hr)) { // there was a problem building the capture graph, issue a message // and rebuild preview graph char buffer[128]; StringCbPrintfA(buffer, sizeof(buffer), "The error 0x%08lx was detected when creating the capture graph with the following file name \r\n\r\n %s ", hr, m_captureFile); MessageBox(buffer, _T("Error"), MB_ICONERROR); OnBnClickedButtonStop();// destroy broken capture graph, build preview graph and enable controls } } else { hr = E_POINTER; } return hr; } //----------------------------------------------------------------------------- // CreateUncompressedCaptureGraph // Create an optimum uncompressed capture graph HRESULT CDecklinkCaptureDlg CreateUncompressedCaptureGraph() { HRESULT hr = S_OK; // uncompressed capture // locate the AVI mux and file writer filters and add them to the graph CComPtr IBaseFilter pAVIMux = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_AviDest , L"AVI Mux", pAVIMux); if (SUCCEEDED(hr)) { CComPtr IBaseFilter pFileWriter = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_FileWriter, L"File writer", pFileWriter); if (SUCCEEDED(hr)) { // set the output filename CComQIPtr IFileSinkFilter, IID_IFileSinkFilter pIFS = pFileWriter; if (pIFS) { USES_CONVERSION;// for T2W macro hr = pIFS- SetFileName(T2W(m_captureFile), NULL); if (SUCCEEDED(hr)) { // connect the smart-T capture pin to the mux hr = CDSUtils ConnectFilters(m_pGraph, m_pSmartT, L"Capture", pAVIMux, NULL); if (SUCCEEDED(hr)) { // connect the mux to the file writer hr = CDSUtils ConnectFilters(m_pGraph, pAVIMux, NULL, pFileWriter, NULL); if (SUCCEEDED(hr)) { // video path connected now optionally connect the audio path if (FALSE == m_bAudioMute) { // connect the Decklink audio capture pin to the mux hr = CDSUtils ConnectFilters(m_pGraph, m_pAudioCapture, L"Capture", pAVIMux, NULL); } if (SUCCEEDED(hr)) { m_pControl- Run(); } } } } } } } return hr; } //----------------------------------------------------------------------------- // CreateDVCaptureGraph // Create an optimum DV capture graph // NOTE that this will only work for SD HRESULT CDecklinkCaptureDlg CreateDVCaptureGraph() { HRESULT hr = S_OK; // locate the DV encoder, AVI mux and file writer filters and add them to the graph CComPtr IBaseFilter pDVEncoder = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_DVVideoEnc, L"DV Video Encoder", pDVEncoder); if (SUCCEEDED(hr)) { CComPtr IBaseFilter pAVIMux = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_AviDest , L"AVI Mux", pAVIMux); if (SUCCEEDED(hr)) { CComPtr IBaseFilter pFileWriter = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_FileWriter, L"File writer", pFileWriter); if (SUCCEEDED(hr)) { // set the output filename CComQIPtr IFileSinkFilter, IID_IFileSinkFilter pIFS = pFileWriter; if (pIFS) { USES_CONVERSION;// for T2W macro hr = pIFS- SetFileName(T2W(m_captureFile), NULL); if (SUCCEEDED(hr)) { // configure the DV encoder CComQIPtr IDVEnc, IID_IDVEnc pIDV = pDVEncoder; if (pIDV) { // located a DV compression filter, set the format int videoFormat, dvFormat, resolution; hr = pIDV- get_IFormatResolution( videoFormat, dvFormat, resolution, FALSE, NULL); if (SUCCEEDED(hr)) { ASSERT(DVENCODERFORMAT_DVSD == dvFormat); ASSERT(DVENCODERRESOLUTION_720x480 == resolution); if ((DVENCODERVIDEOFORMAT_NTSC == videoFormat) (576 == m_vihDefault.bmiHeader.biHeight)) { // set the encoder to PAL if its NTSC videoFormat = DVENCODERVIDEOFORMAT_PAL; hr = pIDV- put_IFormatResolution(videoFormat, dvFormat, resolution, FALSE, NULL); } else if ((DVENCODERVIDEOFORMAT_PAL == videoFormat) (486 == m_vihDefault.bmiHeader.biHeight)) { // set the encoder to NTSC if its PAL videoFormat = DVENCODERVIDEOFORMAT_NTSC; hr = pIDV- put_IFormatResolution(videoFormat, dvFormat, resolution, FALSE, NULL); } } } if (SUCCEEDED(hr)) { // if the format is PAL, insert the Decklink field swap filter, PAL DV is the opposite // field order to PAL SD if (576 == m_vihDefault.bmiHeader.biHeight) { CComPtr IBaseFilter pPALFieldSwap = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_DecklinkFieldSwap, L"Decklink PAL Field Swap", pPALFieldSwap); if (SUCCEEDED(hr)) { // connect the smart-T capture pin to the PAL field swap filter hr = CDSUtils ConnectFilters(m_pGraph, m_pSmartT, L"Capture", pPALFieldSwap, NULL); if (SUCCEEDED(hr)) { // connect the field swap filter to the DV encoder hr = CDSUtils ConnectFilters(m_pGraph, pPALFieldSwap, NULL, pDVEncoder, NULL); } } } else { // connect the smart-T capture pin to the DV Encoder hr = CDSUtils ConnectFilters(m_pGraph, m_pSmartT, L"Capture", pDVEncoder, NULL); } if (SUCCEEDED(hr)) { // connect the DV encoder output to the AVI mux hr = CDSUtils ConnectFilters(m_pGraph, pDVEncoder, NULL, pAVIMux, NULL); if (SUCCEEDED(hr)) { // connect the mux to the file writer hr = CDSUtils ConnectFilters(m_pGraph, pAVIMux, NULL, pFileWriter, NULL); if (SUCCEEDED(hr)) { // video path connected now optionally connect the audio path if (FALSE == m_bAudioMute) { // connect the Decklink audio capture pin to the mux hr = CDSUtils ConnectFilters(m_pGraph, m_pAudioCapture, L"Capture", pAVIMux, NULL); } if (SUCCEEDED(hr)) { m_pControl- Run(); } } } } } } } } } } return hr; } //----------------------------------------------------------------------------- // CreateWMCaptureGraph // Create an optimum Windows Media capture graph HRESULT CDecklinkCaptureDlg CreateWMCaptureGraph() { HRESULT hr = S_OK; // locate the asf writer filter and add it to the graph CComPtr IBaseFilter pASFWriter = NULL; hr = CDSUtils AddFilter(m_pGraph, CLSID_WMAsfWriter, L"WM ASF Writer", pASFWriter); if (SUCCEEDED(hr)) { // set the output filename CComQIPtr IFileSinkFilter, IID_IFileSinkFilter pIFS = pASFWriter; if (pIFS) { USES_CONVERSION;// for T2W macro hr = pIFS- SetFileName(T2W(m_captureFile), NULL); if (SUCCEEDED(hr)) { hr = ConfigureWMEncoder(pASFWriter); } } if (SUCCEEDED(hr)) { if (FALSE == m_bAudioMute) { // connect the Decklink audio capture pin to the ASF writer hr = CDSUtils ConnectFilters(m_pGraph, m_pAudioCapture, pASFWriter, MEDIATYPE_Audio); } if (SUCCEEDED(hr)) { // connect the smart-T capture pin to the ASF writer hr = CDSUtils ConnectFilters(m_pGraph, m_pSmartT, pASFWriter, MEDIATYPE_Video); if (SUCCEEDED(hr)) { m_pControl- Run(); } } } } return hr; } //----------------------------------------------------------------------------- // ConfigureWMEncoder // Configure the Windows Media encoder HRESULT CDecklinkCaptureDlg ConfigureWMEncoder(IBaseFilter* pASFWriter) { HRESULT hr = S_OK; // modify the video output resolution of a system profile if (pASFWriter) { // simple system profile encoding CComQIPtr IConfigAsfWriter, IID_IConfigAsfWriter pICW = pASFWriter; if (pICW) { //NOTE You could just use the following for a default system profile //hr = pICW- ConfigureFilterUsingProfileGuid(WMProfile_XXX);// RE wmsysprf.h //NOTE If you want video only capture you must modify the profile to remove the audio // otherwise encoding will fail // Load a system profile and modify the resolution of the video output // NOTE The scope of the encoding is enormous, this just demonstrates how to change // the output video resolution from 320x240 to something larger. // Changing the resolution affects coding performance, it is likely that the encoder will // start to drop frames after a while. Using WM9 codecs will probably improve performance // and that has been left to the reader... ;o) // // get a profile manager CComPtr IWMProfileManager pIWMProfileManager = NULL; hr = WMCreateProfileManager( pIWMProfileManager); if (SUCCEEDED(hr)) { // load a system profile to modify CComPtr IWMProfile pIWMProfile = NULL; // NOTE Any WMProfile_XXX could be used here, or create a custom profile from scratch hr = pIWMProfileManager- LoadProfileByID(WMProfile_V80_FAIRVBRVideo, pIWMProfile); if (SUCCEEDED(hr)) { // search the streams for the video stream and attempt to modify the video size DWORD cbStreams = 0; hr = pIWMProfile- GetStreamCount( cbStreams); if (SUCCEEDED(hr)) { IWMStreamConfig* pIWMStreamConfig = NULL; GUID streamType = {0}; DWORD stream; if (m_bAudioMute) { // remove the audio stream for video only capture for (stream=0; stream cbStreams; ++stream) { hr = pIWMProfile- GetStream(stream, pIWMStreamConfig); if (SUCCEEDED(hr)) { hr = pIWMStreamConfig- GetStreamType( streamType); if (SUCCEEDED(hr)) { if (MEDIATYPE_Audio == streamType) { if (SUCCEEDED(pIWMProfile- RemoveStream(pIWMStreamConfig))) { --cbStreams; } SAFE_RELEASE(pIWMStreamConfig); break; } } } } } for (stream=0; stream cbStreams; ++stream) { hr = pIWMProfile- GetStream(stream, pIWMStreamConfig); if (SUCCEEDED(hr)) { hr = pIWMStreamConfig- GetStreamType( streamType); if (SUCCEEDED(hr) (MEDIATYPE_Video == streamType)) { // found the video stream CComQIPtr IWMMediaProps, IID_IWMMediaProps pIWMMediaProps = pIWMStreamConfig; if (pIWMMediaProps) { // get the size of the media type WM_MEDIA_TYPE* pMediaType = NULL; DWORD cbMediaType = 0; hr = pIWMMediaProps- GetMediaType(pMediaType, cbMediaType); if (SUCCEEDED(hr)) { pMediaType = (WM_MEDIA_TYPE*)new char [cbMediaType]; if (pMediaType) { hr = pIWMMediaProps- GetMediaType(pMediaType, cbMediaType); if (SUCCEEDED(hr)) { BITMAPINFOHEADER* pbmih = NULL; if (WMFORMAT_VideoInfo == pMediaType- formattype) { WMVIDEOINFOHEADER* pvih = (WMVIDEOINFOHEADER*)pMediaType- pbFormat; pbmih = pvih- bmiHeader; } else if (WMFORMAT_MPEG2Video == pMediaType- formattype) { WMVIDEOINFOHEADER2* pvih = (WMVIDEOINFOHEADER2*) ((WMMPEG2VIDEOINFO*)pMediaType- pbFormat)- hdr; pbmih = pvih- bmiHeader; } if (pbmih) { // modify the video dimensions, set the property, reconfigure the stream // and then configure the ASF writer with this modified profile pbmih- biWidth = 640;// was 320; pbmih- biHeight = 480;// was 240; pbmih- biSizeImage = pbmih- biWidth * pbmih- biHeight * pbmih- biBitCount / 8;// NOTE This calculation is not correct for all bit depths hr = pIWMMediaProps- SetMediaType(pMediaType); if (SUCCEEDED(hr)) { // config the ASF writer filter to use this modified system profile hr = pIWMProfile- ReconfigStream(pIWMStreamConfig); if (SUCCEEDED(hr)) { hr = pICW- ConfigureFilterUsingProfile(pIWMProfile); } } } } delete [] (char*)pMediaType; } } } } SAFE_RELEASE(pIWMStreamConfig); } } } } } /* // modify other ASF writer properties IServiceProvider* pProvider = NULL; hr = pASFWriter- QueryInterface(IID_IServiceProvider, reinterpret_cast void** ( pProvider)); if (SUCCEEDED(hr)) { IID_IWMWriterAdvanced2* pWMWA2 = NULL; hr = pProvider- QueryService(IID_IID_IWMWriterAdvanced2, IID_IID_IWMWriterAdvanced2, reinterpret_cast void** ( pWMWA2)); if (SUCCEEDED(hr)) { // set the deinterlace mode pWMWA2- GetInputSetting(...); SAFE_RELEASE(pWMWA2); } SAFE_RELEASE(pProvider); } */ } } else { hr = E_INVALIDARG; } return hr; } //----------------------------------------------------------------------------- // DestroyGraph // Remove all intermediate filters, keep any Decklink and video render filters as // these are used by all the graphs. HRESULT CDecklinkCaptureDlg DestroyGraph() { HRESULT hr = S_OK; if (m_pGraph m_pControl) { m_pControl- Stop(); // release our outstanding reference on this filter so it can be removed from the graph SAFE_RELEASE(m_pSmartT); // retrieve the name of the capture device, don t remove it in this method PWSTR pNameVideoCapture = (PWSTR)m_videoDeviceCtrl.GetItemData(m_videoDeviceCtrl.GetCurSel()); PWSTR pNameAudioCapture = (PWSTR)m_audioDeviceCtrl.GetItemData(m_audioDeviceCtrl.GetCurSel()); CComPtr IEnumFilters pEnum = NULL; hr = m_pGraph- EnumFilters( pEnum); if (SUCCEEDED(hr)) { IBaseFilter* pFilter = NULL; while (S_OK == pEnum- Next(1, pFilter, NULL)) { FILTER_INFO filterInfo = {0}; hr = pFilter- QueryFilterInfo( filterInfo); if (SUCCEEDED(hr)) { SAFE_RELEASE(filterInfo.pGraph); if ((NULL == wcsstr(filterInfo.achName, pNameVideoCapture)) (NULL == wcsstr(filterInfo.achName, pNameAudioCapture)) (NULL == wcsstr(filterInfo.achName, L"Video Renderer"))) { hr = m_pGraph- RemoveFilter(pFilter); if (SUCCEEDED(hr)) { hr = pEnum- Reset(); } } } SAFE_RELEASE(pFilter); } } } else { hr = E_POINTER; } return hr; } //----------------------------------------------------------------------------- // InitialiseVideoPreview // In short get the video screen renderer to draw into the picture control, which is our preview window // the following code sets this up, in addition to adding the HandleGraphEvent and WindowProc methods // read the DXSDK docos for more detailed information void CDecklinkCaptureDlg InitialiseVideoPreview(void) { // modify the preview window if (m_pVideoRenderer) { if (NULL == m_pIVW) { if (SUCCEEDED(m_pVideoRenderer- QueryInterface(IID_IVideoWindow, reinterpret_cast void** ( m_pIVW)))) { // get the window to handle redraws, etc // Set msg drain of VideoWindow to point to our dialog window. The dialog s // window procedure then handles events from the VideoWindow. HRESULT hr = m_pIVW- put_MessageDrain(reinterpret_cast OAHWND (m_hWnd)); if (NULL == m_pMediaEvent) { // Make graph send WM_GRAPHNOTIFY when it wants our attention see "Learning // When an Event Occurs" in the DX9 documentation. hr = m_pGraph- QueryInterface(IID_IMediaEventEx, reinterpret_cast void** ( m_pMediaEvent)); if (SUCCEEDED(hr)) { hr = m_pMediaEvent- SetNotifyWindow(reinterpret_cast OAHWND (m_hWnd), WM_GRAPHNOTIFY, 0); } // object created for it. RECT rc; m_preview.GetClientRect( rc); m_pIVW- SetWindowPosition(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); // VideoWindow is a child window of the bounding rect hr = m_pIVW- put_WindowStyle(WS_CHILD); hr = m_pIVW- put_Owner(reinterpret_cast OAHWND (m_preview.GetSafeHwnd())); hr = m_pIVW- SetWindowForeground(-1); } } } } } //----------------------------------------------------------------------------- // PopulateDeviceControl // Fill device combo box with available devices of the specified category HRESULT CDecklinkCaptureDlg PopulateDeviceControl(const GUID* pCategory, CComboBox* pCtrl) { HRESULT hr = S_OK; if (pCategory pCtrl) { // first enumerate the system devices for the specifed class and filter name CComPtr ICreateDevEnum pSysDevEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast void** ( pSysDevEnum)); if (SUCCEEDED(hr)) { CComPtr IEnumMoniker pEnumCat = NULL; hr = pSysDevEnum- CreateClassEnumerator(*pCategory, pEnumCat, 0); if (S_OK == hr) { IMoniker* pMoniker = NULL; bool Loop = true; while ((S_OK == pEnumCat- Next(1, pMoniker, NULL)) Loop) { IPropertyBag* pPropBag = NULL; hr = pMoniker- BindToStorage(0, 0, IID_IPropertyBag, reinterpret_cast void** ( pPropBag)); if (SUCCEEDED(hr)) { VARIANT varName; VariantInit( varName); hr = pPropBag- Read(L"FriendlyName", varName, 0); if (SUCCEEDED(hr)) { size_t len = wcslen(varName.bstrVal) + 1; PWSTR pName = new WCHAR [len]; StringCchCopyW(pName, len, varName.bstrVal); CW2AEX buf(varName.bstrVal); pCtrl- SetItemData(pCtrl- AddString(buf), (DWORD)pName); } VariantClear( varName); // contained within a loop, decrement the reference count SAFE_RELEASE(pPropBag); } SAFE_RELEASE(pMoniker); } } } } else { hr = E_POINTER; } return hr; } //----------------------------------------------------------------------------- // PopulateVideoControl // Fill video format combo box with supported video formats using the IAMStreamConfig // interface. HRESULT CDecklinkCaptureDlg PopulateVideoControl() { HRESULT hr = S_OK; if (m_pVideoCapture) { // free mediatypes attached to format controls int count = m_videoFormatCtrl.GetCount(); if (count) { for (int item=0; item count; ++item) { DeleteMediaType((AM_MEDIA_TYPE*)m_videoFormatCtrl.GetItemData(item)); } m_videoFormatCtrl.ResetContent(); } // locate the video capture pin and QI for stream control CComPtr IAMStreamConfig pISC = NULL; hr = CDSUtils FindPinInterface(m_pVideoCapture, MEDIATYPE_Video, PINDIR_OUTPUT, IID_IAMStreamConfig, reinterpret_cast void** ( pISC)); if (SUCCEEDED(hr)) { // loop through all the capabilities (video formats) and populate the control int count, size; hr = pISC- GetNumberOfCapabilities( count, size); if (SUCCEEDED(hr)) { if (sizeof(VIDEO_STREAM_CONFIG_CAPS) == size) { AM_MEDIA_TYPE* pmt = NULL; VIDEO_STREAM_CONFIG_CAPS vscc; VIDEOINFOHEADER* pvih = NULL; for (int index=0; index count; ++index) { hr = pISC- GetStreamCaps(index, pmt, reinterpret_cast BYTE* ( vscc)); if (SUCCEEDED(hr)) { char buffer[128]; WORD PixelFormat; float FrameRate; ZeroMemory(buffer, sizeof(buffer)); pvih = (VIDEOINFOHEADER*)pmt- pbFormat; char* pPixelFormatLUT[] = {"4 2 2", "4 4 4"}; if (pvih- bmiHeader.biBitCount == 16) PixelFormat = 8; else if (pvih- bmiHeader.biBitCount == 20) PixelFormat = 10; else PixelFormat = pvih- bmiHeader.biBitCount; // provide a useful description of the formats if (486 == pvih- bmiHeader.biHeight) { if (417083 == pvih- AvgTimePerFrame) { StringCbPrintfA(buffer, sizeof(buffer), "NTSC %d-bit %s (3 2 pulldown removal)", PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } else { StringCbPrintfA(buffer, sizeof(buffer), "NTSC %d-bit %s", PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } } else if (576 == pvih- bmiHeader.biHeight) { StringCbPrintfA(buffer, sizeof(buffer), "PAL %d-bit %s", PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } else { char* pFrameRateFormat[] = {"%.2f", "%.0f"}; FrameRate = (float)(long)UNITS / pvih- AvgTimePerFrame; if ((720 == pvih- bmiHeader.biHeight) (59.94 FrameRate)) { if ((FrameRate - (int)FrameRate) 0.01) { StringCbPrintfA(buffer, sizeof(buffer), "HD720 %.2fp %d-bit %s (Overcranked 60p)", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } else { StringCbPrintfA(buffer, sizeof(buffer), "HD720 %.0fp %d-bit %s (Overcranked 60p)", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } } else if ((720 == pvih- bmiHeader.biHeight) (59.94 = FrameRate)) { if ((FrameRate - (int)FrameRate) 0.01) { StringCbPrintfA(buffer, sizeof(buffer), "HD720 %.2fp %d-bit %s", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } else { StringCbPrintfA(buffer, sizeof(buffer), "HD720 %.0fp %d-bit %s", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } } else if ((1080 == pvih- bmiHeader.biHeight) (50.00 = FrameRate)) { if ((FrameRate - (int)FrameRate) 0.01) { StringCbPrintfA(buffer, sizeof(buffer), "HD1080 %.2fi %d-bit %s", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } else { StringCbPrintfA(buffer, sizeof(buffer), "HD1080 %.0fi %d-bit %s", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } } else { if ((FrameRate - (int)FrameRate) 0.01) { StringCbPrintfA(buffer, sizeof(buffer), "HD1080 %.2fPsF %d-bit %s", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } else { StringCbPrintfA(buffer, sizeof(buffer), "HD1080 %.0fPsF %d-bit %s", FrameRate, PixelFormat, pPixelFormatLUT[(30 == PixelFormat)]); } } } // add the item description to combo box int n = m_videoFormatCtrl.AddString(buffer); // store media type pointer in item s data section m_videoFormatCtrl.SetItemData(n, (DWORD_PTR)pmt); // set default format if ((pvih- AvgTimePerFrame == m_vihDefault.AvgTimePerFrame) (pvih- bmiHeader.biWidth == m_vihDefault.bmiHeader.biWidth) (pvih- bmiHeader.biHeight == m_vihDefault.bmiHeader.biHeight) (pvih- bmiHeader.biBitCount == m_vihDefault.bmiHeader.biBitCount)) { m_videoFormatCtrl.SetCurSel(n); pISC- SetFormat(pmt); } } } } else { m_videoFormatCtrl.AddString("ERROR Unable to retrieve video formats"); } } } } else { hr = E_POINTER; } return hr; } //----------------------------------------------------------------------------- // PopulateAudioControl // Fill audio format combo box with supported audio formats using the IAMStreamConfig // interface. HRESULT CDecklinkCaptureDlg PopulateAudioControl() { HRESULT hr = S_OK; if (m_pAudioCapture) { // free mediatypes attached to format controls int count = m_audioFormatCtrl.GetCount(); if (count) { for (int item=0; item count; ++item) { DeleteMediaType((AM_MEDIA_TYPE*)m_audioFormatCtrl.GetItemData(item)); } m_audioFormatCtrl.ResetContent(); } // locate the audio capture pin and QI for stream control CComPtr IAMStreamConfig pISC = NULL; hr = CDSUtils FindPinInterface(m_pAudioCapture, MEDIATYPE_Audio, PINDIR_OUTPUT, IID_IAMStreamConfig, reinterpret_cast void** ( pISC)); if (SUCCEEDED(hr)) { // loop through all the capabilities (audio formats) and populate the control int count, size; hr = pISC- GetNumberOfCapabilities( count, size); if (SUCCEEDED(hr)) { if (sizeof(AUDIO_STREAM_CONFIG_CAPS) == size) { AM_MEDIA_TYPE* pmt = NULL; AUDIO_STREAM_CONFIG_CAPS ascc; WAVEFORMATEX* pwfex = NULL; for (int index=0; index count; ++index) { hr = pISC- GetStreamCaps(index, pmt, reinterpret_cast BYTE* ( ascc)); if (SUCCEEDED(hr)) { char buffer[32]; ZeroMemory(buffer, sizeof(buffer)); pwfex = (WAVEFORMATEX*)pmt- pbFormat; // provide a useful description of the formats if (1 == pwfex- nChannels) { StringCbPrintfA(buffer, sizeof(buffer), "%d channel, %2.1fkHz, %d-bit", (int)pwfex- nChannels, (float)pwfex- nSamplesPerSec / 1000, (int)pwfex- wBitsPerSample); } else { StringCbPrintfA(buffer, sizeof(buffer), "%d channels, %2.1fkHz, %d-bit", (int)pwfex- nChannels, (float)pwfex- nSamplesPerSec / 1000, (int)pwfex- wBitsPerSample); } // add the item description to combo box int n = m_audioFormatCtrl.AddString(buffer); // store media type pointer in item s data section m_audioFormatCtrl.SetItemData(n, (DWORD_PTR)pmt); // set default format if ((pwfex- wFormatTag == m_wfexDefault.wFormatTag) (pwfex- nChannels == m_wfexDefault.nChannels) (pwfex- nSamplesPerSec == m_wfexDefault.nSamplesPerSec) (pwfex- nAvgBytesPerSec == m_wfexDefault.nAvgBytesPerSec)) { m_audioFormatCtrl.SetCurSel(n); pISC- SetFormat(pmt); } } } } else { m_audioFormatCtrl.AddString("ERROR Unable to retrieve audio formats"); } } } } else { hr = E_POINTER; } return hr; } //----------------------------------------------------------------------------- // PopulateCompressionControl // Fill compression control with a selection of video compressors, locate the // encoders and add them to the combo box if they exist. HRESULT CDecklinkCaptureDlg PopulateCompressionControl() { int n = m_compressionCtrl.AddString("Uncompressed"); m_compressionCtrl.SetItemData(n, (DWORD_PTR)ENC_NONE); // search for the DV encoder, MPEG encoder and WM encoder IBaseFilter* pFilter = NULL; HRESULT hr = CoCreateInstance(CLSID_DVVideoEnc, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast void** ( pFilter)); if (SUCCEEDED(hr)) { n = m_compressionCtrl.SetCurSel(m_compressionCtrl.AddString("DV Video Encoder")); m_compressionCtrl.SetItemData(n, (DWORD_PTR)ENC_DV); SAFE_RELEASE(pFilter); } hr = CoCreateInstance(CLSID_WMAsfWriter, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast void** ( pFilter)); if (SUCCEEDED(hr)) { n = m_compressionCtrl.SetCurSel(m_compressionCtrl.AddString("Windows Media Encoder")); m_compressionCtrl.SetItemData(n, (DWORD_PTR)ENC_WM); SAFE_RELEASE(pFilter); } m_compressionCtrl.SetCurSel(m_compressor); return S_OK; } //----------------------------------------------------------------------------- // OnCbnSelchangeComboVideodevice // Rebuild graph with selected capture device void CDecklinkCaptureDlg OnCbnSelchangeComboVideodevice() { SAFE_RELEASE(m_pVideoCapture);// release our outstanding reference // remove intermediate filters, since the device selection has changed the capture device will also be removed HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { // rebuild graph with new capture device selection PWSTR pName = (PWSTR)m_videoDeviceCtrl.GetItemData(m_videoDeviceCtrl.GetCurSel()); if (pName) { hr = CDSUtils AddFilter2(m_pGraph, CLSID_VideoInputDeviceCategory, pName, m_pVideoCapture); if (SUCCEEDED(hr)) { // as the device has changed get the current operating format so that the control // and display this as the current selection CComPtr IAMStreamConfig pISC = NULL; hr = CDSUtils FindPinInterface(m_pVideoCapture, MEDIATYPE_Video, PINDIR_OUTPUT, IID_IAMStreamConfig, reinterpret_cast void** ( pISC)); if (SUCCEEDED(hr)) { // get the current format of the device to set the current selection of the control AM_MEDIA_TYPE* pamt = NULL; hr = pISC- GetFormat( pamt); if (SUCCEEDED(hr)) { if (pamt- pbFormat) { m_vihDefault = *(VIDEOINFOHEADER*)pamt- pbFormat; } DeleteMediaType(pamt); } } hr = PopulateVideoControl();// repopulate the control with formats from the new device if (SUCCEEDED(hr)) { hr = CreatePreviewGraph();// rebuild the graph with the new device } } } else { hr = E_POINTER; } } } //----------------------------------------------------------------------------- // OnCbnSelchangeComboAudiodevice // Rebuild graph with selected capture device void CDecklinkCaptureDlg OnCbnSelchangeComboAudiodevice() { SAFE_RELEASE(m_pAudioCapture);// release our outstanding reference // remove intermediate filters, since the device selection has changed the capture device will also be removed HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { PWSTR pName = (PWSTR)m_audioDeviceCtrl.GetItemData(m_audioDeviceCtrl.GetCurSel()); if (pName) { hr = CDSUtils AddFilter2(m_pGraph, CLSID_AudioInputDeviceCategory, pName, m_pAudioCapture); if (SUCCEEDED(hr)) { // as the device has changed get the current operating format so that the control // and display this as the current selection CComPtr IAMStreamConfig pISC = NULL; hr = CDSUtils FindPinInterface(m_pAudioCapture, MEDIATYPE_Audio, PINDIR_OUTPUT, IID_IAMStreamConfig, reinterpret_cast void** ( pISC)); if (SUCCEEDED(hr)) { // get the current format of the device to set the current selection of the control AM_MEDIA_TYPE* pamt = NULL; hr = pISC- GetFormat( pamt); if (SUCCEEDED(hr)) { if (pamt- pbFormat) { m_wfexDefault = *(WAVEFORMATEX*)pamt- pbFormat; } DeleteMediaType(pamt); } } hr = PopulateAudioControl();// repopulate the control with formats from the new device if (SUCCEEDED(hr)) { hr = CreatePreviewGraph();// rebuild the graph with the new device } } } else { hr = E_POINTER; } } } //----------------------------------------------------------------------------- // OnCbnSelchangeComboVideoformats // Rebuild preview graph if format selection changed void CDecklinkCaptureDlg OnCbnSelchangeComboVideoformats() { HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { // locate the video capture pin and QI for stream control CComPtr IAMStreamConfig pISC = NULL; hr = CDSUtils FindPinInterface(m_pVideoCapture, MEDIATYPE_Video, PINDIR_OUTPUT, IID_IAMStreamConfig, reinterpret_cast void** ( pISC)); if (SUCCEEDED(hr)) { // set the new media format AM_MEDIA_TYPE* pmt = (AM_MEDIA_TYPE*)m_videoFormatCtrl.GetItemData(m_videoFormatCtrl.GetCurSel()); m_vihDefault = *(VIDEOINFOHEADER*)pmt- pbFormat; ASSERT(sizeof(VIDEOINFOHEADER) = pmt- cbFormat); hr = pISC- SetFormat(pmt); if (SUCCEEDED(hr)) { // save the new format EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("VideoFormat", reinterpret_cast const BYTE* ( m_vihDefault), sizeof(m_vihDefault))); // update compression control, we don t have an HD compression filter so disable compression for HD formats if (576 m_vihDefault.bmiHeader.biHeight) { m_compressor = 0; m_compressionCtrl.SetCurSel(m_compressor); // save the new state EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("VideoCompressor", reinterpret_cast const BYTE* ( m_compressor), sizeof(m_compressor))); m_bEnableCompressionCtrl = FALSE; } else { m_bEnableCompressionCtrl = TRUE; } EnableControls(); // rebuild the graph hr = CreatePreviewGraph(); } } } } //----------------------------------------------------------------------------- // OnCbnSelchangeComboAudioformats // Rebuild preview graph if format selection changed void CDecklinkCaptureDlg OnCbnSelchangeComboAudioformats() { HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { // locate the audio capture pin and QI for stream control CComPtr IAMStreamConfig pISC = NULL; hr = CDSUtils FindPinInterface(m_pAudioCapture, MEDIATYPE_Audio, PINDIR_OUTPUT, IID_IAMStreamConfig, reinterpret_cast void** ( pISC)); if (SUCCEEDED(hr)) { // set the new media format AM_MEDIA_TYPE* pmt = (AM_MEDIA_TYPE*)m_audioFormatCtrl.GetItemData(m_audioFormatCtrl.GetCurSel()); m_wfexDefault = *(WAVEFORMATEX*)pmt- pbFormat; ASSERT(sizeof(WAVEFORMATEX) == pmt- cbFormat); hr = pISC- SetFormat(pmt); if (SUCCEEDED(hr)) { // save the new format EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("AudioFormat", reinterpret_cast const BYTE* ( m_wfexDefault), sizeof(m_wfexDefault))); // rebuild the graph hr = CreatePreviewGraph(); } } } } //----------------------------------------------------------------------------- // OnCbnSelchangeComboCompression // Rebuild preview graph if compression selection changed void CDecklinkCaptureDlg OnCbnSelchangeComboCompression() { HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { // save the new state m_compressor = m_compressionCtrl.GetCurSel(); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("VideoCompressor", reinterpret_cast const BYTE* ( m_compressor), sizeof(m_compressor))); // rebuild the graph hr = CreatePreviewGraph(); } } //----------------------------------------------------------------------------- // OnBnClickedCheckAudiomute // Rebuild the capture graph to reflect the new audio setting void CDecklinkCaptureDlg OnBnClickedCheckAudiomute() { CButton* pCheck = (CButton*)GetDlgItem(IDC_CHECK_AUDIOMUTE); if (pCheck) { m_bAudioMute = pCheck- GetState() 0x0003; HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { // save the new state EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("AudioMute", reinterpret_cast const BYTE* ( m_bAudioMute), sizeof(m_bAudioMute))); // rebuild the graph which reflects the new audio setting hr = CreatePreviewGraph(); } } } //----------------------------------------------------------------------------- // OnBnClickedButtonBrowse // Create a file open dialog to browse for a file location void CDecklinkCaptureDlg OnBnClickedButtonBrowse() { char BASED_CODE szFilters[] = "Windows Media Files|*.avi;*.asf;*.wmv|All Files (*.*)|*.*||"; char* pExt[] = {"*.avi", "*.avi", "*.asf;*.wmv"}; CFileDialog FileDlg(TRUE, "Windows Media Files", pExt[m_compressor], 0, szFilters, this); if (FileDlg.DoModal() == IDOK) { m_captureFile = FileDlg.GetPathName(); m_captureFileCtrl.SetWindowText(m_captureFile); } } //----------------------------------------------------------------------------- // OnBnClickedButtonCapture // Create a capture graph a start capture void CDecklinkCaptureDlg OnBnClickedButtonCapture() { HRESULT hr = CreateCaptureGraph(); if (SUCCEEDED(hr)) { if (m_pControl) { hr = m_pControl- Run(); if (SUCCEEDED(hr)) { DisableControls(); } } } } //----------------------------------------------------------------------------- // OnBnClickedButtonStop // Stop capture and revert to preview void CDecklinkCaptureDlg OnBnClickedButtonStop() { HRESULT hr = DestroyGraph(); if (SUCCEEDED(hr)) { hr = CreatePreviewGraph(); if (SUCCEEDED(hr)) { EnableControls(); } } } //----------------------------------------------------------------------------- // EnableControls // void CDecklinkCaptureDlg EnableControls(void) { CWnd* pWnd = GetDlgItem(IDC_COMBO_VIDEOFORMATS); pWnd- EnableWindow(TRUE); pWnd = GetDlgItem(IDC_COMBO_AUDIOFORMATS); pWnd- EnableWindow(TRUE); pWnd = GetDlgItem(IDC_CHECK_AUDIOMUTE); pWnd- EnableWindow(TRUE); pWnd = GetDlgItem(IDC_COMBO_COMPRESSION); m_bEnableCompressionCtrl = (576 m_vihDefault.bmiHeader.biHeight) ? FALSE TRUE;// don t have an HDV codec do disable compression control for HD formats pWnd- EnableWindow(m_bEnableCompressionCtrl); pWnd = GetDlgItem(IDC_EDIT_CAPTUREFILE); pWnd- EnableWindow(TRUE); pWnd = GetDlgItem(IDC_BUTTON_BROWSE); pWnd- EnableWindow(TRUE); pWnd = GetDlgItem(IDC_BUTTON_CAPTURE); pWnd- EnableWindow(TRUE); pWnd = GetDlgItem(IDC_BUTTON_STOP); pWnd- EnableWindow(FALSE); } //----------------------------------------------------------------------------- // DisableControls // void CDecklinkCaptureDlg DisableControls(void) { CWnd* pWnd = GetDlgItem(IDC_COMBO_VIDEOFORMATS); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_COMBO_AUDIOFORMATS); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_CHECK_AUDIOMUTE); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_COMBO_COMPRESSION); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_EDIT_CAPTUREFILE); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_BUTTON_BROWSE); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_BUTTON_CAPTURE); pWnd- EnableWindow(FALSE); pWnd = GetDlgItem(IDC_BUTTON_STOP); pWnd- EnableWindow(TRUE); } //----------------------------------------------------------------------------- // QueryRegistry // retrieve previous media formats from registry void CDecklinkCaptureDlg QueryRegistry(void) { if (ERROR_SUCCESS == m_regUtils.Open("DecklinkCaptureSample")) { EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.GetBinary("VideoFormat", reinterpret_cast LPBYTE ( m_vihDefault), sizeof(m_vihDefault))); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.GetBinary("AudioFormat", reinterpret_cast LPBYTE ( m_wfexDefault), sizeof(m_wfexDefault))); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.GetBinary("AudioMute", reinterpret_cast LPBYTE ( m_bAudioMute), sizeof(m_bAudioMute))); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.GetBinary("VideoCompressor", reinterpret_cast LPBYTE ( m_compressor), sizeof(m_compressor))); WCHAR captureFile[MAX_PATH]; ZeroMemory(captureFile, sizeof(captureFile)); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.GetString("CaptureFile", reinterpret_cast LPBYTE (captureFile), sizeof(captureFile))); m_captureFile = captureFile; } else { // create the key and registry values if (ERROR_SUCCESS == m_regUtils.Create("DecklinkCaptureSample")) { EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("VideoFormat", reinterpret_cast const BYTE* ( m_vihDefault), sizeof(m_vihDefault))); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("AudioFormat", reinterpret_cast const BYTE* ( m_wfexDefault), sizeof(m_wfexDefault))); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("AudioMute", reinterpret_cast const BYTE* ( m_bAudioMute), sizeof(m_bAudioMute))); EXECUTE_ASSERT(ERROR_SUCCESS == m_regUtils.SetBinary("VideoCompressor", reinterpret_cast const BYTE* ( m_compressor), sizeof(m_compressor))); } } // update mute audio check box control CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_AUDIOMUTE); pButton- SetCheck(m_bAudioMute); }
https://w.atwiki.jp/shell-sea/pages/29.html
Controls コントローラーの使い方 本ゲームは、Wiiリモコンの他に、ヌンチャクが必要です。 ボタンを押すだけではなく、 リモコンを振る ボタンを軽く叩く ボタン長押し などで、攻撃が変わります。色々試して見ましょう。 Aボタン 決定/パンチ Bボタン キャンセル/キック A+Bボタン ゲームスタート/強攻撃 Cボタン 遠距離攻撃(エネルギー消費) C+Zボタン エネルギーチャージ Zボタン ガード Zボタン ヌンチャクを振る→ダッシュ ヌンチャク↑振る ジャンプ ヌンチャク+リモコン↓振る つかみ 1ボタン 属性効果/属性攻撃の発動 2ボタン 挑発
https://w.atwiki.jp/dominions3/pages/696.html
Control the Dead 狭い範囲のアンデッドを支配下に置こうと試みます Control the Dead ジェム 疲労 内部ID 671 0 20 使用 水中判定 効果 効果量 戦闘 水中可 Enslave Mind 主属性 主Lv 効果発生数 射程距離 Death 2 1 20 副属性 副Lv 効果範囲 命中補正 - 0 1 0 領域 Lv 防御判定 抵抗判定 Thaumaturgy 5 防御無視 抵抗可能 専用国家 ゲーム内説明文 The caster takes control over some undead beings. Powerful undead will be able to resist the necromancer. 和訳 術者はいくらかのアンデッドを制御します。強力なアンデッドは降霊術師に抵抗することができます。 注記 対アンデッド用のEnslave Mind。本家より解禁が早く、小範囲に作用する。 使用条件が甘いために使いやすく、抵抗を突破する自信があるならただ単に倒すよりも有益。射程は長くなく精度補正も無いが、大群に向けて放てば誰かには当たってくれるはず。 また前提の甘さは高スキルによる抵抗貫通ボーナスの得やすさにも繋がり、単に使い手を量産するのも容易。少々抵抗力が高い程度の大物なら十分標的にできるだろう。 コメント 名前 コメント
https://w.atwiki.jp/nicoratch/pages/1094.html
概要 MIDIコントローラー。ほとんどのボタンはバックライト付きで視認性が高い。Virtual DJ LE同梱。 スペック表 The perfect MIDI controller for all-round DJ-use (parties, bedroom, bars, …) Thanks to standard MIDI-communication this controller can be used with any MIDI DJ-software you can imagine! Most of the buttons are backlit easy to use in dark venues. Professional mixing result guaranteed, even for inexperienced DJs! Can be used on any modern laptop or PC (Windows® XP/Vista/7/8/8.1 and Mac® OSX) Easy plug play installation no computer skills needed! Fully optimized for use with Virtual-DJ software (LE-version included!) “1-click” beat matching, automatic beat loops, instant beat detection, ... Beat synced samplers, very accurate master tempo, 3 cue points per track, , … Video mixing creative mixing of video clips! Plays MP3, WAV, CDA, WMA, and many more … Upgrade to Virtual-DJ PRO FULL at a discounted price! Fully supported starting from VirtualDJ ver 7.0.5b PRO FULL (build 380) DJ-KONTROL1 https //jb-systems.eu/dj-kontrol-1
https://w.atwiki.jp/gcmatome/pages/8263.html
Control 【こんとろーる】 ジャンル アクションアドベンチャー 対応機種 プレイステーション4Xbox OneWindows (Epic Games Store / Steam)Nintendo Switchプレイステーション5Xbox Series X/S 発売元 505Games 開発元 レメディー・エンターテインメント 発売日 【PS4/One/Win (Epic Games Store)】2019年8月27日【Win (Steam)】2020年8月28日【Switch】2020年10月28日【PS5/XSX】2021年2月2日 定価 【PS4/Switch/PS5/XSX】4,980円 (DL版)【PS4】6,800円 (パッケージ版)【Win】4,180円 (Epic Games Store) / 4,980円 (Steam)(*1) プレイ人数 1人 レーティング CERO D(17才以上対象) 備考 IGN US 2019 Game of the Year受賞作品 判定 なし ポイント 超常アイテムの収容に奔走するアクションアドベンチャーリアルタイム・レイトレーシングによる美麗グラフィックボスや超常現象の魅力は今一つ 概要 ストーリー 特徴 評価点 賛否両論点 問題点 総評 余談 その後の展開 未知の世界を生き抜け。 概要 『ALAN WAKE』『Quantum Break』を手掛けたフィンランドのREMEDYが送る、超能力を駆使するTPS・アクションアドベンチャー。 全体的なプレイ感は『Saints Row IV』+『inFAMOUS』といった感じで、ゲーム全体の雰囲気に反し豪快でド派手なアクションを楽しめる。 NvidiaのRTXシリーズグラフィックスカード、及びAMD Radeon RX 6000シリーズ以降のグラフィックスカードでは「リアルタイム・レイトレーシング」機能の対応により反射像の表現が緻密になっており、非常に美麗なグラフィックが特徴。 エンジン自体は『QUANTUM BREAK』で使われた自社製のNorthlightエンジンを改良したものが使われているのに加えて、NvidiaのRTXシリーズ向けにDLSS 2.0にも対応している。 そのため、RTX 3060や2070 SuperなどのGPUでも一定のパフォーマンスを保ちながらそこそこの4K画質でプレイ可能。なお、AMDのFidelityFXには非対応。 ストーリー 超常現象を引き起こす「変貌アイテム」を収集し収容する政府機関「捜査局」を訪れた主人公のジェシー・フェイデン。 自分の頭に語り掛けてくる声「ポラリス」に導かれて来た彼女は、局長が拳銃自殺する現場 に立ち会ってしまう。 ジェシーは局長の拳銃を拾い上げるが、それは「サービスウエポン」と呼ばれる「パワーオブジェクト」だった。 そのまま「アストラルプレーン」で一連の儀式を受けたジェシーは、サービスウエポンの所有者、そして捜査局の新局長に任命される。 新局長ジェシーは、「ヒス」に侵略された捜査局の秩序と機能を取り戻すため超巨大ビルであり捜査局本部でもある「オールデスト・ハウス」を奔走する。 特徴 舞台設定 捜査局 異常なオブジェクトを収集し管理している米国の政府機関。 変貌アイテム・パワーオブジェクト 捜査局が収容している超自然的なアイテム。 変貌アイテムは人間にとって有害あるいは無益な存在だが、パワーオブジェクトは「結合」した人間に超能力をもたらす。 ヒス 実体を持たず、異次元からの信号として現れる敵対的存在。この信号に共鳴し支配された捜査局の局員が「ヒス生命体」となり、敵キャラとして出現する。 ちなみに上記のような設定は、いわゆるシェアードワールド創作を行う実在のWebコミュニティ「SCP財団」の世界観をベースにしている。 SCP財団は「超常的存在の確保(Secure)・収容(Contain)・保護(Protect)を目的とする団体」という設定で、ユーザーは創作した怪異や超常現象を財団の収容対象「SCP」として投稿できる。 英語圏で始まったコミュニティだが、有志翻訳を介して世界的に広まっており、各言語のサイトが開設されている。例えば日本語版コミュニティは「日本支部」としてサイトを開設している。 本作スタッフ自身が「SCP財団に影響を受けた」と語っているが、実際には「ベースにしている」と言って差し支えないレベルで基本的な設定を踏襲している。 主人公の能力 サービスウエポン 主人公のメインウエポンとなる黒いピストル型のパワーオブジェクト。 残弾の概念が無く、エネルギーゲージを消費し、時間経過でエネルギーがチャージされる形式を取っている。 本作では武器の持ち替えをサービスウエポンの変形として表現している。形態ごとに一発当たりの消費エネルギーが違う。 次のような形態がある。 通常 最初に持っている形態。一般的なピストルと同様の挙動。 粉砕 ショットガンにあたる。距離減衰がかなりきつく、強化で調整して本領を発揮する。 連射 マシンガン。DPSは高いが精度があまり高くなく、近~中距離のザコ向け。 貫通 スナイパー? チャージショットで、高精度・高威力だが1発でエネルギーの半分を消費する。物体の破壊能力も高い。 爆発 グレネード。チャージが必要だが高威力。3発を同時に飛ばすこともでき、瞬間火力が非常に高い。 サージ 粘着爆弾。左クリックで発射し右クリックで爆発。瓦礫に貼り付けて瓦礫ごと投げつけるということも可能。 超能力 主人公が使う各種のスキル。 クエストをクリアしパワーオブジェクトと結合することで習得。 こちらもコストはエネルギーゲージで、時間経過で回復する。サービスウエポンのものとは別のゲージのため、両者を補完し合いスキを消すのが重要になる。 超能力は装備やスロットという概念が無く、全ての能力が常時使える。 次のような能力が使える。 投擲 念力。周囲の物品を念力で保持し、投げつける。投げる品物によっては強烈なダメージになる。 回避 短距離テレポート。緊急回避にあたる。回避のほか、空中ダッシュやガラス面を突き破るのにも使える。 防御 シールド。周囲の瓦礫を持ち上げ弾を遮る。 洗脳 HPの減った敵を洗脳し味方にできる。 浮揚 ハイジャンプとホバリング移動。エネルギーゲージを消費しないが制限時間がある。アップグレードで急降下攻撃も可能。 クラフト・アップグレード クラフト ゲーム内での名称は「アストラル・ビルディング」で、コントロールポイントでのみ行える。 敵の撃破報酬である「根源」と確率でドロップする素材の「資産」を消費してクラフトを行うことができる。 「資産」には十数種類があり、クラフトの対象によって要求するものが違う。 クラフト対象は「サービスウエポンの形態解放」「サービスウエポンの強化スロット解放」「強化アイテム生成」である。 能力のアップグレード クエスト報酬、隠しエリア発見などで集める「能力ポイント」を消費して能力の強化ができる。コントロールポイントでのみ行える。 HP、エネルギー量などのベーシックな強化と、超能力の強化及び派生スキルの解放と強化ができる。 例えば「投擲」の派生で「敵を投げる」「浮揚」の派生で「叩きつけ」などがある。 スロットの概念はなく、全てが常時発揮される効果。 サービスウエポン・主人公のアップグレード 主人公と武器の形態ごとに3枠のスロットが設定されており、それぞれに強化アイテムをセットすることで強化できる。 主人公のスロットは、能力アップグレードの進行具合に応じて順次解放。 サービスウエポンのアップグレードは上述のクラフトで解放。 HPボーナス、エネルギー回復ボーナスなどの基本的なものから、根源回収時のゲージ回復、叩きつけキル後のダメージボーナスなどの複雑なものも。 評価点 美しいグラフィック グラフィックは高品質で美しい。グラフィックスカードにもよるが反射光の表現は特に優れており、壁面に投影されているプロジェクターの映像が天井の金属部分に反射して映っているなど、細かい部分まで精密な映像表現を実現している。 上位のヒスの赤オーラ、青く光るヘルス要素、暗所での爆破、マズルフラッシュ、黒光りする鉱石など、光の表現全体のレベルが高く、臨場感のある映像を楽しめる。 床の構造材を引き剥がして盾にする超能力の描写もリアル。剥がされた床がしばらく経つと元に戻るのはいかにもゲーム的な処理ではあるが。 マップの造形も良好で、コンクリートむき出しの威圧的なブルータル建築がしっかりと作られている。 威圧感・閉塞感のあるオフィスのマップが多い一方で、鉱山・アストラル空間・パノプティコンといった特別な地区は開所となっておりメリハリがついている。 各種小物の造形もよく、投げつけたフォークリフトがバラバラになる、チェスト類は引き出しが出入りするなどしっかり作りこまれている。 「オールデスト・ハウス内では最新技術禁止」という設定から、登場する電子機器や銃器類はレトロな外見。なかなか味わいがある(*2)。 収集要素がユニーク よくある書類類のほかに、実写のビデオや人形劇、音声記録、細かく存在するムービーもすべて後から見返すことができる。 書類関係も、変貌オブジェクトのプロフィールをはじめ、部署内の通達、異常者が書いたような「配達不能郵便物」などユニークなものが揃っている。 ダーリング博士の解説ビデオもなかなかよくできている。前半は学者らしい早口なしゃべり、後半は状況の切迫が伝わってくる。 「スレッショルドキッズ」という人形劇は、子供に変貌現実への対処を教える、というよくわからないものだが、子供向けの構成でありながら、間の取り方や構図で不気味になる絶妙な出来に仕上がっている。 賛否両論点 複雑怪奇なマップ構成 各所のマップは個性豊かな構成であり、オフィス、研究室、物置、作業場など数々のロケーションが複雑に組み合わされている。 特に研究セクターは非常に複雑で、階段、エレベーター、あるいは歩いては行けない通路などが立体的に組み合わされた構成。 これにより平面の地図がほとんど役立たずになっており、上下をウロウロしながら正しい道筋を探す面倒な作業をしなければならない。 しかも、変貌オブジェクトでもない「斜めに移動するエレベーター」という珍妙な設備もある。地図上でもご丁寧にプレイヤーが斜めに移動する様子が表示される。 ワープシステムを使用しないと行けない地点などもわざわざ地図に表示されるため、ミスリードになっている。 公式チートの導入 オプションにチートが組み込まれており、エイムアシスト(*3)やエネルギー回復量、ヘルス最大値などをいつでもいじれる。 「不死身」「一撃死」といった身も蓋も無いものも公式で投入済み。 詰み救済と見れば親切だが、実装の仕方が雑で、必要性にも疑問が残る。 そもそもそこまで難易度は高くない。ある程度3Dアクションの経験があればさほど苦労なくクリアできるだろう。死亡時のペナルティも「根源1割没収」という軽微なもので、死にすぎて詰むということは考えにくい。 詰み救済であれば「イージー・ノーマル・ハードの難易度選択」「同じ面n回死亡でボス弱体化」といった古典的な調整で良かったのでは。 一般のプレイヤーが「エネルギー回復を何%上げたらちょうどよい難易度か」を推定するのは困難で、超人生成機になっている。 「チート使用中の進行は実績にカウントしない」「高難度おまけクエスト(*4)ではチート無効」などの常識的な措置がされていない(*5)。 このように、導入の仕方が雑なため、安易に投入してしまいボス戦の妙味を削いでしまう、高難度クエストの非チートクリアが信用されないなどの問題が起きている。 理解困難な用語が多い 独自用語が多く登場するが、直感的に理解しづらいものが多い。 頻繁に目にするであろう、敵がドロップする回復アイテム「ヘルス要素」もイマイチ座りの悪い訳語である。 素材の名称も分かりにくい。「スレッショルドの残部」だの「貫入傾向」だのと、概念なのか物体なのかすら想像がつかない。ドロップ場所の推定も困難。 こうした抽象度の高い「よく分からなさ」は元ネタであるSCP財団の魅力でもあるのだが、ゲーム的に重要なものにまで「よく分からなさ」を導入してしまっている。 舞台設定の用語でも、混同しやすかったり、1つのものに2つの名称がついたりしており紛らわしいものが多い。 「変貌現実」の影響を受けて異常な現象が起きる場所が「スレッショルド」で、異常な挙動をする物体が「変貌アイテム」となる。統一感が無い。 「捜査局の本部ビル」が「オールデスト・ハウス」だが、「オールデスト・ハウス」を単に「捜査局」と呼んでいることもある。 問題点 舞台設定と乖離したオープンワールド風のシステム 「ヒスに侵略された捜査局を復旧する」「弟を取り戻す」が目的のはずなのだが、オープンワールド風のシステムになっているため、これらの目標が全く進行しない。 ゲーム中はもちろん、クリア後であっても、どこでも容赦なくヒスが現れる。一応「ヒスが現れうる場所」は決まっているのだが、それが安全な場所になることは無い。 そもそもヒスの元は操作局の局員なので無尽蔵に湧いてくること自体がおかしいのだが…。 一部の施設を除いて復旧したはずの地点もなんら機能を回復することはなく、操作局の状況は全く変わらないように見える。 弟ディランに関しても、再会こそするが変貌アイテムになってしまった彼の境遇に関してはそれ以上全く進展しない。 主人公とサービスウエポンの強化アイテムにはなぜか最大所持数があり、いちいち分解しなければならない。 たくさん持っていれば有利というわけでもなく、強化アイテム同士の合成があるわけでもないので、ただ強化アイテムを拾う前に作業をさせられるだけ。 そもそもクラフト要素の必要性自体も怪しい。 クラフトアイテムのドロップは運なので、たまたまドロップしなかったり拾い漏れがあったりするとなかなか解放できない形態が出てきたりする。 能力ポイントと同様の仕様にした方がサイドクエストの動機も強くなり、経験を積んでパワーオブジェクトを制御するというフレーバー的にも良かったのでは。 変貌アイテムや敵の魅力が薄い 殆どの変貌アイテムがただのレトロ家電や調度品。一見のインパクトが薄く、動きにも特段面白いものは無く、魅力に欠ける。 例えば「SCP-173」を元ネタにしたと思われる「見つめていないと人を殺して回る冷蔵庫」があるが、元ネタが不気味なコンクリート像で(*6)、専用の特別な収容施設が当てられているのに対し、冷蔵庫はただの冷蔵庫が汎用の収容施設に閉じ込められているだけで、視覚のインパクトや収容方法の面白さが非常に薄い。 元ネタのSCPでは、不死身のトカゲ、万能薬といったクリーチャーやアイテム、職員が付き合って成立させなければならない演劇などの強烈な個性を放つオブジェクトが揃っており、収容施設も塩酸のプールや多数のボールの中に浮いているなど工夫が凝らされている。こういった元ネタと比べると非常に単純でつまらなさを感じる。 主要な敵キャラであるヒス生命体も、人の姿や立ち回りをそのまま残しているものが多く、本作ならではの個性に欠ける。「銃を持ったモブ兵」と表現するしかないような敵も多い。 ストーリーがやや理解しにくい 主人公ジェシーとプレイヤー共通のナビゲーターとなるキャラがおらず、分かりにくい用語も手伝って、ストーリーの把握がやや難しい。大筋はまだしも、枝葉の部分を理解するには、ゲーム内資料をそれなりに読み解く必要がある。 ちなみに、ジェシーは異次元の存在であるポラリスと交信しており、ポラリスの意思に言葉で返答するが、ポラリスの意思がプレイヤーに示されることは一切ない。そのためジェシーが独り言を言って一人合点しているようにしか見えないシーンもある。 難関=ザコラッシュ 高難易度の表現として、ザコラッシュしか引き出しがない。 ほとんどのボス戦がザコラッシュかボス+ザコ。いつも同じ敵と戦わさせられることになる。 最終面からしてザコラッシュ、しかも認識範囲外からのハメが可能という盛り上がらなさ。 設定上重要度が高くないと思われる地点でいきなり前後が塞がれザコとやり合うシーンが多い。唐突で感情移入できない。 ザコの脅威度がランクと比例しておらず、低位のザコの脅威度が高い。本当に一番難しいのがザコラッシュ。 「ザコ」にあたる低位のヒスの脅威度が意外に高い。目立つヒスバリアを持っていないため見落としやすく、四方からポップするため把握していない位置からの削りなどが頻繁に発生する。近接攻撃も3割ほど持っていくため見落としが近くにいると非常に厳しい。 最も厳しいのは「鳥ヒス(*7)」。中位の特殊ヒスだが、姿を消して接近し、いきなり現れては高ダメージの範囲攻撃を行う凶悪なキャラ。ボスが呼び出しても厳しいのはもちろん、汎用ザコとしても湧いてくるため、これが出てくると下手なボス戦並みの集中力が必要。 ヒスを回復する「ヒスオーブ」が出るとさらに難易度がハネ上がる。ザコの群れを回避で突破して弾を全弾叩き込んでやっとオーブを破壊すると、エネルギーも弾も切れた状態でザコに包み殺されるというシチュエーションが多い。しかも的確に遮蔽物の後ろなどに高速で逃げていく。 一方で高位のヒスはバリアを持っていたり飛んでいたりで目立つこと、投擲で投げ返せる(優先して掴んでくれる)グレネードを撃つこと、攻撃ペースの遅さなどから脅威も魅力も低い。 このため、「強いヒスを気分よく処理していたら忍び寄っていたザコに大火力を吐かれて死んだ」「必死に切り抜けたと思ったら見落としていたザコに最後の1ミリを落とされた」などの萎える状況が多発する。 裏を返せば「ボスキャラの魅力が低い」という事でもある。 ボスの多くが「HPの高いザコ」といったモーション。基本的には耐久戦で、効率的な戦い、ハイリスクハイリターンな動きといったものは望めない。 初ボスのトマッシはまだチュートリアルの役目があるが、ホロウィッツ、サルバドールなどヒス型のボスは全て同型のザコが出現する。 ザコのいない大型ボスは攻撃パターンが「本体からの射撃」「触手の叩きつけ」の2つ。攻略法は回り撃ちで解決できてしまい、ゲーム慣れしていると非常にヌルい。フォーマだけは足場破壊→落下で即死があるため少し難しいか。 DLCボスのハートマンだけは初の大型のヒスで、3度戦って3度攻略法が異なり面白いが、攻撃パターンは鳥ヒスの焼き直し。 サブミッションの多くがおつかい 基本的には探索ゲームであるため仕方のない面はあるが、あれをやってこい、これを探してこいの雑用ばかり。局長が部下に命令されていていいのか。 字面がおつかいでも行った先でおもしろいことがあればいいのだが、必ずしもそうではないことが多い。 「変貌アイテムを収容してくれ」ならまだいいのだが、中にはしょうもないものもあり、苛立たしい。 植物に話しかけろだの、ゴミを燃やしてこいだの、DLCだが「植物に光を当ててこい」など。 日本語訳が雑。 収集した文書類は、レイアウトと紙面のサイズが合っておらず、終盤の文字がはみ出しているものが多々ある。 背景が暗いため読むことも困難。 全体に直訳が目立ち、違和感を覚える文・用語が多い。 「叩きつけ」というスキルは、浮遊状態から急降下して着地し衝撃波で範囲攻撃する技で、敵を叩きつけたり何か投げるわけではない。「スラム(アタック)」を直訳してしまったのだろう。 一部表記ゆれがある。 「特急イーグルAWE」という部屋の直前にあるコントロールポイント名が「イーグルリミテッドAWE」となっているなど。 総評 「SCPオマージュのアドベンチャー」として発売前から注目を集めていたが、蓋を開けてみればどうにも半端な出来だった作品。 グラフィックは素晴らしいの一言だが、魅力的な異常現象や謎解き要素はかなり少なく、単にオフィスビルを探索して回っている感が否めない。 シナリオやボスキャラ、サブクエストなどにも特筆すべきものはあまり無い。 総じて完成度は高く、作りの良いゲームではあるのだが、今一つ設定を活かしきれていない面や一般的なシステムを安易に導入してしまった面が目に付く、残念な作品になってしまった。 本作はIGN USの2019年 Game of the Yearである一方、IGN JAPAN(*8)ではノミネートすら逃しており、日本と欧米のゲーム観の差が如実に出たゲームとも言えよう(*9)。 余談 本作は同じRemedy Entertainmentが開発したアクションサイコスリラー『ALAN WAKE』と世界観を共有しており、本作のDLCにおいてクロスオーバーが行われている。 その後の展開 Win版は当初Epic Games Storeによる時限独占配信だったが、Steamでの配信が開始される際、完全版の『Control Ultimate Edition』として配信が開始された(*10)。 2020年10月28日にSwitch版がクラウドゲームとして配信され、2020年12月14日に全DLCが収録された完全版『Control Ultimate Edition』がPS4/Oneでダウンロード専売で発売された。 また、2021年2月2日には次世代であるPS5/XSX版が『Ultimate Edition』の仕様でダウンロード配信、1ヶ月後の3月2日にはパッケージ版の発売が予定されている。 2021年6月末に本作のスピンオフとなる新プロジェクト『Conder』が発表された。最大4人でのCO-OPを主軸としたシューティングとなるらしく、本作の世界観を拡張する作品となる予定だとされている。 対応機種はPS5/XSX/Winで発売時期は未定。また、『Conder』とは別に本作の世界観を拡張する作品が、もう1タイトル開発中であることも同時に発表された。そちらはより規模の大きい作品となるとのこと。 その後、2022年11月にそのタイトルが本作の続編『Control 2』であることが正式に発表された。対応機種はPS5/XSX/Winで発売時期は未定だが、2024年8月に開発準備段階に入ったとのことなので、発売は当分先になるものと思われる。
https://w.atwiki.jp/switchsoft/pages/2740.html
Control Ultimate Edition - Cloud Version クラウド ACTADV FPS・TPS TPS インターネット通信 1人 インターネット通信 アクセスパス4,980円 98.0MB 基本無料←動作確認 『CONTROL』アルティメットエディションには、基本ゲームとリリース済みの2つの拡張パック「The Foundation」と「AWE」が1つのパッケージに含まれています。 連邦操作局に腐敗した存在が侵入した…これを阻止できるのはあなただけ。 予想を超えた環境の中、壮大な闘いで邪悪な敵を全滅させるため、世界を武器にして闘え。 収容は失敗し、人類に危機が訪れた。主導権を取り戻せるか? 80以上のゲーム賞を受賞した『CONTROL』は、素晴らしいビジュアルで興奮全開のサードパーソン・アクション・アドベンチャーゲームです。 Remedy Entertainmentのシグネチャーである、ワールドビルディングやストーリーテリング、そして広大なマップが存分に盛り込まれた『CONTROL』は、壮大な世界で強烈な満足感を体験できます。 主な内容 謎を解明せよ。 操作局の闇の秘密を暴けるか? エピックな超自然世界を舞台に予想外のキャラクターで埋め尽くされた奇妙なイベントを乗り越え、行方不明の弟を探し、アドベンチャーの真相を解き止めろ。 全てが武器となる。 武器、念動能力を駆使して、破壊を解放せよ。 周囲にあるものを強力な武器に変換して、敵を全滅させる新しい方法を発見せよ。 隠された世界を探検。 秘密だらけの政府のエージェント、 この世界に入り込み深く探索せよ。常にシフトする操作局の環境では、予想をはるかに超えた世界が待っている… 主導権を取り戻せ。 興奮全開のミッションで残虐な敵やボスとの戦い。 パワフルなアップグレードを獲得して、アビリティを上げて武器をカスタマイズしよう。 お知らせ このランチャーアプリケーションをダウンロードすることにより、限られた時間だけ無料でゲームの動作確認を行うことができます。 このゲームはクラウドストリーミング技術を使用しており、遊ぶためには常時安定したインターネット接続環境が必要となります。 お客様のインターネット接続が不安定になった場合は数分後にサービスが遮断されます。 接続環境テスト目的のこの体験版を通じて、お手元でのインターネット接続の安定性と速度をご確認いただき、ゲームの動作性にご納得いただいたうえでアクセスパスをご購入ください。 このサービスの利用にはニンテンドーアカウントが必要です。また、製品版のプレイにはこのアプリケーションとアクセスパスの購入が必要になります。 ご利用になるには常時安定したインターネット接続環境とニンテンドーアカウントが必要です。 体験版は最大10分間、2回までプレイが可能です。製品版を遊ぶにはアクセスパスの購入が必要となります。 遊ぶために必要なもの インターネット通信 アドベンチャー アクション キャラクターボイス メーカー 505 Games 対応言語 日本語,フランス語,ドイツ語,イタリア語,スペイン語,韓国語,ポルトガル語,ロシア語,中国語 (簡体字),中国語 (繁体字),英語 配信日 2020年10月28日 IARC_GENERIC 16+ 激しい暴力、アルコール/タバコの使用 対応ハード Nintendo Switch セーブデータお預かり 非対応 セーブデータはソフトの管理するサーバ上に保存されます 対応コントローラー Nintendo Switch Proコントローラー プレイモード TVモード, テーブルモード, 携帯モード プレイ人数 × 1 インターネット通信 × 1 controlとかいうクラウドの洋ゲーシューター 良質光回線で5GHz帯接続すれば快適に遊べるな 日本語訳がなんかおかしいのと字幕表示が短すぎてきついから買わんけど バイオ7クラウドと違って期間いくらじゃなく4980円で遊び放題なんだな サービス終了6ヶ月前に告知しますってのがいつになるかはわからんけど -- 名無しさん (2020-11-08 16 00 06) 名前 コメント
https://w.atwiki.jp/shogi_algo/pages/18.html
void Kyokumen InitControl(void); 概要 kyokumen.cppにて定義 controlS, controlE の初期化 (controlS, controlEは利きを保持する、とコメントにあるが意味不明) 引数 なし 実装 controlSとcontrolEをゼロ初期化 ループ(全位置) (以下、後で再確認。意味不明) 敵駒なら ループ(駒ジャンプ種類) →CanJump[駒ジャンプ種類][ban[駒位置]]が真なら →→ループ(駒の周囲、駒があるところ) →→→controlE[位置] |= bj; →CanMove[駒ジャンプ種類][ban[駒位置]]が真なら →→controlE[dan + suji + Direct[i]] |= b; 自駒なら controlSについて上記と同じ処理 呼出元