2016-07-31 8 views
-1

Я использую метод GetBounds как часть обнаружения столкновения для игры, и он выполняет некоторые довольно странные вещи. GetBounds возвращает ограничивающий прямоугольник для исходного положения моего многоугольника, но не текущую позицию, к которой я переместил ее. Это очень сбивает с толку, поскольку, когда я рисую свой полигон, он появляется в правильном месте. Я чувствую, что, вероятно, я делаю ошибку при перемещении моего полигона, поэтому я включил подробное описание того, как я его перемещаю.Java GetBound дает исходное положение многоугольника не текущее

Способ изменения положения многоугольников заключается в изменении массива «xpoints» и «ypoints», которые наследуются от многоугольника класса. Массивы xpoints и ypoints изменяются путем добавления желаемого местоположения многоугольника к другому массиву, содержащему многоугольник, в точке 0,0 и замену массива.

Вот код:

Public Class Sword extends Polygon{ 

int[] SwordXPoints, SwordYPoints 

public void main(int DesiredLocation){ 
for(int i = 0; i < super.ypoints.length; i++){ 
super.ypoints[i] = SwordXPoints + DesiredLocation; 
} 
for(int i = 0; i < super.xpoints.length; i++){ 
super.xpoints[i] = SwordYPoints + DesiredLocation; 
} 
} 
} 

Я надеюсь, что это объяснение легче понять и проще.

Спасибо, Сэм.

+0

это даже не полный, и вы используете свои собственные классы мечи и т.д., так как HEC мы knoe то, что вы там делаете ?? – gpasch

+0

Извините, gpasch, это, казалось, имело смысл для меня. Я переписал его и попытаюсь воздержаться от использования какого-либо конкретного кода, взятого из моей игры, и просто переписать его, чтобы его было легче читать. –

ответ

0

Звонок в getBounds() работает этот бит кода:

if (bounds == null) { 
    calculateBounds(xpoints, ypoints, npoints); 
} 
return bounds.getBounds(); 

В первый раз через, bounds равно нулю и calculateBounds называется. Это проходит через ваши точки, вычисляет min и max X и Y и создает bounds. При последующих вызовах bounds не равен null, и возвращается кешированное значение.

Что вам нужно сделать, это добавить звонок в invalidate() после того, как вы закончите обновление всех точек.

В качестве альтернативы вы можете использовать AffineTransform, чтобы изменить начало и масштаб Graphics2D, нарисуйте свой многоугольник как есть и восстановите исходное происхождение и масштаб. Грубая последовательность вызовов будет:

AffineTransform origAT = g2.getTransform(); // Save original 
AffineTransform newAT = new AffineTransform(); 
newAT.concatenate(origAT); 
newAt.translate(newX, newY); 
g2.setTransform(newAt); 
g2.draw(polygon); 
g2.setTransform(origAt); // restore original 
+0

Спасибо Devon_C_Miller. Это идеальное объяснение того, почему он не работает. Я хотел бы знать, где вы на самом деле нашли этот код, я потратил довольно много времени на просмотр сайта oracle и не смог найти никакого кода, как работает оценка. –

+0

@SamChapman Когда вы устанавливаете JDK, где-то в установке находится 'src.zip', который содержит источники Java. В крайнем случае вы можете распаковать это и посмотреть. Однако среда IDE должна позволять вам управлять щелчком по символу и видеть источник. Я не пробовал Eclipse, но я знаю, что он работает как в NetBeans, так и в IntelliJ IDEA. –