Toon posts:

[Java] roteren afbeelding

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ben bezig met het maken van een multiplayer racegame als Java applet. De baan zie je van bovenaf, daarover bewegen de twee auto's (elk in een eigen thread). De engine is inmiddels af, op papier althans (met al het wiskundige rekenwerk zoals sinus, cosinus etc.). Elke auto is gewoon een GIF afbeelding.

Nou doe ik nooit grafisch werk in Java, ik loop tegen het volgende aan: Hoe roteer ik een plaatje nou makkelijk (gegeven een bepaald aantal graden en het draaipunt/radius)? Na wat zoekwerk kom ik wel e.e.a. aan voorbeelden tegen, maar met zulke ellendig lange code...

Binnen de:
code:
1
public void paint( Graphics g )

draw ik zo een plaatje (gegeven de coördinaten en afmetingen):
code:
1
g.drawImage(afbeelding, 10, 10, 100, 250, this);


Iemand die me op weg kan helpen met een korte en efficiënte manier?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

Een goed startpunt is hier. Hiermee kun je je plaatjes redelijk simpel roteren. Ze draaien dan wel om hun 0,0 coordinaat, maar door ze eerst te transleren (verplaatsen) kun je het draaipunt ook in het midden van de autotjes zetten.

Ik vraag me trouwens af of het een juiste aanpak is om elk autotje z'n eigen thread te geven. Omdat je hier met een game werkt lijkt me een active render lus voor de hand liggender.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je kunt het ook zelf doen, dat roteren, vaak nog veel sneller ook.
Zie: http://www.xs4all.nl/~perseus/zoom/zoom.html

(let niet op de comments, het is al erg oude code van me ;))

deze 2 statements:
x_off=xa + (i*(xac_delta-(0.02*i))) + (((double)(iw)) * 0.5);
y_off=ya + (i*(yac_delta+(0.01*i))) + (((double)(ih)) * 0.5);
zit het rubbereffect. dus je moet die even vervangen door:
x_off=xa + (i*xac_delta) + (((double)(iw)) * 0.5);
y_off=ya + (i*yac_delta) + (((double)(ih)) * 0.5);

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

In dat geval zul je pixel voor pixel de auto meoten tekenen. Bijkomend nadeel is dat je van je doel naar je source moet mappen om ervoor te zorgen dat er geen gaten in je autotje vallen. Tot slot heb je geen enkele vorm van anti aliasing waardoor het een erg ravelig effect krijgt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Janoz schreef op maandag 19 februari 2007 @ 13:50:
In dat geval zul je pixel voor pixel de auto meoten tekenen. Bijkomend nadeel is dat je van je doel naar je source moet mappen om ervoor te zorgen dat er geen gaten in je autotje vallen.
Welnee, je kunt iedere gif inladen en er een pixel array van maken in 0.0 tijd. De rotatie routine laat geen gaten vallen, dat komt omdat je niet vanuit het geroteerde plaatje tekent, maar gewoon pixel voor pixel tekent in het doelplaatje, en je berekent de source waar die pixel vandaan moet komen.
Tot slot heb je geen enkele vorm van anti aliasing waardoor het een erg ravelig effect krijgt.
Mwah, dat kun je oplossen bij het blenden van je autootje op de background van het frame. Of tijdens het pixelzetten in het doelplaatje wanneer je aan het roteren bent.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 30-11 21:02
Met Java2D kun je dit soort dingen toch allemaal doen? Dat is tegenwoordig ook nog hardware accelerated als ik me niet vergis. Om in 2007 nog je eigen bitmap rotatie code te gaan schrijven is - op educatieve doeleinden na - niet echt meer nuttig, toch?

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 28-11 12:23

Bergen

Spellingscontroleur

Hier allemaal voorbeelden over het roteren van bitmaps, wel allemaal in Delphi, maar je kan het als pseudocode gebruiken...

http://efg2.com/Lab/Libra...essing.htm#BitmapRotation

  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 26-01-2024
DaCoTa schreef op maandag 19 februari 2007 @ 16:15:
Met Java2D kun je dit soort dingen toch allemaal doen? Dat is tegenwoordig ook nog hardware accelerated als ik me niet vergis. Om in 2007 nog je eigen bitmap rotatie code te gaan schrijven is - op educatieve doeleinden na - niet echt meer nuttig, toch?
Dat van de hardware acceleratie klopt vanaf versie 1.5 zit er OpenGL acceleratie in. Standaard staat deze echter op disabled. Deze kun je aanzetten door de system property -Dsun.java2d.opengl op true te zetten.

Zie ook dit artikel: http://java.sun.com/j2se/.../2d/new_features.html#ogl

Het is dan ook aan de raden de AffineTransform klasse te gebruiken zoals Janoz al zei. Daar zit ook een methode in die om een anchor point kan roteren dus dat moet dan wel goed komen.

Pwnd


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Graphics2D stelt je heel simple in staat om rotaties uit te voeren:

Java:
1
2
3
4
5
6
7
8
9
Graphics2D g = (Graphics2D)img.getGraphics();
// mooie lijntjes
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
// achtergrond
g.setColor(new Color(Color.WHITE));
g.fillRect(0, 0, width,height);
// draai graphics om middelpunt
g.rotate((Math.PI/360.0d)*((double)degrees),height/2, widht/2);
// meer code op gedraaide plaatje


Alles na de rotate kun je gewoon tekenen alsof het recht is voor je staat. Je hoeft dus zelf niet echt veel meer over na te denken :)

Do diamonds shine on the dark side of the moon :?

Pagina: 1