मैं टाइल्स के साथ काम नहीं करता लेकिन एसएफ :: वर्टेक्स के साथ खींचे गए क्यूब्स। प्रत्येक क्यूब्स में 6 अंक होते हैं जिनमें प्रत्येक 4 अंक होते हैं। 2 डी आइसोमेट्रिक - एसएफएमएल - सही सूत्र, गलत समन्वय रेंज
तो मुझे एक पक्ष चुनने के लिए बस cubes[numCube].sides()[numSide]....
होना है।
for(int J = 0; J < mapSize; J++)
{
for(int I = 0; I < mapSize; I++)
{
x = (J - I) * (cubeSize/2);
y = (J + I) * (cubeSize/4);
c = new cube(cubeSize, x, y, z, I, J);
cs.push_back(*c);
}
}
cube.cpp में मैं बनाने के पक्ष है, तो, sides.cpp में, मैं प्रत्येक अंक 'निर्देशांकों के इस तरह calcul:
switch(typeSide)
{
case 0://DOWN_SIDE
light = 1;
tmp_x = x + (size/2);
tmp_y = y + (size/2);
p0 = new point(tmp_x, tmp_y, tmp_z);
tmp_x = x + size;
tmp_y = y + (3 * (size/4));
p1 = new point(tmp_x, tmp_y, tmp_z);
tmp_x = x + (size/2);
tmp_y = y + size;
p2 = new point(tmp_x, tmp_y, tmp_z);
tmp_x = x;
tmp_y = y + (3 * (size/4));
p3 = new point(tmp_x, tmp_y, tmp_z);
break;
case 1://BACK_LEFT_SIDE
//ETC. ....
प्वाइंट
मैं क्यूब्स layer.cpp बनाने सीपीपी:
/*
* point.cpp
*
* Created on: 21 nov. 2015
* Author: user
*/
#include "point.h"
point::point(float tx, float ty, float tz)
{
coords* dummyVar = new coords(tx, ty, tz);
coordinates = dummyVar;
}
std::vector<float> point::position()//Use : myPoint.getPosition[0] //get the x
{
std::vector<float> dummyVar;
dummyVar.push_back(coordinates->getX());
dummyVar.push_back(coordinates->getY() - coordinates->getZ());
return dummyVar;
}
void point::move(float tx, float ty, float tz)
{
coordinates->setX(tx);
coordinates->setY(ty);
coordinates->setZ(tz);
}
मेरे समस्या समारोह मैं पता लगाने के लिए उपयोग करने से आते क्लिक:
012,351,if (event.type == sf::Event::MouseMoved)
{
currentSelectedCube = maps[currentMapID].getCubeIDAt(event.mouseMove.x, event.mouseMove.y, offsetLeft, offsetTop, enableOffset);
}
समारोह (टिप्पणियों के साथ परेशान नहीं है):
मैं 'पाश के लिए' बिना मेरे घन वेक्टर में एक घन के प्रवेश प्राप्त करने की कोशिश। क्यों? जब मैं क्लिक करता हूं तो कम CPU का उपयोग करने के लिए।
int map::getCubeIDAt(float x, float y, int offsetLeft, int offsetTop, bool enableOffset)//WIP ! //USED FOR CLICK DETECTION ON CUBES
{
//----------------------------------------------------------------//
int unsigned entry = -1;
int I = 0;
int J = 0;
//----------------------------------------------------------------//
if(currentLayerId() > -1)//If there is any layers
{
//IF CHECK IN MAP BOUDING BOX + ROTATION TO GOT DIAMOND SHAPE AREA(LAYER + OFFSETS)----------------------------------
//{
if(!enableOffset)//With offsets disabled
{
I = (y * 2 - x)/cubeSize;
J = (y * 2 + x)/cubeSize;
}
else //With offsets enabled
{
I = (((y-offsetTop)+(currentLayerId()*(cubeSize/2))) * 2 - (x-offsetLeft))/cubeSize;
J = (((y-offsetTop)+(currentLayerId()*(cubeSize/2))) * 2 + (x-offsetLeft))/cubeSize;
}
entry = I + J * size;
if (entry < 0 || entry >= layers()[currentLayerId()].cubes().size())
{
entry = -1;
}
else//DEBUG - DISPLAYING VALUES FOR TEST
{
std::cout << "Entry n°" << entry << " - ";
std::cout << "[" << I << "; " << J << "]" << std::endl;
}
//}
//END IF CHECK IN MAP BOUDING BOX + ROTATION TO GOT DIAMOND SHAPE AREA(LAYER + OFFSETS)----------------------------------
}
return entry;
}
मैं-जम्मू और entryNumber ठीक हैं। मेरा मतलब है, उदाहरण के लिए, घन 0 के लिए, मेरे पास I = 0 है; जे = 0; आदि ... यह काम कर रहा है।
मुझे समझ नहीं आता क्यों समन्वय रेंज लाल हिस्सा की तरह है इस तस्वीर में (100% पर सही नहीं, मैं एक पेंट प्रतिभाशाली हा हा नहीं कर रहा हूँ):
लेकिन मैं उसे प्राप्त करना चाहिए (दूसरी तस्वीर - लाल भाग वह जगह है जहां मैं क्लिक करता हूं):
लेकिन कुछ चेक के बाद, आईजे और प्रविष्टि मुझे मिलती है। यह बहुत अजीब है।
EDIT2: ऑफसेट और परत संख्या लागू किया। समस्या शेष: गलत निर्देशांक सीमा।
void GRAPHICS_HANDLER::listenEvents()
{
while (window->pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
window->close();
}
if(event.type == sf::Event::KeyPressed)
{
//DISPLAY/UNDISPLAY GRID -- DEBUG FUNCTION
if(event.key.code == sf::Keyboard::Escape)
{
if(grid)
grid = false;
else
grid = true;
}
//-----------------------------------------------------------------------------------DEBUG---------------------------------------------------------------//
if(event.key.code == sf::Keyboard::B)//ACTIVE BRUSHMODE -- NEED TO BLOCK IT WHEN ACCESS VIOLATION OF CUBES ARRAY(CRASH)
{
if(!brushMode)
{
brushMode = true;
std::cout << "Brush mode enabled" << std::endl;
}
else
{
brushMode = false;
std::cout << "Brush mode disabled" << std::endl;
}
}
if(event.key.code == sf::Keyboard::L)//ADD_LAYER
{
addLayer(getCurrentMapID());
}
if(event.key.code == sf::Keyboard::M)//DELETE_LAYER
{
deleteLayer(currentMapID, maps[currentMapID].currentLayerId());
}
if(event.key.code == sf::Keyboard::S)//ADD_LAYER
{
std::cout << "Select a texture: ";
std::cin >> currentSelectedTexture; std::cout << std::endl;
}
if(event.key.code == sf::Keyboard::Left)//Move in Layer
{
if(maps[currentMapID].currentLayerId() > 0)
{
maps[currentMapID].setCurrentLayerID(maps[currentMapID].currentLayerId()-1);
}
}
if(event.key.code == sf::Keyboard::Right)//Move in Layer
{
if(maps[currentMapID].currentLayerId() < maps[currentMapID].layers().size()-1)
{
maps[currentMapID].setCurrentLayerID(maps[currentMapID].currentLayerId()+1);
}
}
//-----------------------------------------------------------------------------------DEBUG---------------------------------------------------------------//
}
if (event.type == sf::Event::MouseMoved)
{
//--------------------------------------------------------------------------CURSOR-----------------------------------------------------------------------//
currentSelectedCube = maps[currentMapID].getCubeIDAt(event.mouseMove.x, event.mouseMove.y, offsetLeft, offsetTop, enableOffset);
//--------------------------------------------------------------------------CURSOR-----------------------------------------------------------------------//
}
if (event.type == sf::Event::MouseButtonPressed)
{
//--------------------------------------------------------------------------CURSOR-----------------------------------------------------------------------//
currentSelectedCube = maps[currentMapID].getCubeIDAt(event.mouseButton.x, event.mouseButton.y, offsetLeft, offsetTop, enableOffset);
//--------------------------------------------------------------------------CURSOR-----------------------------------------------------------------------//
if (event.mouseButton.button == sf::Mouse::Left)
{
//--------------------------------------------------------------------------CUBE CLICK DETECTION--------------------------------------------------//
if(maps.size() > 0 && maps[currentMapID].layers().size() > 0 && currentSelectedCube > -1)
{
cubeClicked = true;
}
}
if (event.mouseButton.button == sf::Mouse::Right)
{
if(maps.size() > 0 && maps[currentMapID].layers().size() > 0 && currentSelectedCube > -1)
{
maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes()[currentSelectedCube].setTexture(1);
}
}
//--------------------------------------------------------------------------CUBE CLICK DETECTION--------------------------------------------------//
}
}
}
EDIT3: मैं कर सकता हूँ मैं मुझे घन के केवल नीचे की ओर आकर्षित करने के लिए अनुमति देने के लिए मेरे कोड अद्यतन, इसलिए
बस मामले में, इस 'समारोह' से निपटने की घटनाओं है यह (घास):
समन्वय सीमा (स्क्रीनशॉट में पहले दिखाया गया लाल आइसोमेट्रिक वर्ग) थोड़ा सा बदलता है जब मैं फ्लैट वर्ग (हरा) डालता हूं। मुझे नहीं पता कि क्यों, मैं इसे सटीक करना पसंद करता हूं, बस मामले में।,
एक ही स्क्रीन निर्देशांक:
मैंने पहले से ही "ऊंचाई" सेट किया है, मेरे सभी कोड में, "ऊंचाई" परत संख्या है। मुझे केवल आई/जे गणना को सही करने की आवश्यकता है। – Madz
आपके उत्तर के लिए धन्यवाद, दुर्भाग्य से, मुझे नहीं पता कि यह अंग्रेजी कौशल या कोडिंग (गणित?) की कमी के कारण है, लेकिन मुझे यह समझने की ज़रूरत नहीं है। मैं उस हिस्से को समझ गया जो मुझे उस चेहरे को छोड़ना पड़ा जो प्रदर्शित नहीं होगा, लेकिन नोड क्या है? – Madz
@Madz अपने कोड से, आप दो घन I और J से अपने चरम के x, y निर्देशांक की गणना करने वाले प्रत्येक घन को बनाते हैं। इसलिए प्रत्येक जोड़े के indeces (I, J) एक घन परिभाषित करते हैं। आपके चित्रों (और खानों) में प्रत्येक त्रिभुज या चतुर्भुज टाइल के प्रत्येक चरम पर कुछ indeces (I, J) से मेल खाते हैं। आप जो गणित कर रहे हैं वह उन मानों को स्क्रीन निर्देशांक और पीछे की तरफ बदलना है। –