Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
florgas
5 / 4 / 0
Регистрация: 28.09.2010
Сообщений: 345
#1

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

29.12.2012, 12:31. Просмотров 235. Ответов 4
Метки нет (Все метки)

Всем привет. Пишу свою первую программу-игру на с++ с использованием 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 12:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Условие if не становится истиным (C++):

Дано число в двоичном виде. Умножить его на 16. результат перевернуть следующим образом: нулевой разряд становится седьмым, 1-ый становится 6-ым и т - Assembler
Дано число в двоичном виде. Умножить его на 16. результат перевернуть следующим образом: нулевой разряд становится седьмым, 1-ый становится...

Составить программу,печатующую значение TRUE ,если указанное высказывание ,является истиным и FALSE в противном случае: - Pascal ABC
сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр!

Условие if. Как сделать повтор выполнения if-а, если условие не удовлетворяет требованиям в данный момент - C#
Суть вопроса такова. В процессе работы программы запускается несколько потоков. Один из них выполняет бесконечный цикл, в котором каждую...

Условие в Delphi 2010, нужно сделать условие на TDBEDIT - Delphi БД
Подскажите пожалуйста, у меня есть два эдита и одна кнопка, мне нужно сделать условие что при нажатии на кнопку, если эдиты пустые выдавал...

Почему выполняется условие else, если выполнилось условие if? - JavaScript
При вводе буквы, которое есть в переменной word, по идеи, если такой буквы нету, то должно выдать сообщение, то, что **Такой буквы нету**. ...

Условие в условие - отправка на почту текста - PHP
На сайте в html - форма &lt;/br&gt; &lt;h1&gt;Оборудование&lt;/h1&gt; &lt;/br&gt; &lt;table id=&quot;table_container&quot;&gt; &lt;tr id=&quot;tr_image_&quot;...

4
Eugine
3 / 3 / 0
Регистрация: 10.11.2012
Сообщений: 63
29.12.2012, 12:41 #2
А вы не пробовали с типом double, даже fabs возвращает double
0
Kuzia domovenok
1952 / 1805 / 140
Регистрация: 25.03.2012
Сообщений: 6,248
Записей в блоге: 1
29.12.2012, 12:46 #3
не удивительно, что не работает. игрок при нажатии клавиши перемещается с дискретностью 0,01
А проверка на совпадение происходит тоже с такой точностью. крайне вероятно, что игрок просто не может позиционировать себя с достаточной точностью.
0
florgas
5 / 4 / 0
Регистрация: 28.09.2010
Сообщений: 345
29.12.2012, 12:52  [ТС] #4
А можете написать более простыми словами, а то не очень понятно что делать
0
Kuzia domovenok
1952 / 1805 / 140
Регистрация: 25.03.2012
Сообщений: 6,248
Записей в блоге: 1
29.12.2012, 19:57 #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 не меньше.
0
29.12.2012, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2012, 19:57
Привет! Вот еще темы с ответами:

Флешка не становится загрузочной - Flash-память
Несколько раз делал загрузочную флешку с 7 виндой, последний раз когда делал вылетела ошибка и теперь при старте с флешки ничего не...

Картинка не становится адаптивной - HTML, CSS
Загрузил сайт на хостинг появилась такая проблема пропала адаптивность некоторых картинок. На главной странице работает а на этой странице...

DBLookupComboBox становится неактивным - Delphi БД
Есть таблица, в ней столбец который хочу запихать в DBLookupComboBox сделал ADOQuery отдельный т.к. другая таблица и DataSource тоже новый...

Текст становится ссылкой - Удаление вирусов
На многих страницах обычный текст становит синим, как на картинке и при наведении мышью появляется рекламное окошко. Антивирус...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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