Javascript 에서 모바일 브라우저인지 감지하는 코드


static isMobile(){
// if we want a more complete list use this: http://detectmobilebrowsers.com/
// str.test() is more efficent than str.match()
// remember str.test is case sensitive
let isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
(navigator.userAgent.toLowerCase());
return isMobile;
}


'프로그래밍 > JavaScript' 카테고리의 다른 글

WebPack 빌드 및 사용하기  (2) 2018.08.21
Three.js 에서 jd 모델 사용하기.  (0) 2018.08.08
스파인 애니메이션 재생 문제 (Spine Animation)  (0) 2018.07.13
Threejs repeat  (0) 2018.07.04
Spine Attachment Off  (0) 2018.06.20

Spine으로 특정시점에 애니메이션을 재생시키거나 AddAnimation으로 애니메이션을 이어서 재생할때

애니메이션이 출력이 안되거나 재생 시점이 각기 다른 현상이 있었다.


Spine의 Visible을 False로 처리했을때 이러한 현상이 발생했었다.


처음에는 visible을 true로 놔둔 상태에서 스크린 밖의 좌표에 이동시켰으나


Render함수의 부하가 관찰됨.


this.sprite.autoUpdate = false;

먼저 spine의 autoUpdate를 false로 설정한다.


this.sprite.update( delta );


이후 Delta값을 이용해서 업데이트 한다. (Delta는 프레임간 시간을 넣어주면 됨 [dt], 일반적인 상황에서는 1 / 60 )


관찰시 visible을 false 상태에서 true로 전환되도 정상적으로 애니메이션이 재생되는걸 확인할 수 있음

'프로그래밍 > JavaScript' 카테고리의 다른 글

Three.js 에서 jd 모델 사용하기.  (0) 2018.08.08
자바스크립트 모바일 브라우저 감지하기  (0) 2018.07.17
Threejs repeat  (0) 2018.07.04
Spine Attachment Off  (0) 2018.06.20
p2 reflection angle (반사각) 설정  (0) 2018.04.13

Three js 에서 repeat는 텍스처 출력 크기를 의미


ex)  repeat.x 가 0.5일 경우 offset.x 의 위치부터 repeat.x의 크기만큼 텍스처를 자른다.

repeat.y 가 0.5일 경우 offset.y 의 위치부터 repeat.y의 크기만큼 텍스처를 자른다.


그다음 모델에 적용시킨다.


주의할점은 모든 모델들이 하나의 텍스처를 공유하기 때문에

texture의 uv를 변경하면 같은 texture를 사용하는 모든 object들의 uv가 변경된다.


Spine Attachment Off 하는법 (어태치먼트 비활성화)


목적 : 스파인 내부의 일부 장비를 비활성화, 다양항 장비를 교체하는 효과를 낼 수 있다.



this.sprite.skeleton.findSlot('helmet0').setAttachment( null );

이런 방식으로 슬롯을 찾은뒤 어태치먼트를 null 로 설정한다.


setSkinByName을 사용하면 attachment가 다시 설정된다.

벽돌깨기 게임을 만드는 도중 공이 벽에 부딪혔을때 입사각, 반사각이 의도한대로 나오지 않는 현상이 있었다.


friction, restitution수치로 인한 현상이었는데


friction을 0, restitution을 1로 설정하면 의도한 수치대로 나왔다.


Material을 만든다음 각각 Object마다 다른 수치로 적용할수 있지만 이번에는 World의 DefaultMaterial을 수정해서 처리했다.


this.world.defaultContactMaterial.friction = 0;
this.world.defaultContactMaterial.restitution = 1;

이미 만든 world의 수치를 위와같이 변경하면 된다.

'프로그래밍 > JavaScript' 카테고리의 다른 글

Threejs repeat  (0) 2018.07.04
Spine Attachment Off  (0) 2018.06.20
HTML5 휴대폰 터치 처리  (0) 2018.04.12
HTML5 PixiJS, P2 물리엔진 적용 및 충돌 콜백 (collision callback)  (0) 2018.04.11
PIXI.js, box2d 적용  (0) 2018.04.03

Keyword : HTML touch event, input


마우스 클릭, 이동 기준으로 게임 생성후 모바일에서 게임 실행히 마우스 이벤트가 동작하지 않았다.

터치 이벤트로 따로 연결시켜줘야 했었다.

ECMA6 클래스 기준


window.addEventListener("touchstart", this.touchDown.bind(this), false);
window.addEventListener("touchend", this.touchUp.bind(this), false);
window.addEventListener("touchmove", this.touchMove.bind(this), false);

window에서 터치와 관련됨 이벤트는 touchstart, touchend, touchmove가 있다. mousedown, mouseup, mousemove와 같은 개념

바인딩된 함수는 touchDown만 살펴보면

touchDown(event){
this.touches = event.changedTouches;

this.touches[0].pageX, this.touches[0].pageY;
}

event의 changedTouches를 받은뒤

index마다 pageX, pageY를 확인하면 된다. (0번은 맨첫번째 터치, 터치를 여러 손가락으로 동시에 할경우 배열에 더 많이 담긴다.)

'프로그래밍 > JavaScript' 카테고리의 다른 글

Threejs repeat  (0) 2018.07.04
Spine Attachment Off  (0) 2018.06.20
p2 reflection angle (반사각) 설정  (0) 2018.04.13
HTML5 PixiJS, P2 물리엔진 적용 및 충돌 콜백 (collision callback)  (0) 2018.04.11
PIXI.js, box2d 적용  (0) 2018.04.03

Keyword : Pixijs, P2, Collision, Collision Callback, 


Box2D 적용이후 몬스터가 충돌을 감지했을때 HP를 깍으려고 시도했었다.

하지만 Box2D의 물리엔진 콜백 (Contact Listener ?)을 달기가 어려웠었다. (레퍼런스가 C++ 기준, 구현 방식도 원본과 다른상황)

이런 상황이라 엔진은 Box2D에서 P2로 교체했다.

ECMA6 을 이용한 클래스 기반으로 생성중이다.


<script src="library/P2/build/p2.js" type="text/javascript"></script>

index파일에 먼저 p2.js 파일을 포함, 로드시킨다.


this.world = new p2.World({
gravity:[0, 0]
});

this.world.solver.iterations = 20;
this.world.stiffness = 1000000;
this.world.relaxation = 4;
this.world.solver.tolerance = 0.02;
this.world.sleepMode = p2.World.NO_SLEEPING;

이후 world를 생성한다.

Gravity는 중력의 정도를 설정한다. (일반적으로 Y값에 -9.87 적용)

밑의 solver, relaxtion등의 설정은 필수는 아닌 옵션 설정이다.

충돌되기를 원하는 클래스에 Body와 Shape를 만들어 준다.


this.rigidBody = new p2.Body({
mass: 1,
position: [Device.app.screen.width / 2, Device.app.screen.height - 200]
});

유니티와 비슷하게 사용하기 위해 모든 변수명을 RigidBody로 설정

이후 충돌체의 모양을 결정한다.


this.circleShape = new p2.Circle({ radius: 20});
this.circleShape.collisionGroup = Device.PLAYER;
this.circleShape.collisionMask = Device.ENEMY | Device.GROUND;

이 코드의 경우에는 Collider를 원으로 설정했다.

collisionGroup과 collisionMask가 중요한데 이 부분을 설정하지 않는다면 모든 충돌체와 충돌검사를 수행한다.

이번에는 적, 바닥만 충돌처리를 하기 위해 MASK를 두 종류만 설정했다.


this.PLAYER = Math.pow(2, 0);
this.ENEMY = Math.pow(2, 1);
this.GROUND = Math.pow(2, 2);

collisionMask에 사용된 값은 위의 코드와 같이 정의되어 있다. (비트 연산을 수행하기 위해 2의 제곱으로 설정)


this.rigidBody.addShape(this.circleShape);

Shape의 설정이 마무리 됬으면 rigidBody에 AddShape 해준다.


this.world.addBody(rigidBody);

이후 맨처음 생성한 World에 rigidBody를 등록한다.


이렇게 까지 처리하면 화면에서 물체가 충돌되서 서로 반사되는 부분까지 확인이 가능하다. 

(확인이 안된다면 sprite의 x, y 좌표를 Update에서 rigidBody의 x, y 좌표로 업데이트 시켜준다.)


다음 물체끼리 충돌했을때 콜백으로 확인하고 싶다면


this.world.on('beginContact', this.BeginContact.bind(this) ); // << : Collision Callback

world의 on함수에 콜백을 등록한다. (beginContact는 충돌 시작시 콜백해주는 함수)


BeginContact(contact){
// Shape ID 대신 Body의 ID를 이용 (한개의 Body에 여러 Shape가 붙을수 있다.)
if( ( contact.shapeA.collisionGroup & contact.shapeB.collisionMask ) !== 0 && (contact.shapeB.collisionGroup & contact.shapeA.collisionMask) !== 0) // 다른 타입인지 검사
{
if(contact.shapeA.collisionGroup !== Device.GROUND && contact.shapeB.collisionGroup !== Device.GROUND) // 둘다 그라운드가 아닐때
{

contact.bodyA.parent.Collision();
contact.bodyB.parent.Collision();
// console.log("Collision Enemy && Player ");
}
}
}

위의 조건문을 이용해서 collisionGroup, collisionMask를 이용, 충돌하기를 원하는 대상들만 충돌처리를 실행할수 있다.

이벤트를 통해서 특정 함수를 실행해도 되고 

이번 코드의 경우 Body를 생성한뒤 parent에 this를 설정, 부모 클래스의 특정 함수를 실행시키는 방법으로 처리했었다.


이렇게 처리하면 Collision 발생시 특정 함수 실행 가능

'프로그래밍 > JavaScript' 카테고리의 다른 글

Threejs repeat  (0) 2018.07.04
Spine Attachment Off  (0) 2018.06.20
p2 reflection angle (반사각) 설정  (0) 2018.04.13
HTML5 휴대폰 터치 처리  (0) 2018.04.12
PIXI.js, box2d 적용  (0) 2018.04.03

ECMA6 기준으로 클래스에서 현재 물리를 구현중


1. b2CircleDef와 같이 Shape 정의를 먼저한다.


this.ballSd1 = new b2CircleDef();
this.ballSd1.density = 1.0;
this.ballSd1.radius = 20;
this.ballSd1.restitution = 0.2;
this.ballSd1.localPosition.Set(-20, 0);
this.ballSd2 = new b2CircleDef();
this.ballSd2.density = 1.0;
this.ballSd2.radius = 20;
this.ballSd2.restitution = 0.2;
this.ballSd2.localPosition.Set(20, 0);

2. 클래스의 Body에 Shape를 추가한다.

this.circleBd = new b2BodyDef();
this.circleBd.linearDamping = 0.01;
this.circleBd.angularDamping = 0.01;
this.circleBd.AddShape(this.ballSd1);
this.circleBd.AddShape(this.ballSd2);
this.circleBd.position.Set(Device.app.screen.width / 2, Device.app.screen.height / 2 + 100);

3. World에서 Body 생성


this.rigidBody = Device.gamestate.CreateBody(this.circleBd);

4. Sprite의 x, y 좌표는 body의 m_position x, y 를 계속 반영시킨다.

this.sprite.x = this.rigidBody.m_position.x;
this.sprite.y = this.rigidBody.m_position.y;

5. 물체에 힘을 주고 싶다면 SetLinearVelocity, SetAngularVelocity 2개의 방법이 있다.

Angular는 float을 인자로, Linear는 b2Vec (벡터2)를 인자로 받는다.

물체가 일정시간 움직이지 않으면 WakeUp 시켜야 한다. (WakeUp하지 않을경우 m_force는 바뀌지만 반영되지 않음)

this.rigidBody.WakeUp();
this.rigidBody.SetLinearVelocity(new b2Vec2(-100, -200));


유니티 (Unity) 에서 Android Studio 를 통해 최신 Android SDK를 설치, 빌드를 시도하면 빌드 마무리 쯤에 SDK Error가 발생합니다.


해당 문제는 2개의 해결 방법이 있습니다.


1. 안드로이드 SDK 중 tools 다운그레이드 


안드로이드 SDK 설치시 내부에 있는 tools 폴더를 버전 r25.2.5로 설치, 덮어쓰기 하면 정상적으로 빌드가 가능합니다.


2. AndroidManifest 파일 변경


유니티 프로젝트 탭에서 AndroidManifest 파일에 다음과 같은 코드를 추가합니다.


xmlns:tools="http://schemas.android.com/tools"


둘중 한가지 방법을 선택한뒤 정상적으로 빌드되는걸 확인할 수 있습니다.


GoogleVR등 Target API가 26이상일 경우 2번 방법을 추천드립니다.

자 모든 포트를 사용할수 있게는 했는데

외부와 내부의 연결이 되지 않은 상태이다.

선착장은 준비가 됬는데 뱃길이 뚫리지 않은 상황이라고 생각하면 될듯

그럼 이제 뱃길을 준비해 보자.

// >> : 포트를 열어두면 네트워크 공격이 들어올 수 있다. 자신이 사용할 포트만 연결시키자.


먼저 자신이 사용할 포트의 번호를 정해두는게 좋은데

1 ~ 1000 까지는 특수한 목적으로 사용되고 있다.

1001 ~ 30000내에서 자신이 사용할 포트를 정해보자.

나는 1234, 9090으로 사용했음


밑에 규칙이름 , 내부 IP주소, 외부포트, 내부포트를 설정한뒤 적용을 누르면

위에 3개처럼 등록이 된다.


규칙이름 : 자기가 구분하기 쉽게 설정하면 됨

내부 IP주소 : 현재 컴퓨터의 IP주소, 옆의 현재 접속된 IP 주소 체크하면 자동으로 설정된다.

외부 포트 : 밖에서 연결을 시도할때 사용할 포트번호

내부 포트 : 안에서 연결을 받을때 사용할 포트번호

나같은 경우에는 외부, 내부포트 같게 설정했다.

저렇게 한뒤 적용하면 동작한다.


통신사 공유기를 사용한다면

이런 화면에서 포트포워딩을 할수 있다.


DMZ 설정, 포트포워딩 과정을 끝냈다면 이제는 코딩으로 들어가서 테스트 해볼 시간


+ Recent posts