Seite 2 von 3

Verfasst: 18.02.2008 21:48
von scholly
Andreas_S hat geschrieben:Ich muss mir eingestehn ich weis nicht wiso sich die Rotation kehrt...
Ich hab wieder mit "Purebasiclogo.bmp" aus den Examples probiert:
1x komplett von rechts nach links durch
danach kommts nur bis Pu und dreht zurück
jetzt kommts einmal von links komplett zurück
jetzt kommts wieder nur ein Stück von links zurück
und jetzt geht das ganze anscheinend von vorne los :shock:
Andreas_S hat geschrieben:Aber sonst gehts jetzt!
Man kann auch die "genauigkeit" ändern: >>zylinder\xStep = ...
Nicht ganz, denn je höher ich das setze, desto schneller wird zwar die Drehung, aber desto mehr senkrechte schwarze Striche tauchen auf :(
Andreas_S hat geschrieben:Vil kann mir jemand helfen...
Vielleicht sind wir hier im falschen Brett und die Fachleute kriegens garnich mit :?

Verfasst: 18.02.2008 22:01
von Andreas_S
scholly hat geschrieben:
Andreas_S hat geschrieben:Aber sonst gehts jetzt!
Man kann auch die "genauigkeit" ändern: >>zylinder\xStep = ...
Nicht ganz, denn je höher ich das setze, desto schneller wird zwar die Drehung, aber desto mehr senkrechte schwarze Striche tauchen auf :(
sowas bezeichne ich als "genauigkeit"...

Ich wette Stargate oder NicTheQuick könnte das lösen... bin gerade ein
bischen raus gekommen weil ich nicht versteh wiso das nicht funzt...


Andreas

Verfasst: 18.02.2008 22:40
von scholly
Eigentlich wollt ich nur in einem About-Fenster die Möglichkeit bieten, ein Logo damit zu präsentieren - mal weg von dem ganzen statischen Kram und 'n bischen Bewegung in die Bude ;)

Weil ich garkein Plan von dem Gebiet hab, dachte ich:
ersma theoretisch schlau machen, wieviel Arbeit das ist und dann gucken, ob sich das vom Resultat her lohnt.
Aber es gibt anscheinend kein Tut zum Einsteigen.
Und die Examples mit dem ganzen Mesh-Kram und Texturen sind für mich auch nicht nachvollziehbar.

Wenns so schwierig ist, laß ich wohl die Finger davon und guck mal, was ich sonst für Effekte als Augenschmaus einbauen kann. Ich hatte wirklich gedacht, daß sowas voll einfach wäre.

Tut mir leid, Deine Zeit gestohlen zu haben... scholly

Verfasst: 18.02.2008 22:49
von Andreas_S
Mein Code hat nichts mit Meshes oder einer Engine zu tun...

Wie alt bist du denn?
Sin dir Sin und Cos fern?

Mehr beinhaltet mein Code nicht...

Ich hab nur ein bischen überlegt was man überhaupt bei einem Zylinder sieht und was nicht. So hoch komplex ist mein Code nicht...

Ich seh mir nochmal an wieso die Rotation gekehrt wird...


Andreas

Verfasst: 18.02.2008 23:12
von scholly
Andreas_S hat geschrieben:Mein Code hat nichts mit Meshes oder einer Engine zu tun...
I know, I know... Aber Ol'Man Mod hatte das am Anfang des Threads mal 'reingeworfen und mir schwirrte eben durch den Kopf, was ich da an Code/Ergebnis gesehen hatte.
Andreas_S hat geschrieben:Wie alt bist du denn?
:psssst: kein Kommentar
Andreas_S hat geschrieben:Sin dir Sin und Cos fern?
Jo, hab ich AFAIR vor 35 Jahren das letzte mal mit zu tun gehabt :lol:

Und da ich eigentlich nie Interesse am Coden von Spielen bzw Demos/Intros hatte, hab ich mich seit meinem ersten C64 auch nie dafür Interessiert. /:->

Verfasst: 18.02.2008 23:32
von Andreas_S
HeyHey KG wollte nur helfen... Außerdem ist es eine möglichkeit...

Ich hab jetzt glaub ich den Fehler...

Ich poste dann nochmal...


Andreas

Verfasst: 19.02.2008 00:23
von Andreas_S
So das funzt:

Code: Alles auswählen

#PI2 = #PI * 2


Structure zylinder
	r.l
	h.l
	
	xStep.d
	
	angle.d
	
	sprite.l
EndStructure


Procedure.d cutVal( val.d , min.d , max.d )
	Protected d.d = max - min
	
	While val > max.d
		val - d
	Wend
	While val < min.d
		val + d
	Wend
	
	ProcedureReturn val
EndProcedure


Procedure zylinder2DW( *zylinderPtr )
	Protected *zylinder.zylinder = *zylinderPtr
	
	ProcedureReturn *zylinder\r * 2
EndProcedure
Procedure zylinder2DH( *zylinderPtr )
	Protected *zylinder.zylinder = *zylinderPtr
	
	ProcedureReturn *zylinder\h
EndProcedure

Procedure drawZylinderOnSprite( *zylinderPtr , drawingSprite )
	Protected *zylinder.zylinder = *zylinderPtr, toX.d = (cutVal(*zylinder\angle, 0, 90) / 90) * SpriteWidth(*zylinder\sprite), x.d = zylinder2DW(*zylinder) + toX
	Protected angle.d, newX.d, a.d, aa.d, xx.d
	
	Repeat
		x - *zylinder\xStep
		a + *zylinder\xStep
		angle = a/zylinder2DW(*zylinder) * 180
		
		xx = cutVal(x, 0, SpriteWidth(*zylinder\sprite) - 1)
		
		newX = *zylinder\r + Cos(angle * #PI/180) * *zylinder\r
		
		For y = 0 To SpriteHeight(*zylinder\sprite)
			StartDrawing(SpriteOutput(*zylinder\sprite))
				rgb = Point(xx, y)
			StopDrawing()
			StartDrawing(SpriteOutput(drawingSprite))
				Line(newX, y, 1, 1, rgb)
			StopDrawing()
		Next
	Until x <= toX
EndProcedure


sprite$ = OpenFileRequester("BMP Laden","","BMP File (*.bmp)|*.bmp",0)

If sprite$
	InitSprite()
	InitKeyboard()
	
	
	OpenScreen(1280, 800, 32, "Zylinder Sprite")
		
		LoadSprite(0, sprite$)
		
		zylinder.zylinder
			zylinder\h = SpriteHeight(0)
			zylinder\r = SpriteWidth(0) / #PI2
			zylinder\xStep = 0.5
			zylinder\angle = 0
			zylinder\sprite = 0
		
		CreateSprite(1, zylinder2DW(@zylinder), zylinder2DH(@zylinder))
			drawZylinderOnSprite(@zylinder, 1)
		
		CreateSprite(2, zylinder2DW(@zylinder) + 2, zylinder2DH(@zylinder) + 2)
			StartDrawing(SpriteOutput(2))
				Box(0, 0, zylinder2DW(@zylinder) + 2, zylinder2DH(@zylinder) + 2, RGB(255, 0, 0))
			StopDrawing()
		
		Repeat
			ExamineKeyboard()
			
			FlipBuffers()
			ClearScreen(RGB(0,0,0))
			
			drawZylinderOnSprite(@zylinder, 1)
			zylinder\angle + 1
			;Debug a;zylinder\angle
			
			DisplaySprite(2,49,49)
			DisplaySprite(1,50,50)
			DisplaySprite(0,400,50)
			
			Delay(1)
		Until KeyboardPushed(#PB_Key_Escape)
	CloseScreen()
EndIf

Hatte lineares mit "kreis" (kA wie man das nennt) - Verhältnis verwechselt...

hf
Andreas

Verfasst: 19.02.2008 00:27
von scholly
Andreas_S hat geschrieben:HeyHey KG wollte nur helfen... Außerdem ist es eine möglichkeit...
Is mir klar, ich wollt ja nur ausdrücken, daß ich den Hinweisen nachgegangen bin, aber quasi immer noch so dumm bin wie am Anfang. :oops:

Ich bin wirklich (in diesem Bereich) so naiv, daß ich gedacht hab, es gäbe eine PB-Erweiterung (Userlib, .pbi o.Ä), die es ermöglicht, mit 4-5 Befehlen zum Ziel zu kommen.

Gibts für andere Bereiche (z.B. den OldSkool-Kram) ja auch.

Letztendlich sollten FMPOV Aufwand und Resultat in einem Verhältnis stehen, das den Betroffenen zufriedenstellt, und ich gehör nicht zu denen, die das Rad zum 42. mal erfinden wollen.

Hab grad gesehen, daß Du was neues hast, Guck ich mir sofort an.

Verfasst: 19.02.2008 00:50
von scholly
:allright: Klasse, jetzt klappt bei zylinder\xStep = 0.5

Aber wenn ichs was schneller (1.5 statt 0.5) rotieren lassen will, damit es flüssiger aussieht, gibts noch die schwarzen Striche.
Oder bin ich zu naiv und dreh an der falschen Stelle ?

Noch 2 Unschönheiten gefunden:
- Bild 402x125 genommen und das dreht selbst bei 2.5 nicht flüssig.
- je kleiner der Wert, desto länger die Reaktionszeit für #PB_Key_Escape

Kannst Du da noch wo dran drehen ?

Verfasst: 19.02.2008 01:59
von Andreas_S
Ja und zwar gewaltig:

Code: Alles auswählen

#PI2 = #PI * 2


Structure zylinder
	r.l
	h.l
	
	xStep.d
	
	angle.d
	
	sprite.l
EndStructure


Procedure.d cutVal( val.d , min.d , max.d )
	Protected d.d = max - min
	
	While val > max.d
		val - d
	Wend
	While val < min.d
		val + d
	Wend
	
	ProcedureReturn val
EndProcedure


Procedure zylinder2DW( *zylinderPtr )
	Protected *zylinder.zylinder = *zylinderPtr
	
	ProcedureReturn *zylinder\r * 2
EndProcedure
Procedure zylinder2DH( *zylinderPtr )
	Protected *zylinder.zylinder = *zylinderPtr
	
	ProcedureReturn *zylinder\h
EndProcedure

Procedure drawZylinder( *zylinderPtr , drawingSprite , bufferSprite )
	Protected *zylinder.zylinder = *zylinderPtr, toX.d = (cutVal(*zylinder\angle, 0, 90) / 90) * SpriteWidth(*zylinder\sprite), x.d = zylinder2DW(*zylinder) + toX
	Protected angle.d, newX.d, a.d, aa.d, xx.d
	
	Repeat
		x - *zylinder\xStep
		a + *zylinder\xStep
		angle = a/zylinder2DW(*zylinder) * 180
		
		xx = cutVal(x, 0, SpriteWidth(*zylinder\sprite) - 1)
		
		newX = *zylinder\r + Cos(angle * #PI/180) * *zylinder\r
		
		UseBuffer(*zylinder\sprite)
			GrabSprite(bufferSprite, xx, 0, 1, SpriteHeight(*zylinder\sprite))
		
		UseBuffer(drawingSprite)
			DisplaySprite(bufferSprite, newX, 0)
	Until x <= toX
	
	UseBuffer(#PB_Default)
EndProcedure


sprite$ = OpenFileRequester("BMP Laden","","BMP File (*.bmp)|*.bmp",0)

If sprite$
	InitSprite()
	InitKeyboard()
	
	
	OpenScreen(1280, 800, 32, "Zylinder Sprite")
		
		LoadSprite(0, sprite$)
		
		zylinder.zylinder
			zylinder\h = SpriteHeight(0)
			zylinder\r = SpriteWidth(0) / #PI2
			zylinder\xStep = 0.5
			zylinder\angle = 0
			zylinder\sprite = 0
		
		CreateSprite(1, zylinder2DW(@zylinder), zylinder2DH(@zylinder))
		
		CreateSprite(2, zylinder2DW(@zylinder) + 2, zylinder2DH(@zylinder) + 2)
			StartDrawing(SpriteOutput(2))
				Box(0, 0, zylinder2DW(@zylinder) + 2, zylinder2DH(@zylinder) + 2, RGB(255, 0, 0))
			StopDrawing()
		
		Repeat
			ExamineKeyboard()
			
			FlipBuffers()
			ClearScreen(RGB(0,0,0))
			
			drawZylinder(@zylinder, 1, 3)
			
			zylinder\angle + 1
			
			DisplaySprite(2,49,49)
			DisplaySprite(1,50,50)
			DisplaySprite(0,400,50)
			
			Delay(1)
		Until KeyboardPushed(#PB_Key_Escape)
	CloseScreen()
EndIf
Das hat schon ziehmlich guten Speed...
Besten Ideen kommen erstam Schluss <)

Edit:
Ich hab mit dem Code jetzt schon Bilder mit 1280 * 800 gedreht.
Geht jetzt schon sehr flüssig.

Zu den Streifen... wie gesagt das ist gewollt das da schwarze Striche sind...
Sonst würde es ja keinen Perforanc-Unterschied geben...
Bei dem Code könnte man noch was ändern hab aber jetzt keine Lust mehr...


Andreas