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

Условие if не становится истиным - C++

Восстановить пароль Регистрация
 
florgas
 Аватар для florgas
5 / 4 / 0
Регистрация: 28.09.2010
Сообщений: 339
29.12.2012, 12:31     Условие if не становится истиным #1
Всем привет. Пишу свою первую программу-игру на с++ с использованием OpenGL.
Ситуация такая: необходимо сравнить координаты по x и координаты по y, и если они окажутся одновременно равными, то переменной ColorMobR присвоить значение 1.0. Так проблема в том, что когда в момент игры я игроков наезжаю на моба (по сути координаты должны совпасть, хотя кто знает..), условие не становится истинным. Если вместо условия подставить if(1), то код выполняется. не могу найти ошибку. Были предположения, что это из-за проблемы с float, так как они не всегда равны и т.п., но я не знаю. Прошу помощи. Код ниже:
Функция сравнения координат:
C++
1
2
3
4
5
/* Пересечение игрока и моба */
void GamerOnMob(){
    if(fabs(gamer_x-mob_x) < 0.01 && fabs(gamer_y - mob_y) < 0.01){
                    ColorMobR = 1.0;
                }
Весь код игры:
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
#include <time.h>
#include <Windows.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <cstdio>
#include <cmath>
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"opengl32.lib")
#pragma comment (lib, "glaux.lib")
int dir;
float gamer_x=0, gamer_y=0, gamer_z=0, mob_x=0.03, mob_y=0.03, mob_z=0.03, ColorMobR=0.0, ColorMobG=0.0, ColorMobB=0.0;
GLuint gamingtxt;
 
/*GLuint LoadBMP(const char *fmt, ...)
{
    GLuint t;
    char filename[256];
    va_list ap;
    va_start(ap, fmt);
    vsprintf_s(filename, fmt, ap);
    va_end(ap);
 
    AUX_RGBImageRec *texture = auxDIBImageLoadA(filename);
    glGenTextures(1, &t);
    glBindTexture(GL_TEXTURE_2D, t);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture->sizeX, texture->sizeY, 0,
    GL_RGB, GL_UNSIGNED_BYTE, texture->data);
    
    return t;    
}*/
 
void display(void) { 
glClear (GL_COLOR_BUFFER_BIT);
/* Игрок */ 
glColor3f (1.0, 1.0, 1.0); 
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, gamingtxt);
glBegin(GL_POLYGON); 
glTexCoord2d(0, 0); glVertex3f (gamer_x, gamer_y, gamer_z + 0.0); 
glTexCoord2d(1, 0); glVertex3f (gamer_x + 0.03, gamer_y, gamer_z + 0.0); 
glTexCoord2d(1, 1); glVertex3f (gamer_x + 0.03, gamer_y + 0.03, gamer_z + 0.0); 
glTexCoord2d(0, 1); glVertex3f (gamer_x, gamer_y + 0.03, gamer_z + 0.0);
glEnd();
 
/* Противники */
glColor3f (ColorMobR, ColorMobG, ColorMobB); 
glBegin(GL_POLYGON); 
glVertex3f (mob_x + 0.22, mob_y + 0.22, mob_z + 0.0); 
glVertex3f (mob_x + 0.25, mob_y + 0.22, mob_z + 0.0); 
glVertex3f (mob_x + 0.25, mob_y + 0.25, mob_z + 0.0); 
glVertex3f (mob_x + 0.22, mob_y + 0.25, mob_z + 0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
} 
 
/* Движение мобов */
void MobMotion(){
    int RandomNumber = rand()%4;
    switch(RandomNumber)
    {
        case 0 :  mob_x-=0.01; break;
        case 1 :  mob_y+=0.01; break;
        case 2 :  mob_x+=0.01; break;        
        case 3 :  mob_y-=0.01; break;
    }
}
 
/* Пересечение игрока и моба */
void GamerOnMob(){
    if(fabs(gamer_x-mob_x) < 0.01 && fabs(gamer_y - mob_y) < 0.01){
                    ColorMobR = 1.0;
                }
}
 
/* Ограничение перемещения размерами экрана */
void Screen(){
    if(gamer_x>0.97){
            gamer_x = 0.97;
            }
    if(gamer_x<-1){
            gamer_x = -1;
            }
    if(gamer_y>0.97){
            gamer_y = 0.97;
            }
    if(gamer_y<-1){
            gamer_y = -1;
            }
    if(mob_x>0.97){
            mob_x = 0.97;
            }
    if(mob_x<-1){
            mob_x = -1;
            }
    if(mob_y>0.97){
            mob_y = 0.97;
            }
    if(mob_y<-1){
            mob_y = -1;
            }           
}
 
/* Функция времени */
void Timer(int){
    display();
    Screen();
    GamerOnMob();
    glutTimerFunc(10, Timer, 0);
}
 
/* Функция времени мобов*/
void TimerMob(int){ 
    //MobMotion();
    glutTimerFunc(100, TimerMob, 0);
}
 
/* Функция считывания нажатия клавиш и перемещения игрока */
void KeyboardEvent(int key, int a, int b)
{   
    switch(key)
    {
        case 100 :  gamer_x-=0.01; break;
        case 101 :  gamer_y+=0.01; break;
        case 102:   gamer_x+=0.01; break;        
        case 103 :  gamer_y-=0.01; break;
    }
}
 
/* Определим параметры окна */ 
int main(int argc, char** argv) 
{ 
glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
glutInitWindowSize (800, 800); 
glutInitWindowPosition (100, 100); 
glutCreateWindow ("Game v0.1"); 
glClearColor (0.0,0.4,0.0,0.0); 
//gamingtxt = LoadBMP("texture.bmp");
glutDisplayFunc(display); 
glutTimerFunc(10, Timer, 0);
glutTimerFunc(100, TimerMob, 0);
glutSpecialFunc(KeyboardEvent);
glutMainLoop(); 
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 12:31     Условие if не становится истиным
Посмотрите здесь:

C++ Определение k, при котором функция становится меньше заданного числа
C++ Условие
Условие в while C++
C++ условие
C++ Какая из этих переменных становится указателем при выполнении следующего фрагмента кода
Определить, становится ли симметричной (относительно главной диагонали) заданная матрица после замены на число 0 каждого локального максимума. Локальн C++
Условие C++
При возведении числа в степень оно становится равным Nan C++
C++ Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции
Доказать программно, что любая последовательность сумм кубов всех цифр элемента становится постоянной C++
C++ Когда приравниваю переменную к функции, переменная становится равна нулю

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Eugine
 Аватар для Eugine
3 / 3 / 0
Регистрация: 10.11.2012
Сообщений: 63
29.12.2012, 12:41     Условие if не становится истиным #2
А вы не пробовали с типом double, даже fabs возвращает double
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
29.12.2012, 12:46     Условие if не становится истиным #3
не удивительно, что не работает. игрок при нажатии клавиши перемещается с дискретностью 0,01
А проверка на совпадение происходит тоже с такой точностью. крайне вероятно, что игрок просто не может позиционировать себя с достаточной точностью.
florgas
 Аватар для florgas
5 / 4 / 0
Регистрация: 28.09.2010
Сообщений: 339
29.12.2012, 12:52  [ТС]     Условие if не становится истиным #4
А можете написать более простыми словами, а то не очень понятно что делать
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
29.12.2012, 19:57     Условие if не становится истиным #5
Цитата Сообщение от florgas Посмотреть сообщение
if(fabs(gamer_x-mob_x) < 0.01 && fabs(gamer_y - mob_y) < 0.01)
просто попробуй заменить 0,01 в этом условии на большее число. Возможно проблема в том, что это неравенство так и не достигается. В первом кадре разность Х равна 0,01 во втором уже -0,01 и так мы проскочили условие срабатывания.
А если чудом не проскочили по Х, то проскочили по У, т.к. они ОДНОВРЕМЕННО должны совпасть с целью!
Возможно из-за того, что х изменяется тоже на 0,01 не меньше.
Yandex
Объявления
29.12.2012, 19:57     Условие if не становится истиным
Ответ Создать тему
Опции темы

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