Jump to: navigation, search

Information about the group Translation of the wiki page Development/Tutorials/Qt4 Ruby Tutorial/Chapter 12.
Development/Tutorials/Qt4 Ruby Tutorial/Chapter 12Current message text
...Chapter 12/Page display title/ruРазработка/Руководства/Введение в Qt4 на Ruby/Глава 12
...t4 Ruby Tutorial/Chapter 12/1/ruTutorialBrowser/ru
...t4 Ruby Tutorial/Chapter 12/2/ruВведение в программирование на Qt<sup>®</sup>4 на языке Ruby
...t4 Ruby Tutorial/Chapter 12/3/ruВисящий в воздухе
...t4 Ruby Tutorial/Chapter 12/4/ruПример 11: Пробный выстрел
...t4 Ruby Tutorial/Chapter 12/5/ruПример 13: Игра окончена
...t4 Ruby Tutorial/Chapter 12/6/ru== Висящий в воздухе ==
...t4 Ruby Tutorial/Chapter 12/7/ru[[Image:Qt4_Ruby_Tutorial_Screenshot_12.png|center]]
...t4 Ruby Tutorial/Chapter 12/8/ruФайлы:
...t4 Ruby Tutorial/Chapter 12/9/ru=== Обзор ===
...4 Ruby Tutorial/Chapter 12/10/ruIn this example, we extend our '''<tt>LCDRange</tt>''' class to include a text label. We also provide something to shoot at.
...4 Ruby Tutorial/Chapter 12/11/ru=== Построчный обзор программы ===
...4 Ruby Tutorial/Chapter 12/12/ruThis constructor first calls '''<tt>init()</tt>''' and then sets the label text. '''<tt>init()</tt>''' is a separate function performing initialization mosty because of function overloading matters in the original C++ version.
...4 Ruby Tutorial/Chapter 12/13/ruThe setup of '''<tt>lcd</tt>''' and '''<tt>slider</tt>''' is the same as in the previous chapter. Next we create a [ Qt::Label] and tell it to align the contents centered horizontally and to the top vertically. The [ Qt::Object::connect()] calls have also been taken from the previous chapter.
...4 Ruby Tutorial/Chapter 12/14/ruThis function sets the label text.
...4 Ruby Tutorial/Chapter 12/15/ruThe '''<tt>CannonField</tt>''' now has two new signals: '''<tt>hit()</tt>''' and '''<tt>missed()</tt>'''. In addition, it contains a target.
...4 Ruby Tutorial/Chapter 12/16/ruThe '''<tt>hit()</tt>''' signal is emitted when a shot hits the target. The '''<tt>missed()</tt>''' signal is emitted when the shot moves beyond the right or bottom edge of the widget (i.e., it is certain that it has not and will not hit the target).
...4 Ruby Tutorial/Chapter 12/17/ruThis line has been added to the constructor. It creates a "random" position for the target. In fact, the '''<tt>newTarget()</tt>''' function will try to paint the target. Because we are in a constructor, the '''<tt>CannonField</tt>''' widget is invisible. Qt guarantees that no harm is done when calling [ Qt::Widget::update()] on a hidden widget.
...4 Ruby Tutorial/Chapter 12/18/ruThis function creates a target center point at a new random position.
...4 Ruby Tutorial/Chapter 12/19/ruWe create the [ Qt::Time] object '''<tt>midnight</tt>''', which represents the time 00:00:00. Next we fetch the number of seconds from midnight until now and use it as a random seed. See the documentation for [ Qt::Date], [ Qt::Time], and [ Qt::DateTime] for more information.
...4 Ruby Tutorial/Chapter 12/20/ruFinally we calculate the target's center point. We keep it within the rectangle (x = 200, y = 35, width = 190, height = 255), i.e., the possible x and y values are 200 to 389 and 35 to 289, respectively) in a coordinate system where we put y position 0 at the bottom edge of the widget and let y values increase upwards x is as normal, with 0 at the left edge and with x values increasing to the right.
...4 Ruby Tutorial/Chapter 12/21/ruBy experimentation we have found this to always be in reach of the shot.
...4 Ruby Tutorial/Chapter 12/22/ruThis part of the timer event has not changed from the previous chapter.
...4 Ruby Tutorial/Chapter 12/23/ruThis '''<tt>if</tt>''' statement checks whether the shot rectangle intersects the target rectangle. If it does, the shot has hit the target (ouch!). We stop the shoot timer and emit the '''<tt>hit()</tt>''' signal to tell the outside world that a target was destroyed, and return. Note that we could have created a new target on the spot, but because the '''<tt>CannonField</tt>''' is a component we leave such decisions to the user of the component.
...4 Ruby Tutorial/Chapter 12/24/ruThis is the same as in the previous chapter, except that it now emits the '''<tt>missed()</tt>''' signal to tell the outside world about the failure.
...4 Ruby Tutorial/Chapter 12/25/ruAnd the rest of the function is as before.
...4 Ruby Tutorial/Chapter 12/26/ru'''<tt>CannonField::paintEvent()</tt>''' is as before, except that this has been added:
...4 Ruby Tutorial/Chapter 12/27/ruThis line makes sure that the target is also painted when necessary.
...4 Ruby Tutorial/Chapter 12/28/ruThis function paints the target; a rectangle filled with red and with a black outline.
...4 Ruby Tutorial/Chapter 12/29/ruThis private function returns the enclosing rectangle of the target. Remember from '''<tt>newTarget()</tt>''' that the '''<tt>target</tt>''' point uses y coordinate 0 at the bottom of the widget. We calculate the point in widget coordinates before we call [ Qt::Rect::moveCenter()].
...4 Ruby Tutorial/Chapter 12/30/ruThe reason we have chosen this coordinate mapping is to fix the distance between the target and the bottom of the widget. Remember that the widget can be resized by the user or the program at any time.
...4 Ruby Tutorial/Chapter 12/31/ruThere are no new members in the '''<tt>MyWidget</tt>''' class, but we have slightly changed the constructor to set the new '''<tt>LCDRange</tt>''' text labels.
...4 Ruby Tutorial/Chapter 12/32/ruWe set the angle text label to "ANGLE".
...4 Ruby Tutorial/Chapter 12/33/ruWe set the force text label to "FORCE".
...4 Ruby Tutorial/Chapter 12/34/ru=== Запуск приложения ===
...4 Ruby Tutorial/Chapter 12/35/ruThe '''<tt>LCDRange</tt>''' widgets look a bit strange: When resizing '''<tt>MyWidget</tt>''', the built-in layout management in [ Qt::VBoxLayout] gives the labels too much space and the rest not enough; making the space between the two '''<tt>LCDRange</tt>''' widgets change size. We'll fix that in the next chapter
...4 Ruby Tutorial/Chapter 12/36/ru=== Упражнения ===
...4 Ruby Tutorial/Chapter 12/37/ruMake a cheat button that, when pressed, makes the '''<tt>CannonField</tt>''' display the shot trajectory for five seconds.
...4 Ruby Tutorial/Chapter 12/38/ruIf you did the "round shot" exercise from the previous chapter, try changing the '''<tt>shotRect()</tt>''' to a '''<tt>shotRegion()</tt>''' that returns a [ Qt::Region] so you can have really accurate collision detection.
...4 Ruby Tutorial/Chapter 12/39/ruMake a moving target.
...4 Ruby Tutorial/Chapter 12/40/ruMake sure that the target is always created entirely on-screen.
...4 Ruby Tutorial/Chapter 12/41/ruMake sure that the widget cannot be resized so that the target isn't visible. [Hint: [ Qt::Widget::setMinimumSize()] is your friend.]
...4 Ruby Tutorial/Chapter 12/42/ruNot easy; make it possible to have several shots in the air at the same time. [Hint: Make a '''<tt>Shot</tt>''' class.]
...4 Ruby Tutorial/Chapter 12/43/ru[[Category:Ruby/ru]]
NavigationShowing 44 messages.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V.Legal