2010-08-17 14 views
0

Используя библиотеку Openframeworks в C++, у меня есть радиус свечения (max_distance), который определяется протяжением мыши, перемещающейся по экрану (mouseDragX). Он работает нормально.Как добавить/вычесть значение, а не просто это значение

Но не каждый раз, когда я изменяю его размер (перетаскивая мышью), я хочу, чтобы он не начинался с 0 и сразу же перетаскивал мышью.

max_distance = mouseDragX/2; 

Но скорее, если я уже перетащил мышь вправо, чтобы сказать 200 на предыдущей сопротивления, что в следующий раз, когда я перетащить мышью, и идти в противоположном направлении (отрицательные числа), что значение от max_distance уменьшается на , что сумма, а не просто быть этой суммой.

Я думал, что это будет

max_distance += mouseDragX/2; 

но кажется, что убить его вообще

Можете ли вы мне помочь?

#include "testApp.h" 


//-------------------------------------------------------------- 
void testApp::setup(){ 

ofSetWindowShape(700,700); 
max_distance = 700; // ofDist didn't work(?) // ofDist(0,0,700,700); 
ofEnableSmoothing(); 
ofEnableAlphaBlending(); 


} 

//-------------------------------------------------------------- 
void testApp::update(){ 
max_distance = mouseDragX/2; 
if (max_distance < 0) max_distance = 0; 
} 

//-------------------------------------------------------------- 
void testApp::draw(){ 


string str = "mouseDragX: "; 
str += ofToString(mouseDragX)+" "; 
ofSetWindowTitle(str); 

int i,j; 
int height = ofGetHeight(); 
int width = ofGetWidth(); 

for(i = 0; i <= height; i += 20) { 
    for(j = 0; j <= width; j += 20) { 
     float dist_color = getDistance(mouseX, mouseY, i, j); // for definition of getDistance, look below! 
     dist_color = dist_color/max_distance * 100; 

    // to get the colors into the range between 0 and 255, multiply the values by 5. 
    ofSetColor(dist_color*5,dist_color*5,dist_color*5, 123); 
    ofEllipse(i, j, 20, 20); 
    } 
    } 


} 

//-------------------------------------------------------------- 
void testApp::keyPressed (int key){ 

} 

//-------------------------------------------------------------- 
void testApp::keyReleased (int key){ 

} 

//-------------------------------------------------------------- 
void testApp::mouseMoved(int x, int y){ 
// shift values down 
for (int i = 0; i < 1; /*<<- length of array*/ i++) { 
pmouseX[i] = pmouseX[i+1]; 
pmouseY[i] = pmouseY[i+1]; 
} 
// make pmouseX/Y[0] be the previous mouse position. [1] = current 
pmouseX[1] = mouseX; 
pmouseY[1] = mouseY; 

} 

//-------------------------------------------------------------- 
void testApp::mouseDragged(int x, int y, int button){ 

mouseDragX = (mouseX - pmouseX[0]); 

} 

//-------------------------------------------------------------- 
void testApp::mousePressed(int x, int y, int button){ 
// mouseDragX = mouseDragY = 0; // The drag starts here 
} 

//-------------------------------------------------------------- 
void testApp::mouseReleased(){ 

} 

float testApp::getDistance(int startX, int startY, int endX, int endY){ 
return sqrt((endX-startX)*(endX-startX) + (endY-startY)*(endY-startY)); 
} 

Большое вам спасибо.

ответ

0

Если я правильно понимаю, вы хотите сделать что-то подобное.

// Every time the mouse *stops* moving, (say on mouse-up 
// message) save previous max_distance 
int base = max_distance; 

// when mouse moves 
max_distance = base + mouseDragX/2; 
+0

, который сохраняет память, которая на один шаг ближе, но вводит всевозможные причудливые действия. Вероятно, это правильный путь, но я просто не может понять, почему он не работает должным образом, тем более, что код настолько прост. :( Теперь я официально сдаюсь. –

0

Если max_distance и mouseDragX - значения int, то деление на 2 приводит к целочисленному делению, которое может вызывать потери.

Это особенно актуально, если значение mouseDragX равно 1. Это приведет к 1/2 (целочисленное деление) и возвращает 0.

Пример:

Позволяет учесть, что mouseDragX принимает 3 различные значения (3 цикла):

3, 1, -4 

Можно было бы ожидать, что max_distance будет увеличен на (3/2) + (1/2) - (4/2) = 0.

Но из-за целочисленного усечения это приведет к результату 1 + 0 - 2 = -1.

Что делать, если вы используете float s вместо int и просто округлите max_distance до объекта, когда вам действительно нужна его ценность?

+0

Это отличный совет. На практике визуально кажется, что нет заметной разницы. Но даже после вашего совета я все же не могу сделать max_distance аккумулятивным, а не просто перезаписанным mouseDragX :( –

Смежные вопросы