2010-12-16 8 views
1

OS :: win xp sp3。Qt :: 4.6(C++)でキーワードを即時に動作させる方法を教えてください。

Qtの:: 4.6

私は私はいくつかのrectangle.Iがscreen.Key_Aの周りに彼を移動するために、その矩形のkeyPressEventを定義したクラスにゲームボード:: rectangle.moveToLeft & Key_D ::四角形を持っています。 moveToRight.Problemはキーが遅れて動作することです。 私は1つのキーをリリースして別のキーを押すと、そのキーがオンラインになる前にしばらく時間がかかります。

コードスニペット:

//in Gameboard class  

ship = new QRect(x,y,w,h); 

void Gameboard::keyPressEvent(QKeyEvent* event) 
{ 
switch(event->key()) { 

case Qt::Key_A : 
{ 
    x = x-10; 
    ship->moveTo(x,y); 
    break; 
} 

case Qt::Key_D : 
{ 
    x = x+10; 
    ship->moveTo(x,y); 
    break; 
} 


} 



} 
+0

keyPressEvent()のコードを貼り付けることはできますか? – Septagram

+0

あなたはキーを押す際に何か遅れを感じるべきではありません。あなたは、あなたは重いドローイング作品をUIスレッドでやっていますか? –

+0

私は軽いものをしていますが、キーは即座に反応しません。 –

答えて

3

は、該当するテキストボックスに入力カーソルを置き、「」キーを押してください。あなたが見えるのは、キーを押すと、文字 'A'が印刷され、一時停止し、最初の文字 'A'にすぐに多くの文字が続きます。それがキー入力イベントの仕組みです。そしてあなたのプログラムは、まさにこのように受け取ります。最初にの1つのイベントが実際に押されたときに受信されます。そして、遅延の後、1つの文字を何度も何度も入力したい場合は、自動的に繰り返されるイベントが多く発生します。

テキスト入力には完全に機能しますが、ゲームでは通常はスムーズな動きが必要です。そのような場合は、イベントを受け取ったときではなく、タイマーイベントなどで定期的に船を移動する必要があります。そして、あなたはkeyPressEventとkeyReleaseイベントの両方を捕らえて、現在どの運動キーが押されているのかを覚えておく必要があります。たとえば、次のようにすることができます。

struct Ship { 
    bool is_moving_left, is_moving_right; 
    QPoint position; 
    int speed; 

    ... 

    void timerEvent() 
    { 
     if (is_moving_left) position.setX (position.x() - speed); 
     if (is_moving_right) position.setX (position.x() + speed); 
    } 

    ... 
}; 

... 

void Gameboard::keyPressEvent (OKeyEvent *_event) 
{ 
    switch(event->key()) { 

    case Qt::Key_A : 
     ship->is_moving_left = true; 
     break; 

    case Qt::Key_D : 
     ship->is_moving_right = true; 
     break; 
    } 
} 

... 

void Gameboard::keyReleaseEvent (OKeyEvent *_event) 
{ 
    switch(event->key()) { 

    case Qt::Key_A : 
     ship->is_moving_left = false; 
     break; 

    case Qt::Key_D : 
     ship->is_moving_right = false; 
     break; 
    } 
} 

次に、Ship :: timerEvent()がゲームのすべてのタイマーイベントで呼び出されるようにします。

+0

どのように船を止めますか?あなたのコードは決してis_moving_xxxをオフにしません。実際にはどちらも設定されています! – TonyK

+0

@TonyKスクロールダウンして、出荷はkeyReleaseEvent()で停止します。 – Septagram

+1

OK、私はばかです。 – TonyK

関連する問題