자연스럽게 좌우 이동하면서 일정 시간이 지나면 블록이 아래로 이동하도록 하는 방법을 설명해드릴게요.

1. 기본 구조

  • map[20,20] 배열을 사용하여 게임 맵을 구성
  • -1을 좌우 및 하단에 배치하여 경계를 설정
  • 색깔은 1~10 범위에서 랜덤 설정
  • 일정 시간이 지나면 블록이 아래로 이동

2. 좌우 이동 및 중력 처리

(1) 타이머 사용

WinForms의 Timer 컨트롤을 활용하여 좌우 이동 및 중력 적용을 분리하여 처리할 수 있습니다.

  • 좌우 이동 → 사용자의 방향키 입력 시 즉시 실행
  • 아래 이동(중력 적용) → Timer를 이용해 일정 주기로 실행

(2) 변수 및 로직

 
private int[,] map = new int[20, 20]; // 게임 맵 private int playerX = 10; // 플레이어 위치 (초기 X 좌표) private int playerY = 0; // 플레이어 위치 (초기 Y 좌표) private Timer gravityTimer; private int gravityInterval = 1000; // 중력 적용 주기 (1초)

(3) 중력 타이머 설정

 
gravityTimer = new Timer(); gravityTimer.Interval = gravityInterval; gravityTimer.Tick += GravityMove; gravityTimer.Start();

(4) 좌우 이동 처리

 
protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.Left) { if (playerX > 0 && map[playerY, playerX - 1] != -1) // 왼쪽 이동 가능하면 { playerX--; Invalidate(); // 화면 다시 그리기 } } else if (e.KeyCode == Keys.Right) { if (playerX < 19 && map[playerY, playerX + 1] != -1) // 오른쪽 이동 가능하면 { playerX++; Invalidate(); } } }

(5) 중력 적용 함수

 
private void GravityMove(object sender, EventArgs e) { if (playerY < 19 && map[playerY + 1, playerX] == 0) // 아래 이동 가능하면 { playerY++; Invalidate(); } }

3. 부드러운 이동을 위한 개선

(1) 애니메이션 적용

키를 한 번 누르면 즉시 이동하는 방식보다, 누르고 있으면 연속 이동이 되도록 하면 부드러워집니다. 이를 위해 KeyDown과 KeyUp 이벤트를 함께 사용하면 됩니다.

 
private bool movingLeft = false; private bool movingRight = false; private Timer moveTimer; public Form1() { InitializeComponent(); moveTimer = new Timer(); moveTimer.Interval = 100; // 연속 이동 속도 moveTimer.Tick += MovePlayer; } protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.Left) { movingLeft = true; moveTimer.Start(); } else if (e.KeyCode == Keys.Right) { movingRight = true; moveTimer.Start(); } } protected override void OnKeyUp(KeyEventArgs e) { if (e.KeyCode == Keys.Left) movingLeft = false; if (e.KeyCode == Keys.Right) movingRight = false; if (!movingLeft && !movingRight) moveTimer.Stop(); } private void MovePlayer(object sender, EventArgs e) { if (movingLeft && playerX > 0 && map[playerY, playerX - 1] != -1) { playerX--; } else if (movingRight && playerX < 19 && map[playerY, playerX + 1] != -1) { playerX++; } Invalidate(); }

4. 최종 정리

✅ Timer를 사용하여 일정 시간마다 블록이 아래로 이동
✅ KeyDown 및 KeyUp을 사용하여 자연스럽게 좌우 이동
✅ moveTimer를 사용하여 키를 누르고 있을 때 부드럽게 이동

이렇게 하면 좌우 이동과 중력을 자연스럽게 적용할 수 있습니다.
추가로 블록 충돌 처리, 쌓이기 등의 기능도 필요하면 확장하면 됩니다. 

 

Form1.cs
0.00MB

'헥사' 카테고리의 다른 글

Systehttp://m.Drawing.Color[] colorindex = new Systehttp://m.Drawing.Color[]  (0) 2023.11.29
MM_DRAW()  (0) 2023.11.29
헥사 개발코드관련  (0) 2021.04.27

+ Recent posts