Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - .:NOXY:.

Strony: 1 2 3 4 [5] 6 7 8 9 ... 53
61
Szkółka / Odp: OpenGL ale jaki?
« dnia: Sierpień 21, 2014, 14:20:20 »
3.X jak najbardziej bo jego API jest niemal identycznie jak ES 2.0, ES 3.0 wiec masz za free przeskok na mobilne. (Rożnicę tak naprawdę w nazwach funkcji VAO i nagłówkach)

62
Szkółka / Odp: Połączenie PC ze smartphone'm przez wifi
« dnia: Sierpień 21, 2014, 12:42:08 »
Poczytaj sobie o Bonjour to jest protokol bezkonfiguracyjnego polaczenia afaik jest opensource wiec pojdzie i na czeskiej pralce. Implementowalem to w postaci o jakiej mowisz i dziala. Zero ustawiania na kompie smiga applikacja na ktora sie przezucalo dane (mp3, avi, tekst na zasadzie ctrl c/v), w telefonie appka ktora odbierala te dane. Wystarczylo ze telefon byl w sieci wifi takiej samej i automatycznie owe dane odbieral.

63
Poczytaj sobie o billboardingu tam obiekty są zwrócone zawsze tak aby patrzyły w stronę kamery wtedy jeżeli twoja translacja będzie taka ze osie się zrównają a odległość będzie odpowiednia efekt będzie dokładnie taki jak opisałeś.

LINK1
LINK2

Czyli głownie interesuje cie to:

a = position - ((right + up) * scale);
b = position + ((right - up) * scale);
c = position + ((right + up) * scale);
d = position - ((right - up) * scale);

Gdzie abcd to wieszchołki quada który jest zwrócony do kamery jak będziesz mieć kamerę w (0,0,0) a quada w (0,0,-2) to będą na siebie patrzeć na wprost.

64
C++ / Odp: C++14 wypuszczone
« dnia: Sierpień 20, 2014, 12:19:50 »
To jest takie C++11 tylko ze więcej nowości? Spoko działy HR znowu będą mogły wpisać ze szukają inżynierów z 5letnim doświadczeniem ;)

65
DabLang! :D

66
OpenGL / Odp: Normal mapping - problem
« dnia: Lipiec 26, 2014, 19:39:17 »
Ah no tak! @Adam27 dobrze prawi wpierw zamień World z Mat4x4 na Mat3x3 to powinno załatwić problem.

67
OpenGL / Odp: Normal mapping - problem
« dnia: Lipiec 26, 2014, 11:48:45 »
Co podajesz w World ? to powinna być macierz normalnych (dokladnie inverted transpose macierzy world) a nie modelu, i bi normalna to jest cross (T,N) nie trzeba jej liczyć no i może masz winding ? i trzeba przemnażać przez W jednak?

68
Justin Heyes-Jones napisał kiedys fajna implementacje A* na STL:

//fsa.h
http://wklej.org/id/1421720/

//stlastar.h
http://wklej.org/id/1421722/

Implementujesz sobie tylko takie coś zmodyfikowane pod Hexy:


#ifndef _MAP_SEARCH_NODE_H_
#define _MAP_SEARCH_NODE_H_

#if TARGET_OS_IPHONE
#import <Foundation/Foundation.h>
#else
#import <Cocoa/Cocoa.h>
#endif

#include "stlastar.h"

#include <iostream>
#include <math.h>

#define MAX_ACTIVE_LAYERS 2

typedef struct TTile{
    int tile_x[MAX_ACTIVE_LAYERS],tile_y[MAX_ACTIVE_LAYERS]; //Tile
    int pos_x,pos_y; //position
   
    bool active[MAX_ACTIVE_LAYERS];
   
    int Cost; // 0-8 cost of move
    bool Lock;
    bool isRoad;
   
    bool tempLock; //temporary lock for A star
    bool UnitLock; //for non temp lock
   
    bool AttackHEX;
    bool CompareHEX;
} TTile;


extern TTile** _mapwsk;
extern int GetMap( int x, int y );
extern int MAP_WIDTH,MAP_HEIGHT;

class MapSearchNode
{
public:
unsigned int x; // the (x,y) positions of the node
unsigned int y;

MapSearchNode() { x = y = 0; }
MapSearchNode( unsigned int px, unsigned int py ) { x=px; y=py; }
   
float GoalDistanceEstimate( MapSearchNode &nodeGoal );
bool IsGoal( MapSearchNode &nodeGoal );
bool GetSuccessors( AStarSearch<MapSearchNode> *astarsearch, MapSearchNode *parent_node );
float GetCost( MapSearchNode &successor );
bool IsSameState( MapSearchNode &rhs );
   
void PrintNodeInfo();
   
   
};

#endif

#import "MapSearchNode.h"

TTile** _mapwsk = nil;
int MAP_WIDTH = 0;
int MAP_HEIGHT = 0;

int GetMap( int x, int y )
{
    if( x < 0 ||
       x >= (MAP_WIDTH-1) ||
       y < 0 ||
       y >= (MAP_HEIGHT-1)
       )
{
return 9;
}
   
    int retval = (_mapwsk[x][y].Lock||_mapwsk[x][y].tempLock) ? 9 : _mapwsk[x][y].Cost;
     
return retval;
}

bool MapSearchNode::IsSameState( MapSearchNode &rhs )
{
   
// same state in a maze search is simply when (x,y) are the same
if( (x == rhs.x) &&
       (y == rhs.y) )
{
return true;
}
else
{
return false;
}
   
}

void MapSearchNode::PrintNodeInfo()
{
NSLog(@"Node position : ( %d, %d ) \n",x,y);
}

// Here's the heuristic function that estimates the distance from a Node
// to the Goal.

float MapSearchNode::GoalDistanceEstimate( MapSearchNode &nodeGoal )
{
float xd = fabs(float(((float)x - (float)nodeGoal.x)));
float yd = fabs(float(((float)y - (float)nodeGoal.y)));
   
return sqrtf(xd + yd);
}

bool MapSearchNode::IsGoal( MapSearchNode &nodeGoal )
{
   
if( (x == nodeGoal.x) &&
       (y == nodeGoal.y) )
{
return true;
}
   
return false;
}

// This generates the successors to the given Node. It uses a helper function called
// AddSuccessor to give the successors to the AStar class. The A* specific initialisation
// is done for each node internally, so here you just set the state information that
// is specific to the application
bool MapSearchNode::GetSuccessors( AStarSearch<MapSearchNode> *astarsearch, MapSearchNode *parent_node )
{
   
int parent_x = -1;
int parent_y = -1;
   
if( parent_node )
{
parent_x = parent_node->x;
parent_y = parent_node->y;
}

MapSearchNode NewNode;
   
// push each possible move except allowing the search to go backwards
   

if( (GetMap( x+1, y ) < 9)
       && !((parent_x == x+1) && (parent_y == y))
       )
{
NewNode = MapSearchNode( x+1, y);
astarsearch->AddSuccessor( NewNode );
}
   
    if( (GetMap( x-1, y) < 9)
       && !((parent_x == x-1) && (parent_y == y))
       )
{
NewNode = MapSearchNode( x-1, y);
astarsearch->AddSuccessor( NewNode );
}
   
    if(x % 2){
        //nie parzysty
       
        if( (GetMap( x+1, y+1 ) < 9)
           && !((parent_x == x+1) && (parent_y == y+1))
           )
        {
            NewNode = MapSearchNode( x+1, y+1);
            astarsearch->AddSuccessor( NewNode );
        }
       
        if( (GetMap( x-1, y+1) < 9)
           && !((parent_x == x-1) && (parent_y == y+1))
           )
        {
            NewNode = MapSearchNode( x-1, y+1);
            astarsearch->AddSuccessor( NewNode );
        }
       
    }
    else{
        //parzysty
       
        if( (GetMap( x+1, y-1 ) < 9)
           && !((parent_x == x+1) && (parent_y == y-1))
           )
        {
            NewNode = MapSearchNode( x+1, y-1);
            astarsearch->AddSuccessor( NewNode );
        }
       
        if( (GetMap( x-1, y-1) < 9)
           && !((parent_x == x-1) && (parent_y == y-1))
           )
        {
            NewNode = MapSearchNode( x-1, y-1);
            astarsearch->AddSuccessor( NewNode );
        }

    }
   
    if( (GetMap( x+2, y ) < 9)
       && !((parent_x == x+2) && (parent_y == y))
       )
{
NewNode = MapSearchNode( x+2, y );
astarsearch->AddSuccessor( NewNode );
}
   
    if( (GetMap( x-2, y ) < 9)
       && !((parent_x == x-2) && (parent_y == y))
       )
{
NewNode = MapSearchNode( x-2, y );
astarsearch->AddSuccessor( NewNode );
}

    return true;
}

// given this node, what does it cost to move to successor. In the case
// of our map the answer is the map terrain value at this node since that is
// conceptually where we're moving

float MapSearchNode::GetCost( MapSearchNode &successor )
{
return (float) GetMap( x, y );
   
}

No i mozna smigac:

//SETUP:

-(void) SetUpX:(int)x andY:(int)y RenderX:(int) Rx RenderY:(int) Ry
{
    MaxX = x;
    MaxY = y;
    RenderX = Rx;
    RenderY = Ry;
   
    DrawOffsetX = Rx;
    DrawOffsetY = Ry;
       
    MapTiles = new TTile*[MaxX];
    for(int i=0; i<MaxX; i++){
        MapTiles[i] = new TTile[MaxY];
    }
   
    for(int ax=0; ax<MaxX; ax++){
    for(int ay=0; ay<MaxY; ay++){
   
        //calculate first drawpositions
        if(ax%2){
           MapTiles[ax][ay].pos_y = ay*94;
        }
        else{
           MapTiles[ax][ay].pos_y = ay*94-47;
        }
       
           MapTiles[ax][ay].pos_x = (ax*32)-32;
       
        for(int a=0; a<MAX_ACTIVE_LAYERS; a++){
            MapTiles[ax][ay].tile_x[a] = 0;//rand() % 4;
            MapTiles[ax][ay].tile_y[a] = 0;
            MapTiles[ax][ay].active[a] = false;
        }
       
        MapTiles[ax][ay].UnitLock = false;
        MapTiles[ax][ay].tempLock = false;
        MapTiles[ax][ay].Cost = 1; //always lowest cost
   
        MapTiles[ax][ay].Lock = false;
        MapTiles[ax][ay].isRoad = false;
        MapTiles[ax][ay].AttackHEX = false;
        MapTiles[ax][ay].CompareHEX = false;
    }}
   
   
    _mapwsk = MapTiles;
   
    MAP_WIDTH = MaxX;
    MAP_HEIGHT = MaxY;
   
    AStarWay.clear();
}

//RYSOWANIE:

-(void) Draw
{
    xVec2 CPos;
   
    offX = MAX((SX/32.0),0);
    offY = MAX((SY/94.0),0);
   
    FX = (DrawOffsetX)+offX;
    FY = (DrawOffsetY)+offY;
   
    if(FX > MaxX) FX = MaxX;
    if(FY > MaxY) FY = MaxY;
   
    for(int ax=offX; ax<FX; ax++){
    for(int ay=offY; ay<FY; ay++){
     
       
            CPos = xVec2(MapTiles[ax][ay].pos_x-SX,MapTiles[ax][ay].pos_y-SY);
            CPos = (CPos * Scale) - (xVec2(32.0,32.0) * (1.0-Scale));
       
            [Layer[0] SetAnimX:MapTiles[ax][ay].tile_x[0] AnimY:MapTiles[ax][ay].tile_y[0]];
            [Layer[0] RenderatPos:CPos Angle:0 Scale:Scale];
#if TARGET_OS_IPHONE     
            if(MapTiles[ax][ay].isRoad){
                if(MapTiles[ax][ay].Lock){
                    [Road SetAnimX:1 AnimY:0];
                    [Road RenderatPos:CPos Angle:0 Scale:Scale];
                }
                else{
                    [Road SetAnimX:1 AnimY:1];
                    [Road RenderatPos:CPos Angle:0 Scale:Scale];
                }
            }
           
          if(MapTiles[ax][ay].AttackHEX){
              [Road SetAnimX:2 AnimY:0];
              [Road RenderatPos:CPos Angle:0 Scale:Scale];
          }
#else
        if(!HIDELOCK){
            if(MapTiles[ax][ay].Lock){
                [Road SetAnimX:1 AnimY:0];
                [Road RenderatPos:CPos Angle:0 Scale:Scale];
            } 
        }
#endif
           
#ifdef TEXT
            [MainMatrixPool SetIdentity];
            sprintf(sbuff, "%d,%d",ax,ay);
            loc = sbuff;             
            MainMatrixPool->FontColor = FGLBlue;
            MainMatrixPool->bias = 0.2;
            MainFontManager->GetFont(0)->print(loc, CPos.x+15, CPos.y+25, 0);
#endif
           
       
    }}
   
    CPos = ((SelectedPoint-xVec2(SX,SY)) * Scale) - (xVec2(32.0,32.0) * (1.0-Scale));
    [Road SetAnimX:0 AnimY:0];
    [Road RenderatPos:CPos Angle:0 Scale:Scale];
       
    if(!AStarWay.empty()){
        for(int i=0; i<AStarWay.size(); i++){
            CPos = ((xVec2(MapTiles[(int)AStarWay[i].x][(int)AStarWay[i].y].pos_x,
                           MapTiles[(int)AStarWay[i].x][(int)AStarWay[i].y].pos_y)-xVec2(SX,SY)) * Scale) - (xVec2(32.0,32.0) * (1.0-Scale));
            [Road SetAnimX:0 AnimY:0];
            [Road RenderatPos:CPos Angle:0 Scale:Scale];
           
        }
    }

    if(Layer[1]){
        for(int ax=offX; ax<FX; ax++){
            for(int ay=offY; ay<FY; ay++){
               
                if(MapTiles[ax][ay].active[1]){
                   
                    CPos = xVec2(MapTiles[ax][ay].pos_x-SX,MapTiles[ax][ay].pos_y-SY);
                    CPos = (CPos * Scale) - (xVec2(32.0,32.0) * (1.0-Scale));
                   
                    [Layer[1] SetAnimX:MapTiles[ax][ay].tile_x[1] AnimY:MapTiles[ax][ay].tile_y[1]];
                    [Layer[1] RenderatPos:CPos Angle:0 Scale:Scale];
                }
               
            }}
    }

    CPos = ((TestVec-xVec2(SX,SY)) * Scale) - (xVec2(32.0,32.0) * (1.0-Scale));
    [Road SetAnimX:0 AnimY:1];
    [Road RenderatPos:CPos Angle:0 Scale:Scale];
   
}

//Wyliczanie A*

-(bool) CanMove:(xVec2)vecStart to:(xVec2)vecEnd
{
    nodeStart.x = vecStart.x;
    nodeStart.y = vecStart.y;
    nodeEnd.x = vecEnd.x;
    nodeEnd.y = vecEnd.y;

    if((int)nodeStart.x < 0 ) nodeStart.x = 0;
    if((int)nodeStart.y < 0 ) nodeStart.y = 0;
    if(nodeStart.x >= MAP_WIDTH) nodeStart.x = MAP_WIDTH-1;
    if(nodeStart.y >= MAP_HEIGHT) nodeStart.y = MAP_HEIGHT-1;
   
    if((int)nodeEnd.x < 0 ) nodeEnd.x = 0;
    if((int)nodeEnd.y < 0 ) nodeEnd.y = 0;
    if(nodeEnd.x >= MAP_WIDTH) nodeEnd.x = MAP_WIDTH-1;
    if(nodeEnd.y >= MAP_HEIGHT) nodeEnd.y = MAP_HEIGHT-1;
   
    SelectedPoint.x = MapTiles[nodeStart.x][nodeStart.y].pos_x;
    SelectedPoint.y = MapTiles[nodeStart.x][nodeStart.y].pos_y;

    EndPoint.x = MapTiles[nodeEnd.x][nodeEnd.y].pos_x;
    EndPoint.y = MapTiles[nodeEnd.x][nodeEnd.y].pos_y;
   
    if(!MapTiles[nodeEnd.x][nodeEnd.y].isRoad) return false;
    if(MapTiles[nodeEnd.x][nodeEnd.y].Lock) return false;

    bool result = false;
   
unsigned int SearchCount = 0;
   
const unsigned int NumSearches = 1;
   
    AStarWay.clear();
   
while(SearchCount < NumSearches)
{
astarsearch.SetStartAndGoalStates( nodeStart, nodeEnd );
       
unsigned int SearchState;
unsigned int SearchSteps = 0;
       
do
{
SearchState = astarsearch.SearchStep();
           
SearchSteps++;
                       
}
while( SearchState == AStarSearch<MapSearchNode>::SEARCH_STATE_SEARCHING );
       
if( SearchState == AStarSearch<MapSearchNode>::SEARCH_STATE_SUCCEEDED )
{
            MapSearchNode *node = astarsearch.GetSolutionStart();
           

            int steps = 0;
           
            AStarWay.clear();
            AStarWay.push_back(xVec2(node->x,node->y));
           
            for( ;; )
            {
                node = astarsearch.GetSolutionNext();
               
                if( !node )
                {
                    break;
                }

                AStarWay.push_back(xVec2(node->x,node->y));
               
                steps ++;

            };
           
            // Once you're done with the solution you can free the nodes up
            astarsearch.FreeSolutionNodes();
           
            result = true;
}
else if( SearchState == AStarSearch<MapSearchNode>::SEARCH_STATE_FAILED )
{
//NSLog(@"Search terminated. Did not find goal state\n");
           
}
       
SearchCount ++;
       
astarsearch.EnsureMemoryFreed();
}

    return result;
}


-(bool) SelectEndPoint:(CGPoint)Point
{

    rx = (int)SX % 32;
    ry = (int)SY % 94;
   
    int ax = int((Point.x+((16.0+rx)*Scale))/(32.0*Scale));
    int ay = int((Point.y+((47.0+ry)*Scale))/(94.0*Scale));   
    nodeEnd.x = int(ax + (SX/32.0));
    nodeEnd.y = int(ay + (SY/94.0));

    EndPoint.x = MapTiles[nodeEnd.x][nodeEnd.y].pos_x;
    EndPoint.y = MapTiles[nodeEnd.x][nodeEnd.y].pos_y;
   
    // Test if road
    if(!MapTiles[nodeEnd.x][nodeEnd.y].isRoad) return false; //no? no need for A* test
    //ok its road but maybe its locked?
    if(MapTiles[nodeEnd.x][nodeEnd.y].Lock) return false; //if locked do not perform A star
   
    //-------------------------------------------A STAR
   
    bool result = false;
   
unsigned int SearchCount = 0;
   
const unsigned int NumSearches = 1;
   
//#define DEBUG_LISTS 1
//#define DISPLAY_SOLUTION 1
//#define DEBUG_LIST_LENGTHS_ONLY 1     
   
    AStarWay.clear();
   
while(SearchCount < NumSearches)
{
astarsearch.SetStartAndGoalStates( nodeStart, nodeEnd );
       
unsigned int SearchState;
unsigned int SearchSteps = 0;
       
do
{
SearchState = astarsearch.SearchStep();
           
SearchSteps++;
           
#if DEBUG_LISTS
           
NSLog(@"Steps: %d\n",SearchSteps);
           
int len = 0;
           
NSLog(@"Open:\n");
MapSearchNode *p = astarsearch.GetOpenListStart();
while( p )
{
len++;
#if !DEBUG_LIST_LENGTHS_ONLY
((MapSearchNode *)p)->PrintNodeInfo();
#endif
p = astarsearch.GetOpenListNext();

}
           
NSLog(@"Open list has %d nodes\n",len);
           
len = 0;
           
NSLog(@"Closed:\n");
           
            //dnodes.clear();
           
p = astarsearch.GetClosedListStart();
while( p )
{
len++;
#if !DEBUG_LIST_LENGTHS_ONLY
p->PrintNodeInfo();
#endif
                AStarWay.push_back(xVec2(p->x,p->y));
               
p = astarsearch.GetClosedListNext();
}
                   
NSLog(@"Closed list has %d nodes\n",len);
#endif
           
}
while( SearchState == AStarSearch<MapSearchNode>::SEARCH_STATE_SEARCHING );
       
if( SearchState == AStarSearch<MapSearchNode>::SEARCH_STATE_SUCCEEDED )
{
            MapSearchNode *node = astarsearch.GetSolutionStart();
           
#if DISPLAY_SOLUTION
            NSLog(@"Displaying solution\n");
#endif
            int steps = 0;
           
            AStarWay.clear();
#if DISPLAY_SOLUTION           
            node->PrintNodeInfo();
#endif
            AStarWay.push_back(xVec2(node->x,node->y));
           
            for( ;; )
            {
                node = astarsearch.GetSolutionNext();
               
                if( !node )
                {
                    break;
                }
#if DISPLAY_SOLUTION
                node->PrintNodeInfo();
#endif
                AStarWay.push_back(xVec2(node->x,node->y));
               
                steps ++;

            };
       
            // Once you're done with the solution you can free the nodes up
            astarsearch.FreeSolutionNodes();
           
            result = true;
}
else if( SearchState == AStarSearch<MapSearchNode>::SEARCH_STATE_FAILED )
{
//NSLog(@"Search terminated. Did not find goal state\n");
           
}
       
SearchCount ++;
       
astarsearch.EnsureMemoryFreed();
}

    return result;
}

No i tyle masz wacpan A* na hexach.

Jak to wyglada w praktyce:


69
Dyskusje / Odp: Zawód
« dnia: Lipiec 20, 2014, 13:04:13 »
Najlepsze zarobki w IT są aktualnie w Niemczech, UK i Krajach Skandynawskich, wiec Niemiecki jest na topie.

70
Dyskusje / Odp: Zawód
« dnia: Lipiec 20, 2014, 10:13:18 »
Są na warsztacie osoby które mając Średnie zarabiały/zarabiają "MASTER RACE AWESOME SALARY" i parę znam osobiście. Ale to nie jest tak ze to małym kosztem się zdobyło. Trzeba spełnić parę warunków:

1) Znać dobrze Angielski.
2) Być mega kumatym i szybko łykać wiedzę.
3) Robić sporo po godzinach (portfolio zastępujące papierek, no i gdzieś się tych dodatkowych rzeczy nauczyć trzeba)

TL;DR - Da się zarabiać sporo nie mając wyższego są to jednak przypadki odosobnione :P 

71
OpenGL / Odp: Modyfikowanie tekstury za pomoca shadera.
« dnia: Lipiec 15, 2014, 20:32:45 »
Umm... glEnable(GL_BLEND); ?

72
OpenGL / Odp: OpenGL przezroczystosc tekstury.
« dnia: Lipiec 03, 2014, 19:39:15 »
Dokumentacja przyjacielem twym, interesuje cie:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

gdzie glBlendFunc okresla algorytm blendowania.

73
OpenGL / Odp: OpenGL przezroczystosc tekstury.
« dnia: Lipiec 03, 2014, 19:17:50 »
Tak da sie:

GLuint texID;
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

int width = 1;
int height = 1;
int size = width*height*4;
char *imageData = (char*)malloc( size ); //czyli 4
memset(imageData,0,size*sizeof(char));
       
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glGenerateMipmap(GL_TEXTURE_2D);
free(imageData);       

74
Szkółka / Odp: SDL2_ttf wyświetlanie polskich znaków
« dnia: Lipiec 03, 2014, 14:04:10 »
Wez wyloguj: strTekst.c_str() co dostajesz powinny być znaczki UTF-8 (\u-XXXX)

75
Unity 3D / Odp: Przenośność C#
« dnia: Czerwiec 27, 2014, 11:52:11 »
Ja akurat tej potęgi Marmalade i Xamarina nie potrafię ogarnąć :)

Niby mono i kompiluje się do wielu platform. Ale gdzie ten czas zaoszczędzony jak:

a) Logika w kodzie to if(platofrma) else if(inna_platforma)...
b) User Interface Specs Hell
c) Brak rozszerzeń dla danej platformy.

Ktoś ma jakieś większe doświadczenie z Mono w Xamarinie ? bo z takich moich POC wynika ze to nie jest warte zachodu.

Strony: 1 2 3 4 [5] 6 7 8 9 ... 53