Odpowiedz na ten temat
Pokaż wyniki od 1 do 1 z 1
  1. Avatar Krzema
    Dołączył
    Jul 2008
    Skąd
    Gdańsk, PL
    Postów
    181

    Cytuj | #1

    Witam,
    piszę sobie swoją wersję Sokobana. Mam podmenu, w którym mogę wyświetlać podglądy poziomów (rzuty z góry) w postaci "scroll view". Podglądy generuję w tej chwili za pomocą UIGraphics, co wygląda mniej więcej tak:
    Kod:
    UIGraphicsBeginImageContext(CGSizeMake(levelWidth*tileSize,levelHeight*tileSize));
    		
    for(int y=0; y<levelHeight; y++)
    {
    	for(int x=0; x<levelWidth; x++)
    	{
    		currentField = [((MKLevel*)[levelLoader.levels objectAtIndex:i]) getFieldAtX:x Y:y];
    		
    		if(currentField.tile == tile)
    			[normalTile drawAtPoint:CGPointMake(x*tileSize, y*tileSize)];
    		else if(currentField.tile == targetTile)
    			[destTile drawAtPoint:CGPointMake(x*tileSize, y*tileSize)];
    		
    		if(currentField.box == box)
    			[boxToMove drawAtPoint:CGPointMake(x*tileSize, y*tileSize)];
    	}
    }
    
    [player drawAtPoint:CGPointMake(playerX*tileSize, playerY*tileSize)];
    
    UIImage *levelImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    Działa to prawie dobrze. "Prawie" ponieważ wychodzi na to, że w niektórych sytuacjach te obrazki są krzywo rysowane na "płótnie". Może pokażę to na przykładzie. Kafelkom specjalnie dałem takie tekstury (na przemian piksele białe i czerwone) żeby dobrze było widać te przesunięcia i rozmycie.
    Ten level akurat rysuje się prawidłowo:

    A te dwa - źle:

    Zastanawiam się czy jest to wina UIGraphics, czy może dalszych operacji na obrazkach. Po wygenerowaniu obrazka, dodaję sobie go do scroll view w ten sposób:
    ten fragment jest jeszcze w pętli przelatującej przez levele:
    Kod:
    UIImageView *imageView = [[UIImageView alloc] initWithImage:levelImage];
    imageView.tag = i+1;
    [levelsScrollList addSubview:imageView];
    [imageView release];
    a to robię na samym końcu procedury dodającej widoki do scroll view:
    Kod:
    UIImageView *view = nil;
    NSArray *subviews = [levelsScrollList subviews];
    
    int curXLoc = 0.0;
    
    for(view in subviews)
    {
    	if([view isKindOfClass:[UIImageView class]] && view.tag > 0)
    	{
    		CGRect frame = view.frame;
    		frame.origin = CGPointMake(curXLoc + 240 - CGRectGetWidth(view.frame)/2, 124 - CGRectGetHeight(view.frame)/2);
    		view.frame = frame;
    		
    		curXLoc += 480;
    	}
    }
    	
    [levelsScrollList setContentSize:CGSizeMake(levelLoader.levelsNum*480, [levelsScrollList bounds].size.height)];
    Ma ktoś może pomysł co z tym zrobić? Jeżeli ktoś zna lepszą metodę, to też chętnie poznam.
    Ostatnio edytowane przez Krzema ; 03.12.2011 o 16:16


Odpowiedz na ten temat