2011-12-21 5 views
3

Я читаю исходный код существующего платформера игры, и я наткнулся на это:Что именно делает этот прокруточный код платформы?

/* assign the horizontal position of the TileMap on the screen to offsetX 
    * this, center aligns the player. */ 
    int offsetX = width/2 - Math.round(player.getX()) - TILE_SIZE; 
    /* stop the map scrolling if the player reaches the two ends 
    * of the map */ 
    offsetX = Math.min(offsetX, 0); // if offsetX < 0 , offsetX = 0 
    offsetX = Math.min(offsetX, width-tileMap.getWidth()); //if offsetX > map width, offsetX = mapwidth 

    int offsetY = height - toPixels(tileMap.getHeight()); // not really necessary, I think 

    int firstTile = toTiles(-offsetX); // ??? 
    int lastTile = firstTile + toTiles(width) + 1; // why the +1 

я прокомментировал некоторые части, я думаю, я понимаю, и задавал вопросы о других в комментариях.

То, что беспокоит меня больше всего являются:

1- как OffsetX назначается (width/2 ... ?) Я понял, что он присваивает OffsetX какое-то место на карте, центр которой совпадет игрок, но я понятия не имею, как.

2-В третьей строке, почему разработчик написал width - tileMap.getWidth()?

Примечание: Если это слишком сложно объяснить код по строкам, пожалуйста, дайте мне приблизительную идею, возможно, с диаграммой? от того, что разработчик пытается сделать здесь. Благодарю.

+0

Я не понимаю, ваш первый вопрос - вы говорите, вы понимаете 'ширина/2' (для выравнивания по центру игрока, вы правы от того, что я могу сказать), и здесь нет кода, который говорит 'player.x = offsetX', который является« как », я думаю ... – Prescott

+0

' player.x = offsetX' выполняется после этого кода, извините, я его не разместил. Я хотел спросить, как именно формула 'width/2 - Math.round (player.getX()) - TILE_SIZE;' возвращает горизонтальную позицию TileMap на экране, который выравнивает по центру плеер. Я не понимаю теорию за формулой, хотя понимаю, что она делает. – ApprenticeHacker

ответ

1

1-я думаю, что это смещение предназначено для рисования плит не для центрирования плеера, эта функция увеличивает смещение с отрицательным числом, когда игрок перемещается, чем дальше вправо он движется, тем выше player.getX(), тем выше смещение.

пример:

теперь это смещение используется для рисования плитки с отрицательным смещением, другими словами, еще левее, в этом случае tileMap[0]=(10-160,10) что означает tileMap [0] из экрана диапазон (плитка прокручивается влево, игрок вправо)

2-я думаю, что это должно быть offsetX = Math.max(offsetX, width-tileMap.getWidth()); , в этом случае его дополнительная проверка, чтобы прокрутить только до конца карты.

пример:

width=300 
    player.getX()=900 
    TILE_SIZE=10 
    tileMap[last]=(1010,10) 
    tileMap.getWidth()=1000 

    offset=300/2-900-10 
    offset= -760 
    offsetX = Math.min(-760, 0); 
    offsetX = -760 
    offsetX = Math.max(-760, 300-1000); 
    offsetX = -700 
+0

+1, ничего себе, спасибо! – ApprenticeHacker