[gelöst] Bild auf Zylinder legen und den drehen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 :?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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. /:->
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 ?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Antworten