2015-10-02 3 views
1

Проблема заключается в следующем: У меня есть позиция, позволяющая сказать космический корабль, и положение должно быть определено посередине (например, из-за проблем с конфликтами и т. Д.). Если космический корабль не будет повернут, то изображение будет обращено так:Как нарисовать повернутое изображение из его центра в Slick2D?

spaceship.draw(xPos - width/2 , yPos - height/2);

Космический корабль теперь изображение в Slick2D, что имеет случайный угол (0 < = угол < 360), и до сих пор положение должно быть определено в его центре. Что пятно делает в розыгрыше() - методы заключается в следующем:

enter image description here Он рисует овал вокруг изображения (я думаю, с наименьшей возможной площадью поверхности), а затем смотрит, где линия от центра при 135 ° выкл разрезает эллипс (красная точка) и устанавливает это как позицию.

Я все еще хочу сделать это в центре, что означает, что я должен subract значение в обоих измерениях (draw(xPos - xOff, yPos - yOff)):

enter image description here

Но им unabled подсчитать, что! Может кто-то мне помочь, пожалуйста? Я потратил два дня, чтобы понять, в чем проблема ...

Спасибо много и Приветствую, г

Здесь код отрисовки:

> public void render(GameContainer gc, StateBasedGame sbg, Graphics g) 
> throws SlickException{ 
>   
>   // This sets all rotation to the middle of the graphics. 
>   // The method works RELATIVE TO THE TOP-LEFT-CORNER OF THE IMAGE. 
>   skin.setCenterOfRotation(skin.getWidth() * Revolve.getGS()/2 + Revolve.getXShift(), 
>     skin.getHeight() * Revolve.getGS()/2 + Revolve.getYShift()); 
>   
>   // This sets the Angle properly 
>   skin.setRotation(angle); 
>   
>   // This draws the image: xPos and yPos define THE CENTER of the Image. 
>   skin.draw(
>    (float) (Revolve.getXShift() + Revolve.getGS() * xPos), 
>    (float) (Revolve.getYShift() + Revolve.getGS() * yPos), 
>    Revolve.getGS() 
>   ); 
>  
>   // Draws the xPos and yPos of the Ship 
>   g.setColor(Color.white); 
>   g.drawOval(Revolve.getXShift() + Revolve.getGS() * xPos, Revolve.getYShift() + Revolve.getGS() * yPos, 2, 2); 
>  } 
+0

Я не уверен, чтобы понять, что это ваша проблема. Вы хотите нарисовать изображение в определенном месте и хотите его повернуть? Если это так, я не понимаю, зачем вам такая передовая концепция. Пожалуйста, можете ли вы попытаться объяснить по-другому? – RPresle

+0

Если вы просто хотите повернуть свое изображение, почему вращение не соответствует вашим потребностям? – RPresle

+0

Извините за 6 дней, я был в отпуске, и это было здорово :-) Теперь к проблеме: я могу повернуть изображение, это просто. Но после его вращения я должен нарисовать его (повернутое изображение) в определенном положении (x, y). Итак, я говорю image.draw (x, y), но тогда x и y не находятся в центре изображения, а в левом верхнем углу центра. Конкретно: нарисованной красной точкой выше. Но я хочу определить центр повернутого изображения, и там он должен быть нарисован. Это яснее? В противном случае скажите, пожалуйста!Greets, r –

ответ

1

Ну все становится ясно, с каким-то кодом.

Вот решение:

@Override 
public void init(GameContainer container) throws SlickException 
{ 
    this.character = new Image("/home/ronan/Images/20150517010612.jpg"); 
    this.scale = 0.5f; 
    // When you set your center of rotation is is relative to your image ONLY. 
    // this will make the center of my image to be the center of the rotation 
    // NOTHING more to add 
    this.character.setCenterOfRotation((this.character.getWidth()/2)*this.scale, (this.character.getHeight()/2)*this.scale); 
} 

@Override 
public void update(GameContainer container, int delta) throws SlickException 
{ 
    this.rotation +=delta/10; 
    this.character.setRotation(this.rotation); 
} 

public void render(GameContainer container, Graphics g) throws SlickException 
{ 
    // Here I consider that my position is (500,500). then to draw it, I just substract hal the size of my image. 
    // It will draw from top-lefft corner but based on my center. 
    character.draw(500-(this.character.getWidth()/2)*this.scale, 500 - (this.character.getHeight()/2)*this.scale,this.scale); 
} 

отрываю, чтобы все было ясно.

В методе init вы должны установить центр вращения. Этот центр по отношению к изображению, так что просто разделите высоту объявления ширины на две, чтобы иметь координату центра вашего изображения. когда он работает, вы умножаете масштаб. Ничего больше добавить, поскольку оно действительно локально для вашего изображения.

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

Просто адаптируйте этот код к своему, и он должен идти хорошо. Спросите, нужна ли вам больше точности.

enter image description here enter image description here

+0

Привет, RPresle (и другие, которые обращаются за помощью к подобным проблемам). Я сделал это, на самом деле ты это сделал. Я использовал ваш код, и он работал, но не совсем с самого начала. Был небольшой сдвиг, но я мог бы исправить это, вовлекая высоту в строку в методе render() (он использует ширину дважды, что работает только в квадратных изображениях). БОЛЬШОЕ СПАСИБО. –

+0

Рад, что вы это поняли. Я исправляю свой код, потому что это явно ошибка. – RPresle

 Смежные вопросы

  • Нет связанных вопросов^_^