Eine Animation mit mehreren Zufallspositionen

Anfängerfragen zum Programmieren mit PureBasic.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Eine Animation mit mehreren Zufallspositionen

Beitrag von D4uS1 »

Ich habe eine Animation die gleichzeitig an verschiedenen Punkten auf dem Bildschirm erscheinen soll. Da aber nicht immer die Positionen gleich sein sollen(sonst würde das ja langweilig werden), habe ich bestimmt Positionen vorgegeben. Ich habe also jetzt 30 Positionen und 14 Animationen. Die 14 Animationen sollen sich sozusagen eine Position aussuchen.
Doch ich weiß einfach nicht wie ich das ganze in den DisplayTransparentSprite() Befehl einfügen soll.

Code: Alles auswählen

dim posX.w(30)
dim posY.w(30)
dim animX.w(14)
dim animY.w(14)

;-----Die Positionen sind hier alle bezogen, das wäre unnötig die alle anzugeben

For x = 1 to 14
 LoadSprite(x+anim, "Bilder/Animation" +Str(x) +".bmp")
next

repeat
examineKeyboard()

for y = 0 to 30
 for x = 1 to 14
  DisplayTransparentsprite(x+anim, ?????random(???)????????????????)
 next
next

until keyboardpushed(1)
Ihr könnt mich für dumm halten wenn ihr wollt, aber ich bin einfach nicht auf die Lösung gekommen! Die Animationen werden einwandfrei dargestellt wenn ich die Positionen alle angebe, aber ich hätte gerne einen Zufallsgenerator der ich eine der vorgegebenen Positionen aussucht!?
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Geht's 'nen bischen präziser?

Starten alle Animationen gleichzeitig? Wann sollen die neuen Positionen gesetezt werden? Bevor oder nachdem eine / alle animationen zuende sind?

Vielleicht hilft dir das:

Code: Alles auswählen

InitSprite() : InitKeyboard()
   
OpenWindow(0,0,0,640,480,"untitled",#WS_SYSMENU | #WS_CAPTION | 1)

OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)

CreateSprite(0,64 * 10,64)

StartDrawing(SpriteOutput(0))
For i=0 To 9
	DrawingMode(0)
	Ellipse(i*64+32,32,32,32,RGB(255-i*25,0,0))
	DrawingMode(4)
	Ellipse(i*64+32,32,32,32,#White)
Next
StopDrawing()

#POSITIONS = 30
#ANIMATIONS = 14

Dim SpritePos.w(#POSITIONS-1,1)
Dim TempPos.w(#ANIMATIONS-1,1)

For i=0 To #POSITIONS-1
	SpritePos(i,0) = Random(640 - 64)
	SpritePos(i,1) = Random(480 - 64)
Next

For i=0 To #ANIMATIONS-1
	PosID = Random(#POSITIONS-1)
	
	TempPos(i,0) = SpritePos(PosID,0)
	TempPos(i,1) = SpritePos(PosID,1)
Next

Repeat
	EventID = WindowEvent()
	
	ClearScreen(RGB(50,0,0))
	
	ExamineKeyboard()
	
	If AnimDelay = 6
		AnimDelay = 0
		
		If AnimFrame = 9 : AnimMode = 1 : EndIf
		If AnimFrame = 0 And AnimMode = 1
			AnimMode = 0
		
			For i=0 To #ANIMATIONS-1
				PosID = Random(#POSITIONS-1)
				
				TempPos(i,0) = SpritePos(PosID,0)
				TempPos(i,1) = SpritePos(PosID,1)
			Next
		EndIf
		
		If AnimMode = 0 : AnimFrame + 1 : EndIf
		If AnimMode = 1 : AnimFrame - 1 : EndIf
	EndIf
	
	AnimDelay + 1
	
	ClipSprite(0,64 * AnimFrame,0,64,64)
	
	For i=0 To #ANIMATIONS-1
		DisplayTransparentSprite(0,TempPos(i,0),TempPos(i,1))
	Next

	FlipBuffers()
Until KeyboardPushed(1) Or EventID = 16
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

der ansatz mit dem array von Fluid ist praktikabel.
wenn du die anzahl vorher nicht weißt, oder sie variieren kann, nimm ne LL.

auf jeden fall musst du die positionen vorab zufallserzeugen,
und in dem display die vorberechneten positionen verwenden,
sonst wechselt das sprite ja in jedem frame die position,
da bekommst du nur wildes geflackere raus.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

ok vielen dank!
Antworten