블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2801)
Unity3D (857)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

#include <iostream>
#include <list>
using namespace std;

 

template<typename T> 
class Stack
{
public:
 Stack() : m_bLIFO(true) { Clear(); }

 // 저장 방식을 설정한다.
 void SetLIFO( bool bLIFO ) { m_bLIFO = bLIFO; }

 // 초기화 한다.
 void Clear()
 {
  if( false == m_Datas.empty() )
   m_Datas.clear();
 }

 // 스택에 저장된 개수
 int Count() { return static_cast( m_Datas.size() ); }

 // 저장된 데이터가 없는가?
 bool IsEmpty() { return m_Datas.empty(); }


 // 데이터를 저장한다.
 void push( T data )
 {
  m_Datas.push_back( data ); 
 }

 // 스택에서 빼낸다.
 bool pop( T* data )
 {
  if( IsEmpty() )
  {
   return false;
  }


  if( m_bLIFO )
  {
   memcpy( data, &m_Datas.back(), sizeof(T) );
   m_Datas.pop_back();
  }
  else
  {
   memcpy( data, &m_Datas.front(), sizeof(T) );
   m_Datas.pop_front();
  }

  return true;
 }

private:
 list<T> m_Datas;
 bool  m_bLIFO; // true 이면 후입선출, false 이면 선입선출
};

 

void main()
{

 Stack<int> Int_Stack;

 Int_Stack.SetLIFO(true);

 Int_Stack.push(10);
 Int_Stack.push(20);
 Int_Stack.push(30);

 int Value = 0;
 Int_Stack.pop(&Value);
 //마지막에 넣은게 처음 나온다.
 cout << "Last In First Out pop : " << Value << endl <<  endl;
 
 //데이터 초기화
 Int_Stack.Clear();

 //FIFP로 설정
 Int_Stack.SetLIFO(false);

 Int_Stack.push(10);
 Int_Stack.push(20);
 Int_Stack.push(30);

 Int_Stack.pop(&Value);
 //처음에 넣은게 처음 나온다.
 cout << "First In First Out pop : " << Value << endl <<  endl;

}

 출처 : http://cafe.naver.com/jgcafe/694

반응형
Posted by blueasa
, |

lua syntax 컬러링 해주는 애드인. 

vs2008용은 아래 링크에서 다운로드.

http://vslua.codeplex.com/

vs2010에서는 이번에 새로 추가된 확장 관리자(Extension Manager) 방식으로 제공된다.

http://visualstudiogallery.msdn.microsoft.com/7af51f37-07ad-4d6b-9c2b-00672bb051ad/

예전에 다른 종류의 어떤 애드인을 잠깐 설치했었다가, 
block comment ( --[[ ... ]] ) 의 컬러링을 제대로 지원 못해서 바로 삭제한 적이 있는데 
이건 깔끔하게 잘 된다. 

추천 -_-)b


출처 : http://devnote.tistory.com/176

 

반응형

'Programming > Lua' 카테고리의 다른 글

Lua 문법  (0) 2010.06.18
Posted by blueasa
, |

FMOD 사이트는

 

http://www.fmod.org/

 

입니다. 접속하시면 다운을 받을 수 있습니다.

 

사운드 라이브러리 FOMD_API 입니다. Direct_Sound가 쓰기엔 불편한 점이 있습니다. 일단 FMOD를 직접 사용해 보시면 꽤나 편하다는 것을 느끼실 수 있을겁니다. FMOD를 설치를 하면 추가 해야 할 사항이 3가지가 있습니다.

 

1. 디렉터리 추가

상단 메뉴에서 프로젝트 -> 클릭 하시면 제일 아래 메뉴 Projectname속성 클릭 -> 속성 창이 뜹니다. 그러면 메뉴중에

c/c++ -> 일반 -> 추가 포함 디렉터리 -> 경로를 지정해주면 되는데 확장자가 inc를 지정해주셔야 합니다. 
저의 경로는 "C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api\inc" 입니다.""를 잊지 맙시다.

2. 라이브러리 추가.

마찬가지로 상단메뉴 프로젝트 -> ProjcetName속성 클릭 -> 속성 창이 뜹니다. 그러면 메뉴중에 링커 클릭-> 일반 ->
오른쪽 메뉴 중에서 추가 라이브러리 디렉터리 경로를 적으시면 됩니다. 저의 경로는 
"C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api\lib" 입니다. 이번 건 확장자  lib입니다.

3. FMOD 설치 하시면 설치 폴더 안에 api폴더가 있는데 api폴더 안으로 들어가셔서 fmodex.dll 복사.


그 다음에 진행중인 프로젝트 폴더 안에 fmodex.dll 붙여넣기 하시고 실행 시켰을 때 창이 뜨면서fmodex.dll 파일을 찾을 수 없다고 메시지가 뜨면 디버그 안에다가 복사를 한번 해주세요. 아마 이러면 잘 돌아갈 겁니다.

자 이렇게 세 가지 사항을 추가를 하시고 본격적으로 진행중인 프로젝트에 사운드를 틀어봅시다.

 

우선 코드에 기본적으로 선언해야 할 해더파일이 있습니다.

 

#include <fmod.hpp>
#include <fmod_errors.h>
#pragma  comment( lib, "fmodex_vc.lib" )

 

위 해더파일들을 기본적으로 선언해 주시고요.

 

 FMOD::System   * System;

 FMOD::Sound*     SoundName;
 FMOD::Channel*  channel;

 

윗 세 줄이 기본적으로 사운드를 틀기 위해 선언한 타입별 변수입니다. 

 

::를 봐서 아시겠지만 FMOD안에 포함이 된 System, Sound, Channel 들 입니다.

 

FMOD::System

System은 음악을 틀기 위한 기기라고 생각하시면 됩니다.

 

FMOD::Sound

 효과음의 갯수만큼 선언해주시면 됩니다. 폭발음, 탄을 쏠 때이 효과음이라던가 그 효과음의 갯수만큼 선언을 해 주시면 됩니다.

FMOD::Channel

채널을 컨트롤 하여 사운드의 볼륨을 설정해 줄 수 있습니다.

 

자 그럼 본격적으로 소스 한번 적어볼게요.

먼저 사운드를 생성하는 겁니다.

저의 경우

LOADSoundAll() 이라는 함수에서 사운드를 생성합니다.

함수안의 내용은

 

LOADSoundAll()

{

FMOD_RESULT result;

 result = FMOD::System_Create( &System );
 ERRCHECK( result );

 result= System->init( 100, FMOD_INIT_NORMAL, 0 );
 ERRCHECK( result );

 result = System->createSound( "../data/sound/stage1.wav", FMOD_DEFAULT, 0, &initSound );
 ERRCHECK( result );
 
 result = System->createSound("../data/sound/stage1.wav", FMOD_DEFAULT, 0, &Stage_1_Sound );
 ERRCHECK( result );
 
 result = System->createSound("../data/sound/Type1.wav", FMOD_DEFAULT, 0, &fireSound );
 ERRCHECK( result );

 result = System->createSound("../data/sound/Type2.wav", FMOD_DEFAULT, 0, &laserSound );
 ERRCHECK( result );
 
 result = System->createSound( "../data/sound/Destroy.wav", FMOD_DEFAULT, 0, &DestroySound );
 ERRCHECK( result );

 result = System->createSound("../data/sound/Stage2.wav", FMOD_DEFAULT, 0, &explosionSound );
 ERRCHECK( result );

}

이렇게 사운드를 생성합니다.

 

중요한 부분은 함수 안의 변수 선언부.

 

FMOD_RESULT result;

result = FMOD::System_Create( &System );

 

이렇게 해야지만 사운드를 생성할 수 있습니다.

한마디로 사운드를 생성하는 변수 타입이 FMOD_RESULT 라는 녀석이죠.

 

함수안의 윗 두줄 밑으로는 이해하기가 편합니다.

createSound안에 경로 적어주시면 되고 createSound의 3번째 인자는 FMOD::Sound의 변수명입니다. 효과음 이름이죠. 반드시 주소값( & )과 함께 써야합니다.

 

그리고 사운드 파일이 없다거나 잘못된 사운드 파일일 경우에 에러체크를 해줘야 합니다.

 

ERRCHECK( result )가 있는데

 

이녀석은 제가 따로 만든 함수입니다.

 

함수를 보면

 

ERRCHECH( FMOD_RESULT result )

{

  if( result != FMOD_OK )

{

  char str 256;

  sprintf( str, "FMOD error! (%d) %s\n", reuslt, FMOD_ErrorSting( result ) );

  MessageBox( NULL, str, "TEST", MB_OK );

}

}

이렇게 에러를 체크합니다. 에러체크는 안해줘도 별 상관은 없지만, 사운드 파일이 없다거나 그럴 때 메시지를 띄워주는게  좋은 습관이 아닌가 생각을 합니다.

 

저 함수안에서는 문자열 str 의 크기를 반드시 256으로 선언해줘야 합니다. 안 그러면 에러가 납니다.

 

다음으로 사운드를 재생시켜야 합니다.

전 PlaySound()라는 함수에서 재생을 합니다.

 

소스를 살펴보면

PlaySounc( char* sound_name )

{

 FMOD_RESULT result;

if ( sound_name == "stage_1" )
 {
  initSound->release();
  result = System->playSound( FMOD_CHANNEL_FREE, Stage_1_Sound, FALSE,  &channel );
  channel->setVolume( 1.f );
  ERRCHECK( result );
 }
 
 else if ( sound_name == "normal_bullet" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, fireSound, FALSE,  &channel );
  channel->setVolume( 0.5f );
  ERRCHECK( result );
 }
 
 else if ( sound_name == "user_laser" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, laserSound, FALSE,  &channel );
  channel->setVolume( 0.5f );
  ERRCHECK( result );
 }
  
 else if ( sound_name == "destroy" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, DestroySound, FALSE,  &channel );
  channel->setVolume( 0.25f );
  ERRCHECK( result );
 }

 else if ( sound_name == "explosion_sound" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, explosionSound, FALSE,  &channel );
  channel->setVolume( 1.f );
  ERRCHECK( result );
 }

}

이렇게 사운드를 재생해주는 함수에서 재생을 해 줍니다.

 

위 코드를 보면 chnnel->setVolume( 1.f );

이렇게 되어있습니다. 괄호안의 수치는 0.1f부터 1.0까지 수치를 주면 됩니다.

당연한 말이지만 수치가 크면 클수록 사운드의 크기도 커집니다. 프로젝트 안의 옵션중에 사운드 크기를 조절하는 기능을 추가할려면 저 안의 수치에 변수를 두면 좋겠죠^^.

 

에레체크는 항상 해 줍시다. 항상입니다. 항상~~~


[출처]
 FMODEX (SOUND_LIBRARY) FMOD DLL 다운 및 오류 수정.|작성자 파란

반응형
Posted by blueasa
, |

Introduction

This class allows you to tap keyboard and mouse and/or to detect their activity even when an application runs in the background or does not have any user interface at all. This class raises common .NET events withKeyEventArgs and MouseEventArgs, so you can easily retrieve any information you need.

Background

There are a number of applications that run in the background and detect user inactivity to change their mode. For example, MSN Messenger (or any other messenger). I was going to write such an application, so I searched MSDN and found "exactly" what I needed: 318804 - HOW TO: Set a Windows Hook in Visual C# .NET. This article describes how to tap the mouse movement, but it works only when an application is active. At the end of this article, I found this explanation: "Global hook is not supported in .NET Framework. You cannot implement global hooks in Microsoft .NET Framework...". Anyway, I continued my research and found out that there are exceptions. There are WH_KEYBOARD_LL and WH_MOUSE_LL hooks that can be installed globally. So, I have basically replaced WH_MOUSE with WH_MOUSE_LL in the MSDN example, and it works.

The second step was to extract the information received into a .NET EventArgs and raise the appropriate events.

I found a similar article in CodeProject, under Global System Hooks in .NET by Michael Kennedy, but what I dislike is, there is an unmanaged DLL in C++ that is a main part of this solution. This unmanaged DLL is in C++, and a number of classes make it complicated to integrate it in my own tiny application.

Revisions

This article was posted in 2004 and updated in 2006. During all this time until now I receive a lot of positive feedback and recommendations. There were also a number of technology improvements like .NET Framework 3.5 or Visual Studio 2008. So I have decided to update it once more.

I have refactored and improved the solution, made it more flexible, stable and efficient. But this refactoring also had some drawbacks:

  1. Number of code lines and files has grown.
  2. Backward compatibility to older .NETs is lost.

That's why I attend to leave the old version also to be available for download.

Using the Code [Version 2]

The Simple Way

If you are developing a Windows Forms application and prefer drag & drop programming, there is a componentnamed GlobalEventProvider inside the assembly Gma.UserActivityMonitor.dll. Just drag and drop it to your form and create events using the property editor events tab.

The Alternative Way

Use events provided by the static class HookManager. Note that the sender object in events is alwaysnull.

For more usage hints, see the source code of the attached demo application.

Using the Code [Version 1]

To use this class in your application, you need to just create an instance of it and hang on events you would like to process. Hooks are automatically installed when the object is created, but you can stop and start listening using appropriate public methods.

 Collapse
UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
    actHook= new UserActivityHook(); // crate an instance

    // hang on events

    actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
    actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
    actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
    actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}

Now, an example of how to process an event:

 Collapse
public void MouseMoved(object sender, MouseEventArgs e)
{
    labelMousePosition.Text=String.Format("x={0}  y={1}", e.X, e.Y);
    if (e.Clicks>0) LogWrite("MouseButton     - " + e.Button.ToString());
}

Changes and Updates from [Version 0] to [Version 1]

I'd like to thank you all for all the useful comments in the discussion forum. There were a lot of bugs and proposals posted after this article was published on 4th June, 2004. Over and over again came the same topics, and I had to refer to previous posts in the discussion, that is why I have decided to revise the code and publish a FAQ. Here is the list of the most important changes:

  • The project was converted into Visual Studio 2005
  • The problem with upper case characters is solved
  • Mouse wheel information is now included in event arguments
  • Better exception handling
  • Cancellation of keyboard events using the Handled property of event arguments
  • XML documentation of functions

FAQ [Version 1]

Question

The project cannot be run in Visual Studio .NET 2005 in debug mode because of an exception error caused by calling the SetWindowsHookEx. Why? Is it a problem of .NET 2.0?

Answer

The compiled release version works well so that cannot be a .NET 2.0 problem. To workaround, you just need to uncheck the check box in the project properties that says: "Enable Visual Studio hosting process". In the menu: Project -> Project Properties... -> Debug -> Enable the Visual Studio hosting process.

Question

I need to suppress some keystrokes after I have processed them.

Answer

Just set the e.Handled property to true in the key events you have processed. It prevents the keystrokes being processed by other applications.

Question:

Is it possible to convert your global hooks to application hooks which capture keystrokes and mouse movements only within the application?

Answer

Yes. Just use...

 Collapse
private const int WH_MOUSE = 7;
private const int WH_KEYBOARD = 2;

... everywhere, instead of:

 Collapse
private const int WH_MOUSE_LL = 14;
private const int WH_KEYBOARD_LL = 13;

Question

Does it work on Win98 (Windows ME, Windows 95)?

Answer

Yes and No. The global hooks WH_MOUSE_LL and WH_KEYBOARD_LL can be monitored only under Windows NT/2000/XP. In other cases, you can only use application hooks (WH_MOUSE and WH_KEYBOARD) which capture keystrokes and mouse movement only within the application.

Question

I have a long delay when closing applications using hooks by clicking the x button in the titlebar. If I close the application via another event (button click) for example, that works fine.

Answer

It's a known bug of Microsoft. It has to do with the Windows themes. If you disable the Windows themes, the problem goes away. Another choice is to have the hook code run in a secondary thread.

Question

How do I catch key combinations like Ctrl+Shift+A?

Answer

You'll have to track which keys have gone down but not up. Only the most recently pressed key keeps sendingKeyDown messages, but the others will still send a KeyUp when released. So if you make three flagsIsCtrlDown, IsShiftDown, and IsADown, and set them to true at KeyDown and false at KeyUp, the expression (IsCtrlDown && IsShiftDown && IsADown) will give you the required result.

Question

Does it works with .NET Framework 1.1 and Visual Studio 2003?

Answer

Yes. The file UserActivityHook.cs can be used without any changes, in a Visual Studio 2003 .NET 1.1 project.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

George Mamaladze

Software Developer (Senior)

Germany Germany

Member


출처 : http://www.codeproject.com/KB/cs/globalhook.aspx
반응형

'Programming > C#' 카테고리의 다른 글

[펌] 입력 문자 검사  (0) 2011.09.14
C# 관련 정보 사이트[MKEXDEV.NET]  (0) 2011.09.13
Array -> String  (0) 2011.05.09
SaveFileDialog  (0) 2011.03.25
DataGridView to XML  (0) 2011.03.23
Posted by blueasa
, |

Array -> String

Programming/C# / 2011. 5. 9. 02:12

요새 c#으로 삽질중이다.

 

오늘은 배열로 한 한시간 가까이 날려 먹은거 같은데;;

 

Array라는 타입이 있다. 모든 배열의 기초 클래스란다

요넘을 String[]로 옮기고 싶은 거다...

 

즉...

Array Buffer = new Array[0];

이런 녀석이 있다면

String[] szBuffer = Buffer;

이 짓을 하고 싶다는 거지;;

 

한참을 해맸지만 결론은 간단했다.

 

String[] szBuffer = (String)Buffer;

 

허탈하네 - _-;;



[출처]
 C#에서 배열|작성자 시네루진

반응형

'Programming > C#' 카테고리의 다른 글

C# 관련 정보 사이트[MKEXDEV.NET]  (0) 2011.09.13
Processing Global Mouse and Keyboard Hooks in C#  (0) 2011.05.13
SaveFileDialog  (0) 2011.03.25
DataGridView to XML  (0) 2011.03.23
ToolTip 사용하기  (0) 2011.02.11
Posted by blueasa
, |

유도탄

Programming/Algorithm / 2011. 5. 4. 15:33
반응형

'Programming > Algorithm' 카테고리의 다른 글

lock free 알고리즘들...  (0) 2012.05.11
알고리즘의 설계  (0) 2010.04.14
Posted by blueasa
, |
반응형
Posted by blueasa
, |

NDC10_장용석_fmod를 이용한 사운드 프로그래밍  발표자료 / NDC 

2010/06/22 16:06

복사http://ndc.nexon.com/150088648457

반응형
Posted by blueasa
, |

출처 : http://cafe.naver.com/devrookie/5119
반응형
Posted by blueasa
, |

1. pair란?

  STL의 기본적인 유틸 클래스이다. 두가지의 값을 하나인것 마냥 사용할수 있도록 해주는 클래스이다.

 

2. pair 소스

      template<class _Ty1, class _Ty2>

      struct pair
      { 

             // store a pair of values
             typedef pair<_Ty1, _Ty2> _Myt;
             typedef _Ty1 first_type;
             typedef _Ty2 second_type;

            

             // 기본 생성자

             pair()  : first(_Ty1()), second(_Ty2())
             { 
             }

 

             // 복사 생성자

             pair(const _Ty1& _Val1, const _Ty2& _Val2) : first(_Val1), second(_Val2)
             { 

             }

             

             // 암시적 형변환시 사용되는 생성자      

             template<class _Other1,  class _Other2>
             pair(const pair<_Other1, _Other2>& _Right)  : first(_Right.first), second(_Right.second)
             { 

             }

 

            void swap(_Myt& _Right)
            {

                    if (this != &_Right)
                   { 

                         std::swap(first, _Right.first);
                         std::swap(second, _Right.second);
                   }
             }

             _Ty1 first; // the first stored value
             _Ty2 second; // the second stored value
       };

 

  두개의 탬플릿을 이용해서 값을 전달한다. 그 값이 명시적 형변환이냐 암시적 형변환이냐에 따라서 생성자를 호출하고 first와 second를 초기화 시켜준다. first와 second에 값을 넣어 주기 때문에 두개의 값을 하나로 사용할수 있다고 말해주는 것 같다.

 

3. 어디서? 어떻게? 사용을 할까?

  이제 막 STL 책에서 가장 앞쪽 부분만을 보고서 이렇게 글을 쓰다 보니 아주 조그만한 부분에서 사용되는것밖에 모르겠다. 일반적으로 우리는 vector, map, multimap등을 자주 사용하게 된다. 이런 부분에서 사용을 하면 매우 유용하다. 특히 map과 multimap의 경우에는 두개의 key와 value를 사용하게 되는데 이때 make_pair를 사용하면 매우 유용하다. make_pair는 아래와 같다.

 

                                    templateclass T1, class T2 >

                             namespace std {

                                    pair<T1, T2> make_pair( const T1& x, const T2& y )

                                    {

                                              return std::pair< T1, T2 >(x, y);

                                     }

                             }

 

  보면 알겠지만 pair<T1, T2>(x, y)를 리턴하기때문에 두개의 값을 하나로 쓰는 거라고 할수 있다. 그렇기 때문에 map과 multimap등에서 사용이 가능하다. 아래는 make_map을 사용한 예제 이다.

 

                                  using namespace std;

                            int main()

                            {

                                     typedef multimap< int, string > intStringMap;

                                     intStringMap coll;

 

                                     coll.insert( make_pair( 1"this" ) );

                                     coll.insert( make_pair( 2"that" ) );

                                     coll.insert( make_pair( 3"she" ) );

                                     coll.insert( make_pair( 4"you" ) );

 

                                     intStringMap::iterator pos;

                                     for( pos = coll.begin(); pos != coll.end(); pos++ )

                                     {

                                              printf("key : %d, value : %s\n", pos.first, pos.second.c_str() );

                                      }

 

                                      return 0;

                             }

 

  뭐 대충 이런 식으로 사용을 하면 유용하게 사용할수 있을 것 같다. 물론 이렇게 사요하지 않아도 된다. 위 소스는 multimap에 값을 넣고 반복자를 이용해서 값을 출력한 예제이다. 매우 간단하니 그냥 훓어보기만 하면 될것같다.

  pair 같은 경우는 STL에서 유용하게 사용되는 유틸 클래스이다. 이런 사용은 일반적인 경우이고 내부적으로 더욱 많은 부분에서 사용되고 있다고 한다.

 

4. 결론

  결국 처음에 말했던것과 같이 내가 이해한 pair는 두가지의 서로 다른 값을 하나와 같이 사용할수 있는 값의 집합이라고 보면은 매우 편한것 같다. 오늘 책을 잠깐 봤는데 읽으면서 나는 이렇게 이해했다. 책에서도 x, y값을 담는 POINT 구조체와 비슷한 느낌인것같다. 다른 점이라고한다면 template을 사용해서 서로 다른 타입의 변수를 대입할수 있다는 점인것 같다.


[출처]
 [STL] 유틸 클래스 pair|작성자 sangtakeg

반응형
Posted by blueasa
, |