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

Отслеживание границ объектов (Арканоид) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
15.05.2012, 16:40     Отслеживание границ объектов (Арканоид) #1
Здравствуйте, я к вам с, наверное, поднадоевшим вам уже Арканоидом. Пишу его в dev-cpp с использованием стандартной graphics.h, и вот совсем запутался на моменте отслеживания столкновения мяча и блока.
Может быть, кто-нибудь сможет помочь в реализации? Буду очень благодарен.

Вот код на данный момент:

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
#include <stdlib.h>
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#include <graphics.h>
 
void drawblock(int x, int y) {
setfillstyle ( 1, 10 ); 
bar (x, y, x+100, y+40);   
}
    
void drawball(int x, int y) {
setcolor(15);
setfillstyle ( 1, 4 ); 
circle ( x, y, 10 );  
floodfill(x+5,y+5,15);
}
 
void drawplat(int x, int y) {
setfillstyle ( 1, 1 ); 
bar (x, y, x+80, y+20);   
}
 
 
 
void lvl1() {
    int x,y;
    int a=0,b=0;
    int x_blockarray[a][b];
    int y_blockarray[a][b];
    initwindow (640, 480); 
    for (y=20;y<=140;y+=120) {
        b=0;
        for (x=20;x<=440;x+=140) {
            drawblock(x,y);
            x_blockarray[a][b] = x;
            y_blockarray[a][b] = y;
 
            b++;
            }
        a++;
        }
 
    for (y=80;y<=200;y+=120) {
        b=0;
        for (x=100;x<=520;x+=140) {
            drawblock(x,y);
            x_blockarray[a][b] = x;
            y_blockarray[a][b] = y;
            }
        a++;
        }
    drawplat(280, 440);
    x=310;
    y=420;
    while (y<470) {
          x=x;
          y=y-10;
          drawball(x, y);
          delay(100);
          setfillstyle(1, 0);
          bar (x-10, y-10, x+10, y+10); 
          for (a=0;a<=3;a++){
              for (b=0;b<=3;b++){
                  if ((x == x_blockarray[a][b] && y == y_blockarray[a][b]+40)  || (x == x_blockarray[a][b]+100 && y == y_blockarray[a][b])) {
                         printf ("OLOLOLOLOLO");
                                }
                         }
                  }
            }
}
 
 
int main() {
    lvl1();
    system("PAUSE");
}
Вот проблемное условие, насколько его примерно представляю я:
C++
1
if ((x == x_blockarray[a][b] && y == y_blockarray[a][b]+40)  || (x == x_blockarray[a][b]+100 && y == y_blockarray[a][b]))
Добавлено через 4 минуты
Бамп 1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 16:40     Отслеживание границ объектов (Арканоид)
Посмотрите здесь:

Арканоид C++
C++ Арканоид
Вопрос по игре арканоид C++
C++ Арканоид
[C++] Арканоид C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 16:44     Отслеживание границ объектов (Арканоид) #2
Как минимум, ваше условие будет работать только при ударе об угол блока, причем в половине случаев.
Смотрите,
Цитата Сообщение от paranoya Посмотреть сообщение
x == x_blockarray[a][b] && y == y_blockarray[a][b]+40
С игреком все в порядке, но x должен не равен быть x_blockarray[a][b], он должен просто быть в пределах блока, (x>=x_blockarray[a][b])&&(x<=x_blockarray[a][b+1]) или как у вас должно быть... Ну, и второе условие соответственно изменить.
Второе. А если мячик ударит в угол блока (например, крайнего нижнего левого) справа снизу? Тогда расстояние по иксу и по игреку не будут удовлетворять вашим условиям. Когда я говорил о "половине случаев", я имел в виду именно это. Здесь надо писать условие равенства расстояния от центра шарика до соответствующего угла радиусу шарика. И угол отскока, соответственно, надо будет сложнее считать.
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
15.05.2012, 16:50  [ТС]     Отслеживание границ объектов (Арканоид) #3
Спасибо, примерно понял, что можно сделать. А насчет случая столкновения с углом - когда напишу основной костяк, попробую поизвращаться с кодом и продумать этот вариант.
Большое спасибо вам :3
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 16:51     Отслеживание границ объектов (Арканоид) #4
Большое пожалуйста
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
16.05.2012, 13:39  [ТС]     Отслеживание границ объектов (Арканоид) #5
Переделал - стало лучше, но не настолько, насколько хотелось бы - первый блок просто пролетает насквозь.
Подскажите, пожалуйста, ведь по логике все должно работать хорошо.

И, если кто-нибудь знает, подскажите формулу отскока мяча после столкновения.

Вот весь код:

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
#include <stdlib.h>
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#include <graphics.h>
 
void drawblock(int x, int y) {
setfillstyle ( 1, 10 ); 
bar (x, y, x+100, y+40);   
}
    
void drawball(int x, int y) {
setcolor(15);
setfillstyle ( 1, 4 ); 
circle ( x, y, 10 );  
floodfill(x+5,y+5,15);
}
 
void drawplat(int x, int y) {
setfillstyle ( 1, 1 ); 
bar (x, y, x+80, y+20);   
}
 
 
 
void lvl1() {
    int x,y;
    int a=0,b=0;
    int x_blockarray[a][b];
    int y_blockarray[a][b];
    initwindow (640, 480); 
    for (y=20;y<=140;y+=120) {
        b=0;
        for (x=20;x<=440;x+=140) {
            drawblock(x,y);
            x_blockarray[a][b] = x;
            y_blockarray[a][b] = y;
 
            b++;
            }
        a++;
        }
 
    for (y=80;y<=200;y+=120) {
        b=0;
        for (x=100;x<=520;x+=140) {
            drawblock(x,y);
            x_blockarray[a][b] = x;
            y_blockarray[a][b] = y;
            }
        a++;
        }
    drawplat(280, 440);
    x=310;
    y=420;
    while (y<470) {
          x=x;
          y=y-10;
          drawball(x, y);
          delay(100);
          setfillstyle(1, 0);
          bar (x-10, y-10, x+10, y+10); 
          for (a=0;a<=3;a++){
              for (b=0;b<=3;b++){
                  if (((x>=x_blockarray[a][b])&&(x<=x_blockarray[a][b]+100) && y == y_blockarray[a][b]+40)  || ((x>=x_blockarray[a][b])&&(x<=x_blockarray[a][b]+100) && y == y_blockarray[a][b])) {
                         x=x-20;
                         y=y+10;
                         setfillstyle(1, 0);
                         bar (x_blockarray[a][b], y_blockarray[a][b], x_blockarray[a][b]+100, y_blockarray[a][b]+40); 
                         x_blockarray[a][b] = -120;
                         y_blockarray[a][b] = -40;
                                }
                         }
                  }
            }
}
 
 
int main() {
    lvl1();
    system("PAUSE");
}
Вот проблемная часть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
          for (a=0;a<=3;a++){
              for (b=0;b<=3;b++){
                  if (((x>=x_blockarray[a][b])&&(x<=x_blockarray[a][b]+100) && y == y_blockarray[a][b]+40)  || ((x>=x_blockarray[a][b])&&(x<=x_blockarray[a][b]+100) && y == y_blockarray[a][b])) {
                         x=x-20;
                         y=y+10;
                         setfillstyle(1, 0);
                         bar (x_blockarray[a][b], y_blockarray[a][b], x_blockarray[a][b]+100, y_blockarray[a][b]+40); 
                         x_blockarray[a][b] = -120;
                         y_blockarray[a][b] = -40;
                                }
                         }
                  }
Добавлено через 3 минуты
Еще бамп

Добавлено через 5 минут
Помогите, посоны.

Добавлено через 44 минуты
Еще один бамп

Добавлено через 20 минут
Помогите, пожалуйста :3 курсовую через день сдавать.

Добавлено через 18 часов 21 минуту
Народ, помогите, пожалуйста :3
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
17.05.2012, 11:20     Отслеживание границ объектов (Арканоид) #6
У тебя в твоем массиве Блок-эррэй хранятся верхние левые точки блоков? Если так, то в условие
Цитата Сообщение от paranoya Посмотреть сообщение
y == y_blockarray[a][b]+40
стоит добавить еще высоту блока или радиус мячика, ты кажется что-то забыл. И, кстати, я не вижу условий удара о боковую грань или угол...
У тебя где-то есть переменные, отвечающие за скорость мяча (главное, за ее направление)?
Yandex
Объявления
17.05.2012, 11:20     Отслеживание границ объектов (Арканоид)
Ответ Создать тему
Опции темы

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