Point2I GuiColorPickerCtrl::findColor(const ColorF & color, const Point2I& offset, const Point2I& resolution, GBitmap& bmp) { RectI rect; Point2I ext = getExtent(); if (mDisplayMode != pDropperBackground) { ext.x -= 3; ext.y -= 2; rect = RectI(Point2I(1, 1), ext); } else { rect = RectI(Point2I(0, 0), ext); } Point2I closestPos(-1, -1); /* Debugging char filename[256]; dSprintf( filename, 256, "%s.%s", "colorPickerTest", "png" ); // Open up the file on disk. FileStream fs; if ( !fs.open( filename, Torque::FS::File::Write ) ) Con::errorf( "GuiObjectView::saveAsImage() - Failed to open output file '%s'!", filename ); else { // Write it and close. bmp.writeBitmap( "png", fs ); fs.close(); } */ ColorI tmp; U32 buf_x; U32 buf_y; ColorF curColor; F32 val(10000.0f); F32 closestVal(10000.0f); bool closestSet = false; for (S32 x = rect.point.x; x <= rect.extent.x; x++) { for (S32 y = rect.point.y; y <= rect.extent.y; y++) { buf_x = offset.x + x + 1; buf_y = (resolution.y - (offset.y + y + 1)); buf_y = resolution.y - buf_y; //Get the color at that position bmp.getColor(buf_x, buf_y, tmp); curColor = (ColorF)tmp; //Evaluate how close the color is to our desired color val = mFabs(color.red - curColor.red) + mFabs(color.green - curColor.green) + mFabs(color.blue - curColor.blue); if (!closestSet) { closestVal = val; closestPos.set(x, y); closestSet = true; } else if (val < closestVal) { closestVal = val; closestPos.set(x, y); } } } return closestPos; }
void MainState::initFight(unsigned lvl) { log().log("Initialize main state."); while (_entities.root().firstChild().isValid()) _entities.destroyEntity(_entities.root().firstChild()); _fight.reset(new Fight(log(), *this, _rules, _player, lvl)); _damagePos[0] = Vector3(567, _camera.viewBox().max().y() - 120, .5); _damagePos[1] = Vector3(517, _camera.viewBox().max().y() - 120, .5); _damagePos[2] = Vector3(470, _camera.viewBox().max().y() - 92, .5); _damagePos[3] = Vector3(417, _camera.viewBox().max().y() - 78, .5); _damagePos[4] = Vector3(120, _camera.viewBox().max().y() - 70, .5); _bg = _entities.createEntity(_entities.root(), "bg"); _sprites.addComponent(_bg); _bg.sprite()->setSprite(&_bgSprite); _bg.place(Transform(Translation(Vector3(0, _camera.viewBox().max().y() - 480, -.99)))); _boss = createSprite(&_bossSprite[0], Vector3(240, _camera.viewBox().max().y() - 240, -.815), Vector2(-1, 1), "Boss"); // _boss = createSprite(&_bossSprite[1], // Vector3(240, _camera.viewBox().max().y() - 240, -.815), // Vector2(-1, 1), "Boss"); // _boss = createSprite(&_bossSprite[2], // Vector3(220, _camera.viewBox().max().y() - 240, -.815), // Vector2(-1, 1), "Boss"); Vector3 bhpPos(10, _camera.viewBox().max().y() - 22, 0); Vector3 bhpOffset(0, -22, 0); for(unsigned i = 0; i < 3; ++i) { _bossHealthFull[2-i] = createHealthBar(bhpPos + i * bhpOffset, 1); } Vector3 closestPos(_camera.viewBox().max().x() - 30, _camera.viewBox().max().y() - 240, -.8); Vector3 offset(-50, 14, -.01); // Vector3 namePos(250, 94, -0.01); Vector3 namePos(250, 22, -0.01); // Vector3 nameOffset(0, -24, 0); Vector3 nameOffset(0, 24, 0); Vector3 statusPos = namePos + Vector3(110, -4, 0); Vector3 statusOffset(16, 0, 0); Vector3 hpPos = namePos + Vector3(160, -8, 0); _maxPcHp = 0; for(PC& pc: _fight->party) { _maxPcHp = std::max(_maxPcHp, pc.hp); } for(unsigned pc = 0; pc < 4; ++pc) { _pc[pc] = createSprite(&_pcSprite[pc], closestPos + pc * offset, Vector2(-1, 1), _fight->party[pc].name.c_str()); createText(_fight->party[pc].name, namePos + pc * nameOffset); _pcMenu->setLabel(3 - pc, _fight->party[pc].name); _pcStatus[pc*NB_REAL_STATUS + 0] = createSprite(&_statusSprite, statusPos + pc * nameOffset + 0 * statusOffset); _pcStatus[pc*NB_REAL_STATUS + 0].sprite()->setIndex(0); _pcStatus[pc*NB_REAL_STATUS + 0].sprite()->setColor(Vector4(1, 1, 1, 0)); _pcStatus[pc*NB_REAL_STATUS + 1] = createSprite(&_statusSprite, statusPos + pc * nameOffset + 1 * statusOffset); _pcStatus[pc*NB_REAL_STATUS + 1].sprite()->setIndex(1); _pcStatus[pc*NB_REAL_STATUS + 1].sprite()->setColor(Vector4(1, 1, 1, 0)); _pcStatus[pc*NB_REAL_STATUS + 2] = createSprite(&_statusSprite, statusPos + pc * nameOffset + 2 * statusOffset); _pcStatus[pc*NB_REAL_STATUS + 2].sprite()->setIndex(2); _pcStatus[pc*NB_REAL_STATUS + 2].sprite()->setColor(Vector4(1, 1, 1, 0)); _pcHealthFull[pc] = createHealthBar(hpPos + pc * nameOffset, float(_fight->party[pc].hp) / _maxPcHp); } _pcMenu->layout(); _game->audio()->playMusic(_music1); updateMenu(); }