2010-05-31 3 views
3

저는 학교 프로젝트를위한 작은 게임을 만드는 임무가 있습니다. 그림 상자, 원수를 걷기위한 타이머로 움직입니다. 양식에 약 5 ~ 6 개의 동영상 상자가 있으면 내 응용 프로그램이 문제를 일으키고 뒤쳐집니다. 일부 적을 죽인 후에 (Form/Panel의 Controls Collection에서 제거한 후) 다시 부드럽게 돌아옵니다.vb.net 움직이는 물체에 대한 더 많은 성능

나는 적의 움직임의 루프가 너무 복잡하다고 생각하지만, 그렇게 간단하게 만드는 방법을 모르겠습니다.

Private Sub TimerEnemyMovement_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerEnemyMovement.Tick 
    For Each Enemy As Control In PanelBackground.Controls 
     If Enemy.Name.Substring(0, 5) = "Enemy" Then 
      _enemy.MoveEnemy(Enemy, 2) 
     End If 
    Next 
End Sub 

는 또한 멀티 스레딩 생각하지만이 문제를 해결할 확인하고 내 mainform의 컨트롤에 액세스 할 수없는 문제도있다. 당신이 볼

, 나는 vb.net

모든 아이디어를 어떻게 지연 문제를 해결하는 방법에 대해 많은 지식을 가지고 있지 않은거야?

+0

WinForms를 사용하고 있습니까? –

+0

얼마나 자주 타이머 타이머를 켭니다. 즉, 그 간격은 얼마입니까? –

답변

2

이 시도 :

Private Sub TimerEnemyMovement_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerEnemyMovement.Tick 
    SuspendLayout() 
    For Each Enemy As Control In PanelBackground.Controls 
     If Enemy.Name.Substring(0, 5) = "Enemy" Then 
      _enemy.MoveEnemy(Enemy, 2) 
     End If 
    Next 
    ResumeLayout() 
End Sub 
+0

또한 나는 당신이 모든 레이아웃을 막지 않도록 패널에 대해서만 UpdateBegin()을 사용할 수 있다고 생각합니다. (제 생각에!) –

+0

정확히 무엇입니까? –

+0

@Rene -주기마다 모든 적의 움직임이 결정될 때까지 폼이 다시 칠하기를 기다리므로 몇 가지 대신 하나의 새로 고침을 수행 할 수 있습니다. –

0

VB.NET WinForm 앱은 게임이나 움직이는 객체를 만드는 데 이상적인 설정이 아닙니다. 양식의 그림은 사용자가 알았 듯이 많은 성능을 발휘합니다.

VB.NET WPF (Windows Presentation Framework) 응용 프로그램으로 이동해보십시오. 그래픽이 훨씬 잘 처리됩니다.

+2

"초급"학교 프로젝트를 위해 WPF를 사용하는 것을지지하지 않을 수도 있습니다. 그것은 아마도 손에있는 운동과 관련이없는 다른 많은 복잡성을 소개합니다. WPF는 WinForms에 비해 꽤 가파른 학습 곡선을 가지고 있습니다. –

+0

게임용으로 제작 된 것은 아닙니다. 하지만 내 운동은 그거야. 하지만 질문을 게시 한 후에는 움직이는 물체가 문제가 아니라는 것을 알았습니다. 배경입니다. 배경 이미지가 있고 적들은 투명 배경이있는 애니메이션 GIF입니다. WinForms가 이것을 잘 처리하지 못하는 것 같습니다. –

+0

VB6에서이 기술 (움직이는 PictureBoxes)을 여러 번 사용했고 그 단순성 때문에 꽤 좋았습니다. 마지막으로 VB.NET 2003을 사용해 보았습니다. 괜찮 았지만 성능은 좋지 않았습니다.하지만 이전 컴퓨터는 .NET을 실행하기 위해 더 열심히 노력해야했습니다. 그 이후로 시도하지는 않았지만, 더 나 빠졌을 것입니다 (우리는 5 ~ 6 개 이상의 스프라이트를 가졌지 만 논리는 더 간단했을 것입니다 ...). – FrustratedWithFormsDesigner

0

제안 그냥 몇 속도를 향상시킬 수

가) 오히려 어떻게 배열/목록 B에 저장에 대해, 모든 컨트롤을 통해가는 것보다) 오래된 게임 트릭은 장면을 메모리에 그려서 화면에 복사하는 것입니다. 그렇다면 메모리 비트 맵 (또는 그래픽)을 사용하여이 "적"을 그리면 모든 것이 완료되면 화면으로 전체 bmp로 복사하십시오.

+0

흠 ... 배열에 대한 당신의 제안이 이치에 맞습니다. 나는 그것을 시도했다. 하지만 C#에서와 같은 vb.net에서 참조를 만드는 방법을 찾지 못했습니다. –

0

모든 적을 수행하십시오. n 같은 시간에 움직일 수 있습니까? 움직이는 것이 더 빠릅니까? 6 개 적이있는 경우

, 당신은 등

다음 틱에 다음, 첫 번째 틱에 2.4.6을 1,3,5을 이동할 수 있을까?

0

나는 간단한 게임을 만들기 위해 XNA를 사용 해왔다. 정말 멋졌다. VB.NET은 공식적으로 지원되지 않지만 작동하도록 만들 수 있습니다. 풍경과 많은 수의 애니메이션 객체에 최적화되어 있습니다.

관련 문제