반응형

타일맵에 Collision Layer, Collision Mask를 설정하고 게임 실행 중 코드에서 Custom Data에 따라 적절히 바꿀 수 있다.

 

타일맵을 준비한다.

 

TileMap - Tile Set- Physics Layers - Collision Layer/Mask를 설정한다.

 

TileMap - Tile Set - Custom Data Layers에 원하는 데이터 이름과 타입을 설정한다.

 

Custom Data를 지정할 타일을 선택하고 Custom Data에 원하는 데이터 값을 설정한다. 위에서 bool 타입을 설정했기 때문에 On(True)이 표시된다. (0은 첫 번째 타일맵 레이어를 뜻한다)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using Godot;
 
public partial class player : Node2D
{
    [Export]
    CharacterBody2D character;
 
    public override void _Ready()
    {
        //character = GetNode<CharacterBody2D>("CharacterBody2D");
    }
 
    public override void _Process(double delta)
    {
        Vector2I mousePosition = GetNode<TileMap>("TileMap").LocalToMap(GetViewport().GetMousePosition());
        // 마우스 커서 위치를 타일맵 좌표로 변환한다.
        int layers = GetNode<TileMap>("TileMap").GetLayersCount();
        // 타일맵 레이어 갯수를 가져온다.
 
        for (int layer = 0; layer < layers; layer++)
        {
            TileData td = GetNode<TileMap>("TileMap").GetCellTileData(layer, mousePosition);
            // 마우스가 위치한 타일의 타일 데이터를 가져온다.
            if (td != null)
            {
                GD.Print($"Layer: {layer}");
                GD.Print($"CustomData: {td.GetCustomData("extraData")}");
                // TileMap - Inspector - Custom Data Layers 에서 추가한 변수를
                // TileSet탭 - Tiles탭 - Select - Custom Data 에서 세팅한 값.
 
                //GetNode<TileMap>("TileMap").TileSet.SetPhysicsLayerCollisionLayer(layer, 8);
                //GetNode<TileMap>("TileMap").TileSet.SetPhysicsLayerCollisionMask(layer, 16);
                // extraData 값을 확인하고 그에 맞게 레이어 값을 바꿀 수 있다.
 
                //int groundLayer = 1;
                //int buildingLayer = 2;
                //character.SetCollisionLayerValue(groundLayer, false);
                //character.SetCollisionMaskValue(buildingLayer, true);
                // 아니면 상화에 따라 캐릭터의 collision layer/mask 값을 바꿀 수 있다.
                // 주의할 점은 SetCollisionXXXValue()의 레이어 값은 1~32이므로 미리 변경하고 싶은
                // 레이어 번호를 변수에 저장하고 사용하자. 0 이 들어가면 안된다.
            }
            else
            {
                GD.Print("NULL");
            }
 
            GD.Print($"Collision Layer:" +
                $"{GetNode<TileMap>("TileMap").TileSet.GetPhysicsLayerCollisionLayer(layer)}");
            GD.Print($"Collision Mask:" +
                $"{GetNode<TileMap>("TileMap").TileSet.GetPhysicsLayerCollisionMask(layer)}");
            // 1번 레이어(마스크) value: 1
            // 2번 레이어(마스크) value: 2
            // 3번 레이어(마스크) value: 4
            // 4번 레이어(마스크) value: 8
            // ... 9번 레이어(마스크) value: 256 ...
        }
    }
}
 

 

 

스크립트를 작성한다.

 

게임을 실행하면 마우스 위치에 따라 정보가 표시된다.

 

반응형

'Godot' 카테고리의 다른 글

[Godot] 2D Navigation Basic Setup  (0) 2023.10.06
[Godot] Wall Jump 벽 점프  (0) 2023.10.02
[Godot] RayCast2D C# Example  (0) 2023.09.27
[Godot] Area2D Gravity 중력  (0) 2023.09.27
[Godot] AddChild(), RemoveChild()  (0) 2023.09.26
Posted by J-sean
:
반응형

구글 안드로이드 맵 SDK를 사용해 보자.

 

Google Play services가 설치되어 있지 않다면 설치한다.

 

play-services-maps를 추가한다.

 

AndroidManifest.xml에 API KEY와 GMS(Google Mobile Services) 버전 확인하는 메타 데이터를 추가한다.

 

레이아웃에 fragment를 추가한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.example.myapplication;
 
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
 
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
 
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }
 
    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        LatLng curPosition = new LatLng(37.3850143127.1234308);
 
        googleMap.addMarker(new MarkerOptions().position(curPosition).title("Marker"));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(curPosition, 16));
    }
}
 

 

소스를 입력하고 빌드한다.

 

지정한 위치에 마커가 표시되고 카메라가 이동한다.

※ 참고

Android용 Maps SDK 개요

 

반응형
Posted by J-sean
:
반응형

2022.02.05 - [Android] - Naver Mobile Dynamic Map For Android 안드로이드 네이버 모바일 다이나믹 맵 1

 

지도에 마커와 중심점을 추가해 보자.

 

onMapReady()에 마커와 중심점을 정의한다.

 

빌드하고 실행하면 지정된 위치에 마커와 중심점이 표시된다.

 

반응형
Posted by J-sean
:
반응형

네이버 클라우드 플랫폼에서 제공하는 지도 서비스를 이용해 안드로이드 앱을 만들어 보자.

 

Empty Activity를 선택하고 프로젝트를 만든다.

 

settings.gradle에 저장소를 추가한다.

 

build.gradle에 네이버 지도 SDK 의존성을 추가한다.

 

Sync Now를 클릭한다.

 

 

AndroidManifest.xml에 클라이언트 ID를 지정한다.

 

앱 레이아웃에 MapFragment를 추가한다.

 

빌드하고 실행하면 기본 위치의 지도가 표시된다.

 

MainActivity.java의 onCreate()를 수정하고 onMapReady()를 추가한다.

 

 

빌드하고 실행하면 원하는 위치의 지도가 표시된다.

 

반응형
Posted by J-sean
:
반응형


지뢰 찾기는 MXN 크기의 지뢰밭에서 모든 지뢰의 위치를 찾는 게임이다. 이 게임의 각 셀은 인접한 최대 8개의 셀 중 몇 개의 셀에 지뢰가 있는지 보여준다.


아래와 같이 맵의 크기를 입력하고 지뢰의 위치를 #로 입력하면 게임 맵을 작성해 주는 프로그램을 만들어 보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
 
using namespace std;
 
int main()
{
    int row, column;
 
    cout << "Enter minefield size(row column): ";
    cin >> row >> column;
 
    char** field = new char* [row];
    for (int i = 0; i < row; i++)
    {
        field[i] = new char[column];
        //memset(field[i], 0, sizeof(char) * (column));
    }
 
    char line[100];
 
    cout << "Enter minefield(# = mine): " << endl;
    for (int i = 0; i < row; i++)
    {
        cin >> line;        
        memcpy_s(field[i], column, line, strlen(line) > (unsigned)column ? column : strlen(line));
        // Invalid input prevention.
    }
 
    char** map = new char* [row];
    for (int i = 0; i < row; i++)
    {
        map[i] = new char[column];
        memset(map[i], '0'sizeof(char* (column));
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            if (field[i][j] == '#')
            {
                map[i][j] = '#';
            }
            else
            {
                for (int k = i - 1; k < i + 2; k++)
                    for (int l = j - 1; l < j + 2; l++)
                        if (k > -1 && k < row && l > -1 && l < column && field[k][l] == '#')
                            map[i][j]++;
            }
        }
    }
 
    cout << endl << endl << "Minefield map: " << endl;
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            cout << map[i][j] << ' ';
        }
        cout << endl;
    }
 
    for (int i = 0; i < row; i++)
    {
        delete[] field[i];
    }
    delete[] field;
 
    for (int i = 0; i < row; i++)
    {
        delete[] map[i];
    }
    delete[] map;
 
    return 0;
}



알고리즘은 간단하다. 각 셀에서 주변의 모든 셀을 검사해 지뢰가 있으면 숫자를 증가 시킨다. 모서리에 위치한 셀은 주변 셀을 검사할 때 배열의 범위를 넘어가지 않도록 주의 한다.


실행 결과.


반응형
Posted by J-sean
: