Форум программистов, компьютерный форум CyberForum.ru

Движение объектов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
nospoon
 Аватар для nospoon
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 5
15.12.2013, 11:19     Движение объектов #1
Здравствуйте друзья, мне нужна помощь в написании программы C++
Нужно сделать объект, который будет двигаться по экрану:
Движение под углом 45 градусов с отражением от границ экрана. Начальные значения — dx = 5, dy = 5.
Управление клавишами со стрелками Влево(0,75), Вправо(0,77), Вверх(0,72), Вниз(0,80).
Нужна любая помощь в написании этой программы)
Спасибо заранее
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2013, 11:19     Движение объектов
Посмотрите здесь:

Движение точки C++
C++ Движение в консоле
Движение прямой C++
движение фигуры C++
C++ Движение switch()
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
15.12.2013, 11:56     Движение объектов #2
На Win32 используя ресусный диалог:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <windows.h>
#define BALL                            102
int x,y,dx,dy; // Координаты и скорости объекта
const int R=20; // радиус объекта
int WINAPI fn(HWND hwnd,int cmd,WPARAM wp,LPARAM lp)
{
    switch(cmd)
    {
 
    case WM_INITDIALOG:
        x=0;y=0; // задание начальных координат
        dx=2;dy=-2; // задание начальных координат
        SetTimer(hwnd,1,25,NULL); // запуск таймера каждые 25 миллисекунд
        return 1;
    case WM_TIMER: // появилось ссобщение от таймера
        {
            x+=dx;y+=dy; // пересчет координат
            RECT rc;GetClientRect(hwnd,&rc); // узнать размеры окна
            // проверка столкновения с границей
            if(x>rc.right-R)dx=-abs(dx);
            if(x<R)dx=abs(dx);
            if(y>rc.bottom-R)dy=-abs(dy);
            if(y<R)dy=abs(dy);
            InvalidateRect(hwnd,NULL,TRUE); // команда на перерисовку окна
        }
        return 1;
    case WM_CLOSE:
        EndDialog(hwnd,3); // закрытие окна
        return 1;
    case WM_SIZE:
        InvalidateRect(hwnd,NULL,TRUE);// перерисовка при изменении размера окна
        return 1;
    case WM_COMMAND:
        return 0;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            HBRUSH b1,b0;
            b1=CreateSolidBrush(RGB(255,0,0)); // красная кисть
            b0=(HBRUSH)SelectObject(hdc,b1);
            Ellipse(hdc,x-R,y-R,x+R,y+R);  // Рисуем красный круг в точке (x,y) радиуса R 
            SelectObject(hdc,b0);
            DeleteObject(b1);
            EndPaint(hwnd, &ps);
        }
        return 1;
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hi,HINSTANCE,LPSTR,int) 
{
    return DialogBox(hi,MAKEINTRESOURCE(BALL),NULL,(DLGPROC)fn);
}
Текст ресурса (ball.rc)
C++
1
2
3
4
5
6
7
8
#include "windows.h"
#define BALL                            102
 
BALL DIALOGEX 0, 0, 372, 250
STYLE  WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Moving"
BEGIN
END
nospoon
 Аватар для nospoon
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 5
15.12.2013, 18:04  [ТС]     Движение объектов #3
А может кто-нибудь помочь тем, что объяснит это?)
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
15.12.2013, 19:44     Движение объектов #4
Создаете проект win32 и добавляете к нему 2 файла:
1. ресурс файл xxxx.rc содержит образцы диалогов и др. элементы.
2. файл xxxx.cpp содержит точку входа в программу - функцию int WINAPI WinMain()
и функцию обработчик сообщений int WINAPI fn().
WinMin вызывает менеджер диалога, который берет из ресурса образец диалога с названием BALL
и открывает его.
Далее для каждого из событий вызывается функция fn. Параметр cmd определяет причину вызова.
Вызов SetTimer(hwnd,1,25,NULL); заставляет вызывать эту функцию каждые 25 миллисекунд с
cmd=WM_TIMER. Пересчитываем координаты фигуры и вызываем функцию
InvalidateRect(hwnd,NULL,TRUE);
эта команда на перерисовку окна, которая заставляет windows послать сообщение WM_PAINT.
В этот момент и рисуется фигура в точке (X,Y).
Более подробно см. в разделе
http://www.cyberforum.ru/win-api/
Yandex
Объявления
15.12.2013, 19:44     Движение объектов
Ответ Создать тему
Опции темы

Текущее время: 22:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru