Genaueres RotateImage

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

s_m_w

Betreff: Genaueres RotateImage

BeitragSa, Mai 24, 2008 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich möchte ein relativ großes Objekt in Echtzeit drehen, wenn ich jedoch nur ein 359er Dim benutze in dem ich 0-359° des Bildes speichere, sieht die Bewegung etwas ruckartig aus, wenn sie sehr langsam ist und das ganze mit einem 3599 Dim und RotateImage Bild, i/10 scheint auch nichts zu bringen und würde, wenn es ginge, recht langsam sein, wie mache ich das am besten?

Falls es hilft, mein jetziger Code:
Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
TFormFilter 0
AutoMidHandle 1

Dim ShipImage (1,359)

For i = 0 To 359
 ;DebugLog(i)
 ShipImage(1,i) = LoadImage("Media\Ship1.png")
 RotateImage ShipImage(1,i),i
Next

Type Ship
 Field X%,Y%
 Field Rot%
 Field LastTurn%
 Field Hulltype.Hulltype
End Type

Type Hulltype
 Field ShipId%
 Field RotSpeed%
End Type

 Playership.Ship = New Ship
 NewShip(Playership.Ship)

While Not(KeyHit(1))
 Cls
 Control(Playership.Ship)
 Draw()
 Flip
Wend

Function NewShip(Ship.Ship)
 Ship\X% = 400
 Ship\Y% = 300
 Ship\Rot% = Rand(0,359)
 Ship\Hulltype = New Hulltype
 Ship\Hulltype\ShipID% = 1
 Ship\Hulltype\RotSpeed% = 200
 DebugLog(Ship\Hulltype\RotSpeed%)
End Function

Function Draw()
 For S.Ship = Each Ship
  DrawImage(ShipImage(S\Hulltype\ShipId,S\Rot),S\X,S\Y)
 Next
End Function

Function Control(Ship.Ship)
 ; Wenn LastTurn 0 ist, geht alles kaputt
 If Ship\LastTurn% = 0 Then Ship\LastTurn%=MilliSecs()
 ; Wenn noch nicht X Millisekungen vorbei sind, nicht drehen
 If Ship\LastTurn%+Ship\Hulltype\RotSpeed% < MilliSecs() Then
  ; Default Winkeländerung: 1
  Turn = 1
  ; Abstand zwischen LastTurn und jetzt größer als RotSpeed? Schneller drehen!
  If (MilliSecs()-Ship\LastTurn% > Ship\Hulltype\RotSpeed%) Turn = Int((MilliSecs()-Ship\LastTurn%)/Ship\Hulltype\RotSpeed%)
  Ship\LastTurn% = MilliSecs()
  If KeyDown(30) Then ; Links drehen
   Ship\Rot = Ship\Rot-Turn
   While Ship\Rot < 0
    Ship\Rot = 359+Ship\Rot
   Wend
  EndIf
  If KeyDown(32) Then ; Rechts drehen
   Ship\Rot = Ship\Rot+Turn
   While Ship\Rot > 359
     Ship\Rot = 0+(Ship\Rot-360)
   Wend
  EndIf
 End If
End Function

Xeres

Moderator

BeitragSa, Mai 24, 2008 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh, wenn du an Rotateimage Richtige Floats übergibst, sollte es funktionieren;
Float(i) / 10.0 ist was anderes als i / 10, Probiers mal aus Wink
Vll. wär draw3d auch was für dich? Da kann man sich solche Vorberechnungsspäße schenken...

s_m_w

BeitragSa, Mai 24, 2008 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, super, nun sieht es schöner aus, nur ist das vorberechnen jetzt extrem langsam, Draw3d kann ich leider nicht benutzen, da ich nur Blitzplus habe, gibt es eine andere Methode das ganze zu verschnellern? Bei einem einzigen Objekt braucht das ganze schon 10+ Sekunden (mit Debugger), bei 50+ wäre das viel zu langsam und unerträglich.
Sheep Happens

peacemaker

BeitragSo, Mai 25, 2008 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Vlt vorberechnen und in eine Bilddatei reinspeichern. Dann das als Animiertes Image laden. Ist vlt schneller. Ansonsten ist sowas leider etwas schwierig.
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/

s_m_w

BeitragSo, Mai 25, 2008 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie machen das denn andere, mit BlitzPlus programmierte Spiele? Ich bezweifle, dass ich der einzige bin der einen Haufen rotierende Objekte will

edit: Das berechnete Objekt als Bilddatei speichern würde vermutlich nicht gehen, bei einem 100x100 Objekt käme da ja schon eine ~150*360000 Grafik raus..
Sheep Happens

Xeres

Moderator

BeitragSo, Mai 25, 2008 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, vll müssen dann 0-359 Grad ausreichen Wink
Wie Langsam willst du denn da was drehen, das man 1/10° erkennen kann? Intern mit Kommazahlen rechnen und wenn die nächste ganze Zahl zusammengekommen ist, den Frame wechseln ginge.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

s_m_w

BeitragSo, Mai 25, 2008 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich brauche schon extrem langsame Drehungen von großen Objekten, 359 reichen nicht aus :/
Sheep Happens

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Mai 25, 2008 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Läuft FastImage denn nicht mit BlitzPlus? Ich denke, dass es gehen müsste. Suche doch mal danach.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

ChristianK

BeitragSo, Mai 25, 2008 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
FastImage geht leider nicht mit BlitzPlus, weil es über den 3D-Modus läuft.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

s_m_w

BeitragSo, Mai 25, 2008 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Heisst das, ich brauche B3D, wenn ich weniger Berechnungszeit haben will?
Sheep Happens

ShadowJumper

BeitragSo, Mai 25, 2008 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
da du B+ hast kannst du ja mal probieren, wie schnell es läuft, wenn bei LoadImage der Modus auf 2 ist
Bilder kostenlos hosten
lest und weint:
RAM - 512 MB; GrafikRAM - 32 MB; CPU - 800 MHz
Ps: ... und weint (vor lachen)

BladeRunner

Moderator

BeitragSo, Mai 25, 2008 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
...das ganze mit einem 3599 Dim und RotateImage Bild, i/10 scheint auch nichts zu bringen...


*röchel, das ist ja Overkill für die Grafikkarte*

Wir rechnen ein wenig:
Sagen wir deine Bilder sind 100*100 Pixel groß, und du berechnest 3600 (nur wegen der runderen Zahl) Einzelschritte, dann haben wir: 100*100*4*3600 ---> 144000000 Byte (137,2 MB) Speicher für ein! Objekt dass gedreht werden soll. Unnötig zu sagen dass der durchschnittliche PC da nimmer viel Lust hat.
Und wenn es mehrere Objekte sind bringst du selbst High-End-Karten ans Limit und darüber hinaus. Schlag dir also die Schritte auf dem Kopf und mach einen Kompromiss zwischen Leistung und aussehen. Weniger Frames, ein wenig Geruckel, aber dafür vertretbare Resourcennutzung. Bei einem normalen Anwendungsfall würde ich bestenfalls in 5°-Schritten rotieren, das wären 72 Schritte. Immer noch mehr als genug.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

s_m_w

BeitragSo, Mai 25, 2008 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:

*röchel, das ist ja Overkill für die Grafikkarte*


Stimmt schon, war eh nur experimentell und wäre nicht so geblieben. Mein Problem ist nur, dass bei einem 100x100 Objekt sehr ruckelig aussieht, wenn ich es "nur" in 1° Schritten drehe. Gibt es eine rechnerfreundlichere Möglichkeit eine "schöne", langsame Drehung hinzubekommen?

ShadowJumper hat Folgendes geschrieben:
da du B+ hast kannst du ja mal probieren, wie schnell es läuft, wenn bei LoadImage der Modus auf 2 ist


Wenn es schneller läuft, dann nur ein ganz bisschen.
Sheep Happens

BladeRunner

Moderator

BeitragSo, Mai 25, 2008 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausser on the fly die Zwischenschritte zu berechnen wohl leider nein, zumindest nicht unter B+. Und das wird wenn es nicht den rechner total bremsen soll logistischer Selbstmord.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group