2012-04-08 7 views
0

나는이 작은 응용 프로그램을 내가 잠시 동안 놀아 왔던 것을 발견했습니다. 원에서 이미지를 단순히 회전하고 싶다면 궁금합니다. 전체 이미지를 그냥 위아래로 바운스하게 만들려면이 프로그램을 어떻게 수정하면 좋을까요? 내가 시도한 모든 것은 단지 이미지를 늘릴 것입니다 - 왼쪽이나 오른쪽으로 움직이더라도 말이죠. 내가 할 수있는 것에 대한 어떤 아이디어라도? 코드 그래서 당신이 달성하려고하는지 모르겠지만, 비켜 fundies를 얻을 수동그라미로 이미지가 튀거나 회전 할 때

public partial class Form1 : Form 
    { 
      private int width = 15; 
      private int height = 15; 

      Image pic = Image.FromFile("402.png"); 
      private Button abort = new Button(); 
      Thread t; 

      public Form1() 
      { 
      abort.Text = "Abort"; 
      abort.Location = new Point(190, 230); 
      abort.Click += new EventHandler(Abort_Click); 
      Controls.Add(abort); 

      SetStyle(ControlStyles.DoubleBuffer| ControlStyles.AllPaintingInWmPaint| ControlStyles.UserPaint, true); 

      t = new Thread(new ThreadStart(Run)); 
      t.Start(); 
      } 
      protected void Abort_Click(object sender, EventArgs e) 
      { 
      t.Abort(); 
      } 

      protected override void OnPaint(PaintEventArgs e) 
      { 
      Graphics g = e.Graphics; 
      g.DrawImage(pic, 10, 10, width, height); 
      base.OnPaint(e); 
      } 

      public void Run() 
      { 

       while (true) 
       { 
       for(int i = 0; i < 200; i++) 
       { 
        width += 5; 

        Invalidate(); 
        Thread.Sleep(30); 
       } 

       } 
      } 
    } 
+0

좀 더 설명이 필요합니다. 코드 덤프 (code-dump) 및 누군가가 자신의 물건을 통해 추론 할 수밖에 없을 것입니다. 너 정확히 뭘하려는거야? 그게 효과가없는 무엇을 시도 했습니까? 등등 –

+1

어떤 의미에서 특정? 그냥 이미지를로드하는 중이고 전체 이미지를 원으로 이동하거나 전체 이미지를 위아래로 이동하려고합니다. 오히려 그것이 무엇을 현재보다 줌입니다. – BigBug

+0

이미지를 원을 그리며 즉각적으로 번역하고 회전 시키거나 시간이 지남에 따라 점차적으로 원을 그리며 움직이려고하십니까? "동그라미 안에서 움직여 라"와 "바운스"는 약간 모호합니다. 또한, 당신은 무엇을 시도하고있는 것은 잘못되어 가고 있습니까? 너는 약간의 애니메이션을하려고 노력하고있다, 그렇지? 점차적으로 키 프레임 효과를 얻으려고합니다. –

답변

1

이하, 윈폼은 GDI 라이브러리와 + 자사의 의미가 더 GUI 물건, 그래서 뭔가 등에 애니메이션은 아마도 SFML과 같은 그래픽 라이브러리에 의해 더 잘 처리 될 것입니다.

어쨌든, 원하는 것을 성취 할 수있는 수많은 방법이 있습니다. 원을 그리며 무언가 움직이는 측면에서, 당신은 조금 간단한 삼각 관계가 필요할 것입니다. 튀는 동작을 위해 나는 사인 곡선을 따르는 것이 가장 쉬운 방법이라고 말하고 싶다.

필드 정의 :

private double frame = 0; 

의 OnPaint :

Graphics g = e.Graphics; 
g.DrawImage(pic, 10, 10 + Math.sin(frame)*10, width, height); 
frame+=.01; 
base.OnPaint(e); 

이 방법마다 여기

수신 거부에 대한 (이 구문 완벽 있는지 확실하지 않습니다) 일부 의사 코드입니다 페인트 이벤트가 발생하면 .01 라디안만큼 t가 증가합니다. 죄는 -1과 1 사이에서 진동하는 영역을 가지고 있으며, 그 영역을 거쳐서 10을 곱하면 그 반동 효과를 얻을 수 있습니다.

프레임은 "키 프레임"을 나타냅니다. 속도를 높이려면 frame+=__을 더 높은 값으로 늘리십시오. 범위를 늘리려면 오프셋을 변경하십시오. Math.sin(frame)*__

+0

감사합니다. 작동하도록했습니다. :) – BigBug

관련 문제