2014-05-06 19 views
0

我知道這不是一個Objective-C的問題,但是我知道,我想我可能會利用這個網站上的一些驚人的人才來解決這個問題。以菱形編程排列對象

我想爲鑽石形式(見圖)放置一個Sprite Kit遊戲對象。我正在努力想辦法做到這一點。

中心塊(13)將被排列在屏幕的中心(self.size.width/2), (self.size.height/2)

Object Layout

我使用了以下定義爲我的佈局

#define kLevel_01_GridSize 5 
#define kLevel_01_SpacingX 75 
#define kLevel_01_SpacingY 32 

後續的基礎代碼是我在這一點上所有。它把第一個塊(1)

-(void)layoutLevel { 

    int gridCentre = (kLevel_01_GridSize - 1)/2; 
    int totalObjects = kLevel_01_GridSize * kLevel_01_GridSize; 


    CGPoint objectPosition; 

    for (int x = 1; x < totalObjects; x++) 
    { 

     objectPosition = CGPointMake(self.size.width/2 , (self.size.height /2) + (x * gridCentre) * kLevel_01_SpacingY); 

     SKNode *block = [self makeBlockOfType:LevelBlock]; 
     block.position = objectPosition; 
     [self addChild:block]; 
    } 
} 

還請裸記住,我想被放置在圖片中的數字順序的對象。這將有助於保持圖層順序。

任何幫助,將不勝感激:)

回答

0

這是一個基本的三角函數和幾何的問題 - 計算機圖形學的螺母和螺栓

你既可以利用三角函數計算出每個X步長值和y(它將是sqrt(2)/ 2 * square_side_length),然後通過x和y編寫代碼循環,將位置偏移該量,您可以基於非旋轉的正方形形狀計算您的位置,然後在繪製它們之前將45度(pi/2)變換矩陣應用於座標。

計算放置數字的位置需要一點思考。

當你說「我不妨利用這個網站上的一些驚人的人才來解決這個問題。」這聽起來很像「我想我可能會試圖讓其他人爲我免費爲我做我的工作。」

沒有。

我很高興爲您編寫此代碼 - 用於我平時的諮詢費用。否則,我會提供建議和幫助,但我不會爲你工作。

思考如何處理數字,這裏是我想出的。逆時針旋轉矩形45度,使1位於左上角。然後標記從0開始的每個單元格的x和y座標。因此,其中1的單元格爲0,0。其中有3個的單元格爲1,0。

您可以創建一個查找表,爲您提供任何給定單元的x/y座標。像這樣的東西

define cellWidth 50.0 
#define gridSize 5 

    typedef struct 
    { 
    int x; 
    int y; 
    } gridPosition; 

    //For all the cells, here are the values at each x/y position 
/* 
    x 0 1 2 3 4 
    | -- -- -- -- -- 
y | 
0 | 01 03 06 10 15 
1 | 02 05 09 14 19 
2 | 04 08 13 18 22 
3 | 07 12 17 21 24 
4 | 11 16 20 23 25 
*/ 

    //Then create an array of 25 gridPosition objects and populate each one with the grid coordinates of that 
    //value 

    gridPosition positions[25] = { 
    {.x= 0, .y= 0}, //Value 1 at (0,0) 
    {.x= 0, .y= 1}, //Value 2 at (0,1) 
    {.x= 1, .y= 0}, //Value 3 at (1,0) 
    {.x= 0, .y= 2}, //Value 4 at (0,2) 
    //and so on for all 25 entries.. 
    }; 


    CGPoint cellCenter; 
    int x, y; 
    int cellIndex; 
    gridPosition cellPosition; 
    for (y = 0; y < gridSize; y++) 
    for (x = 0; x < gridSize; x++) 
    { 
     cellIndex = y*gridSize + x; 
     cellPosition = positions[cellIndex]; 
     cellCenter = CGPointMake(
           cellWidth/2.0 + cellPosition.x*cellWidth, 
           cellWidth/2.0 + cellPosition.y*cellWidth); 
    } 
+0

首先,我感謝您的幫助,並尊重您作爲對本網站及其他人的貢獻。不過,我認爲你誤解了我的意圖。我的基本觸發器和幾何體是不存在的,但在做這篇文章之前,我一直在這個問題上掙扎了大約一個星期。雖然你的第一個方法是我的頭,我已經考慮了第二個,但正如你所說的放置數字是一個問題。我會坐下來再想一想。 – justMike

+0

如果你不習慣使用trig,那麼使用轉換矩陣可能是一條可行的路。 GLKit支持2D和3D變換矩陣數學。你可以佈置你的矩形不旋轉,然後在繪製之前對中心和每個角應用45度旋轉。您將使用居中佈局作爲標籤,並簡單地將其中心移動到每個圖塊的旋轉中心聯合顯示。 –

+0

謝謝鄧肯。我想我現在有一個可行的概念。在佈局之後設置zPosition值也可能會簡化一些事情。我現在要把問題留給我,直到我將它拼湊在一起。 – justMike