Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 23

Отбивание картинки от стенок экрана

21.12.2013, 17:58. Показов 1678. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, может кто-то подсказать какой должен быть цикл что б картинка летала по экрану и отбивалась от стенок экрана?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2013, 17:58
Ответы с готовыми решениями:

Изобразить теннисный мячик (белый круг), движущийся в поле экрана и отскакивающий от “стенок” – границ экрана
Изобразить теннисный мячик (белый круг), движущийся в поле экрана и отскакивающий от “стенок” – границ экрана. Первоначальное направление...

Шар, отскакивающий от стенок экрана
помогите составить процедуру, рисующую на синем фоне шар, который отскакивает от стенок икрана.

Увеличение размера окна у стенок экрана не работает
Это издевательство, уже не раз пожалел с переходом на Windows 10, хотя у него есть и свои плюсы. Столкнулся с очередной проблемой. ...

6
 Аватар для BeginerMan
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
22.12.2013, 09:26
Ты что, этож 8-микласник даже сделает.
Просто перемещаешь картинку по координатам, делаешь проверки, с какой стороны картинка ударилась и об какой край окна, если ударяется то двигать в противоположную сторону.
Если нужно чтобы ещё под углом было, добавляешь <cmath>, дерзаешь cos sin.
cmath

Если уж прям лень делать самому, хоть приведи код, который у тебя имеется.
0
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 23
22.12.2013, 14:13  [ТС]
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
void DrawStart()
{
 int i;
 HANDLE h;
 int toppos=GetSystemMetrics(SM_CYSCREEN)-23;
 
 //Отображаем окно
 ShowWindow(hWnd, SW_SHOW);
 //Установить верхнюю позицию окна в левый нижний угол экрана.
 SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 30, 28, SWP_SHOWWINDOW);
 UpdateWindow(hWnd);
 //Создаю пустой указатель h который буду использовать для задержки.
 h=CreateEvent(0, true, false, L"et");
 
 //Сейчас будем подымать кнопку
 // От 1 до 80 выполнять действия от begin до end for i:=1 to 80 do
 for (i=0; i<50; i++)
 {
        toppos=toppos-4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 30, 28, SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
 
 for (i=50; i>0; i--)
 {
        toppos=toppos+4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 30, 28, SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
}
Вот у меня такое, но это просто для движения вверх-вниз...а так что бы от стенок, немного не могу понять....
0
 Аватар для BeginerMan
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
23.12.2013, 08:13
задержку можно указать и одной функцией Wait(ms), ms -миллисекунды.
Ещё у вас что странно, указано int = i, а в циклах вы придаёте другое значение.
Вы либо в цикле i используете или можете убрать из цикла,
C++
1
2
3
int i = 0;
....
for(;i < 50;i++0)
Я конечно из этого кода тоже мало что могу взять, можете весь код привести ?
0
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 23
23.12.2013, 14:28  [ТС]
Да конечно,
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// DZ_SP_1.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include "DZ_SP_1.h"
 
#define MAX_LOADSTRING 100
 
// Глобальные переменные:
HWND hWnd;
HBITMAP startBitmap; 
HINSTANCE hInst;                                // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
 
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
// Отправить объявления функций, включенных в этот модуль кода:
void DrawStart()
{
 int i;
 HANDLE h;
 int toppos=GetSystemMetrics(SM_CYSCREEN)-23;
 
 //Отображаем окно
 ShowWindow(hWnd, SW_SHOW);
 //Установить верхнюю позицию окна в левый нижний угол экрана.
 SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 30, 28, SWP_SHOWWINDOW);
 UpdateWindow(hWnd);
 //Создаю пустой указатель h который буду использовать для задержки.
 h=CreateEvent(0, true, false, L"et");
 
 //Сейчас будем подымать кнопку
 // От 1 до 80 выполнять действия от begin до end for i:=1 to 80 do
 for (i=0; i<50; i++)
 {
        toppos=toppos-4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 30, 28, SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
 
 for (i=50; i>0; i--)
 {
        toppos=toppos+4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 30, 28, SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
}
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;
 
    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_DZ_SP_1, szWindowClass, MAX_LOADSTRING);
 
    startBitmap = (HBITMAP)::LoadImage(hInstance, 
      MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 
      0, 0, LR_DEFAULTCOLOR);
    
    MyRegisterClass(hInstance);
 
    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_DZ_SP_1);
 
    DrawStart();
    
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        DrawStart();
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX); 
 
    wcex.style          = 0;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_DZ_SP_1);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = L" ";
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
 
    return RegisterClassEx(&wcex);
}
 
//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   int Style;
   Style = GetWindowLong(hWnd, GWL_STYLE);
   Style=Style || WS_CAPTION;
   Style=Style || WS_SYSMENU;
   SetWindowLong(hWnd, GWL_STYLE, Style);
 
   return TRUE;
}
 
//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HDC hdcBits;
 
    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        Rectangle(hdc, 1,1,10,10);
        hdcBits=::CreateCompatibleDC(hdc);
        SelectObject(hdcBits,startBitmap);
        BitBlt(hdc, 0, 0, 30, 28, hdcBits, 0, 0, SRCCOPY);
        DeleteDC(hdcBits);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
 Аватар для BeginerMan
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
23.12.2013, 22:28
Я, если честно, еле-еле разобрался в вашем коде, решил написать сам, я так и не понял что вам нужно, то ли чтобы по рабочему столу летало окно, то ли по окну летал квадратик,а вернее рисунок.
Вот код, у вас походу готовый проект, так что я впихну что знаю, если будут ошибки, исправьте пожалуйста.
Все переменные я вам описал что делают, надеюсь разберётесь, если что спрашивайте.

ВНИМАНИЕ !!!
Кликните здесь для просмотра всего текста
1.Я писал на Юникоде, если у вас многобайтовая, то поменяйте, пожалуйста.
2.Если хотите чтобы квадратик летал быстрее, увеличите speed в wWinMain


Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include "stdafx.h"
#include "DZ_SP_1.h"
#include <Windows.h>
 
HWND hwnd;                      //Дескриптор окна
HINSTANCE hInst;                //instance окна
LPCWSTR ClassName;              //Имя класса
LPCWSTR AppName;                //Имя окна
int width, height;              //Ширина и высота окна
int widthScreen, heightScreen;  //ширина и высота рабочего стола
int x, y;                       //Координаты по х и у
int speed;                      //Скорость полёта окна :)
int dirY;                       //Направление по координате Y; 0-вниз 1-вверх
int dirX;                       //Направление по координате X; 0-вправо 1-влево
 
void DrawWindow();              //Рисует окно по новым координатам
void CalculateY();              //Вычисляет координату Y
void CalculateX();              //Вычисляет координату X
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
        break;
    }
    
    return 0;
}
 
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,int nShowCmd)
{
    UNREFERENCED_PARAMETER(hInstance);
    UNREFERENCED_PARAMETER(hPrevInstance);
 
    WNDCLASSEX wcex;
    MSG msg;
 
    ClassName = L"Window";
    AppName = L"Window";
    width = 320;
    height = 320;
    hInst = GetModuleHandle(NULL);
    dirY = 0;//Полетит вниз
    dirX = 0;//Полетит вправо
    x = 10;
    y = 10;
    widthScreen = GetSystemMetrics(SM_CXSCREEN);
    heightScreen = GetSystemMetrics(SM_CYSCREEN);
    speed = 5;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInst;
    wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_DZ_SP_1);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = ClassName;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
    RegisterClassEx(&wcex);
 
    hwnd = CreateWindow(ClassName,AppName,WS_POPUP|WS_BORDER,x,y,width,height,NULL,NULL,hInst,NULL);
    if(!hwnd)
    {
        MessageBox(NULL,L"Не удалось создать окно.",L"Ошибка",MB_OK);
        return 0;
    }
 
    ShowWindow(hwnd,nShowCmd);
    UpdateWindow(hwnd);
 
    ZeroMemory(&msg,sizeof(msg));
 
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
 
        DrawWindow();
    }
 
    UnregisterClass(ClassName,hInst);
 
    DestroyWindow(hwnd);
    hwnd = 0;
 
    return (int)msg.wParam;
}
 
 
void DrawWindow()
{
    CalculateX();
    CalculateY();
 
    SetWindowPos(hwnd,HWND_TOPMOST,x,y,width,height,SWP_SHOWWINDOW);//SWP_SHOWWINDOW обновляет окно, не надо после него писать UpdateWindow
 
    Sleep(33);//Вырубает потом на 33 миллисекунды
 
    return;
}
 
void CalculateY()
{
    if(dirY == 0)
    {
        if(y + height + speed > heightScreen)
        {
            y = heightScreen - height;
            dirY = 1;
        }
        else
        {
            y += speed;
        }
    }
    else if(dirY == 1)
    {
        if(y - speed < 0)
        {
            y = 0;
            dirY = 0;
        }
        else
        {
            y -= speed;
        }
    }
 
    return;
}
 
 
void CalculateX()
{
    if(dirX == 0)
    {
        if(x + width + speed > widthScreen)
        {
            x = widthScreen - width;
            dirX = 1;
        }
        else
        {
            x += speed;
        }
    }
    else if(dirX == 1)
    {
        if(x - speed < 0)
        {
            x = 0;
            dirX = 0;
        }
        else
        {
            x -= speed;
        }
    }
 
    return;
}
1
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 23
23.12.2013, 22:48  [ТС]
Спасибо огромное, просто выручил, с кодом все норм, в принципе все понятно. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2013, 22:48
Помогаю со студенческими работами здесь

Движение картинки от центра экрана — по диагоналям ко всем углам экрана с уменьшением размера
нужно чтобы картинка двигалась от центра экрана - по диагоналям ко всем углам экрана с уменьшением размера заранее спасибо

Арканоид. Отбивание шарика о ракетку
Здравствуйте. Помогите разобраться с ракеткой и шариком, чтобы ракетка отбивала шарик, и клир интервал если шарик не попал по ракетке. Я...

Отбивание графических примитивов от краев окна
Необходимо реализовать отбивание примитивов от краев окна. Уже реализовано отбивание примитива от одной стенки окна, как сделать так же для...

Вывод картинки на середину экрана
Подскажите пожалуйста, как вывести картинку так, чтобы она была по середине экрана. (Я делаю игру, и хочу на фон игры вывести картинку меню...

Масштабирование картинки в зависимости от разрешения экрана
как программно масштабировать картинку в зависимости от разрешение экрана?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru