| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 22.04.2012, 20:29    Titel: Denkanstoß 2D Feuer routine |   |  
				| 
 |  
				| Könnte  mir jemand genau erklären wie man das am besten umsetzen kann? Ich hatte mir schon mehrere sources angeschaut bin aber nie ganz schlau daraus geworden! 
 Manche arbeiten ja auch mit einem palettenchange, wofür brauch man den genau?
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 22.04.2012, 21:10    Titel: |   |  
				| 
 |  
				| Eine Umdefinierung der Palette ist halt sehr schnell, weil die Pixel nicht noch einmal neu gesetzt werden müssen, sondern einfach alle Pixel in der Farbe x jetzt (z. B.) nicht mehr rot, sondern orange angezeigt werden. 
 Mehr als auf verschiedene Codes verweisen kann ich jetzt auch nicht; vielleicht nimmst du einfach mal einen Code her, der dir gut gefällt, und stellst dazu konkret deine Fragen. Da kann ich sicher einfacher helfen.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 23.04.2012, 13:15    Titel: |   |  
				| 
 |  
				| Was für eine Art Feuer willst du denn überhaupt simulieren? Je nachdem, wie es letztendlich aussehen soll, gibt es verschiedenste Ansätze. _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 23.04.2012, 17:04    Titel: |   |  
				| 
 |  
				|  	  | Zitat: |  	  | Was für eine Art Feuer willst du denn überhaupt simulieren? Je nachdem, wie es letztendlich aussehen soll, gibt es verschiedenste Ansätze. | 
 
 Ich wollte halt eine kleine 2D Feuer routine schreiben wo ich halt angeben kann wie breit und wie hoch diese sein soll.
 
 Ich denken man muss sich eine kleine particle engine schreiben dies ist kein problem nur wie bekomme ich das mit dem texturieren der flamen hin.
 
 Müsste ich das Feuer dann mit der Palette in 3 Ebenen einteilen? art weiss gelb... rot..?
 
 Hatte noch kein Projekt wo ich die Palette benötigt habe
  |  |  
		| Nach oben |  |  
		|  |  
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 24.04.2012, 06:24    Titel: |   |  
				| 
 |  
				| Ja genau die Art von Effekt meine ich   Mir gehts nur darum zu verstehen wie man sowas angeht.
 |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 |  |  
		| Nach oben |  |  
		|  |  
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 05.05.2012, 15:07    Titel: |   |  
				| 
 |  
				| Die Palette musst du einmal aufbauen. Aus den Screenshtos sollte ja wohl hervorgehen, wie sie aufgebaut sein muss: Weiß -> Gelb -> Rot -> Schwarz. Ansonsten gibt es im ABC-Archiv jede Menge dieser Feuer-Routinen, die man einfach nur noch an FB anpassen muss (Palettenmanipulation über PALETTE statt OUT, Pixel setzen/lesen über PSET/POINT statt PEEK/POKE, etc...). _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 07.05.2012, 18:59    Titel: |   |  
				| 
 |  
				| Ich steig noch nicht so hinter den Paletten Effect  |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 07.05.2012, 22:42    Titel: |   |  
				| 
 |  
				| Mal nebenbei: du musst nicht unbedingt PALETTE verwenden; das dient nur dazu, um später die gewünschten Farben einfacher einsetzen zu können. Mit PALETTE definierst du nur der Reihe nach verschiedene Farbwerte, wie du sie nacheinander in der Farbpalette angeordnet haben willst. _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 08.05.2012, 12:29    Titel: |   |  
				| 
 |  
				|  	  | Zitat: |  	  | Mal nebenbei: du musst nicht unbedingt PALETTE verwenden; das dient nur dazu, um später die gewünschten Farben einfacher einsetzen zu können. Mit PALETTE definierst du nur der Reihe nach verschiedene Farbwerte, wie du sie nacheinander in der Farbpalette angeordnet haben willst. | 
 
 Ok wie gehe ich ohne palette vor?
 Ich denke man wird wohl die höhe der particle (dots) ermitteln und dem entsprechend den farbwert verändert oder irre ich mich da jetzt ?
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 08.05.2012, 15:23    Titel: |   |  
				| 
 |  
				| So im Prinzip wird das laufen. Im einfachen Fall würden Pixel ganz unten am Bildschirm rot, dann, je weiter es nach oben geht, über orange ins gelbe gehen. 
  	  | Code: |  	  | screenres 256, 50, 32 for i as integer = 0 to 255
 pset (i, 25), rgb(255,i,0)
 next
 sleep
 | 
 Jetzt wird man das wohl noch dahingehend modifizieren, dass die Schnelligkeit des Umfärbens zufallsabhängig.ist.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 09.05.2012, 09:22    Titel: |   |  
				| 
 |  
				| Thx nemored 
 So ich habe mich mal ein bischen ans coden gewagt.
 
 
   
 Das wäre die Fire Routine wobei die Farbe mit der höhe der Pixel verrechnet wird.
 
 
   
 Hierbei wird nicht die höhe als farbmischer genommen sondern es wird per frame durchlauf der farbcounter per zufall erhöht.
 
 Kein plan ob eins dieser beiden Dinger gut ausieht.
 Vielleicht hat jemand noch einen Tip fürs design.
 |  |  
		| Nach oben |  |  
		|  |  
		| 0oFreako0 
 
 
 Anmeldungsdatum: 17.12.2011
 Beiträge: 114
 
 
 | 
			
				|  Verfasst am: 09.10.2012, 10:15    Titel: |   |  
				| 
 |  
				| Hi ich habe versucht diesen C code nach Freebasic umzuschreiben doch irgendwas habe ich wohl übersehen oder falsch gemacht denn es ist kein feuer zu sehen. 
 Wenn ich den Divisor veringere gibt es einen absturz, ich denke das er entweder ein Array Overflowed oder irgentwas mit der division nicht stimmt:
 
 Hier der C code:
 
 
  	  | Code: |  	  | #include <cmath>
 #include <string>
 #include <vector>
 #include <iostream>
 
 #include "quickcg.h"
 using namespace QuickCG;
 
 //define the width and height of the screen and the buffers
 const int screenWidth = 640;
 const int screenHeight = 128;
 
 Uint32 fire[screenWidth][screenHeight];  //this buffer will contain the fire
 Uint32 buffer[screenWidth][screenHeight];  //this is the buffer to be drawn to the screen
 Uint32 palette[256]; //this will contain the color palette
 
 int main(int argc, char *argv[])
 {
 //set up the screen
 screen(screenWidth, screenHeight, 0, "fire");
 
 //declarations
 ColorRGB color; //used during palette generation
 float time = getTime(), oldTime; //the time of this and the previous frame, for timing
 
 //make sure the fire buffer is zero in the beginning
 for(int x = 0; x < w; x++)
 for(int y = 0; y < h; y++)
 fire[x][y] = 0;
 
 //generate the palette
 for(int x = 0; x < 256; x++)
 {
 //HSLtoRGB is used to generate colors:
 //Hue goes from 0 to 85: red to yellow
 //Saturation is always the maximum: 255
 //Lightness is 0..255 for x=0..128, and 255 for x=128..255
 color = HSLtoRGB(ColorHSL(x / 3, 255, std::min(255, x * 2)));
 //set the palette to the calculated RGB value
 palette[x] = RGBtoINT(color);
 }
 
 //start the loop (one frame per loop)
 while(!done())
 {
 //timing: set to maximum 50 milliseconds per frame = 20 frames per second
 oldTime = time;
 waitFrame(oldTime, 0.05);
 time = getTime();
 
 //randomize the bottom row of the fire buffer
 for(int x = 0; x < w; x++) fire[x][h - 1] = abs(32768 + rand()) % 256;
 //do the fire calculations for every pixel, from top to bottom
 for(int y = 0; y < h - 1; y++)
 for(int x = 0; x < w; x++)
 {
 fire[x][y] =
 ((fire[(x - 1 + w) % w][(y + 1) % h]
 + fire[(x) % w][(y + 1) % h]
 + fire[(x + 1) % w][(y + 1) % h]
 + fire[(x) % w][(y + 2) % h])
 * 32) / 129;
 }
 
 //set the drawing buffer to the fire buffer, using the palette colors
 for(int x = 0; x < w; x++)
 for(int y = 0; y < h; y++)
 {
 buffer[x][y] = palette[fire[x][y]];
 }
 
 //draw the buffer and redraw the screen
 drawBuffer(buffer[0]);
 redraw();
 }
 }
 
 
 | 
 
 Hier der Freebasic code:
 
 
  	  | Code: |  	  | #Include "fbgfx.bi"
 
 
 Dim screen_width As Double = 640
 Dim screen_height As Double = 128
 
 ScreenRes screen_width,screen_height,32
 
 '---------------------------------
 
 Declare sub SetPixelFast (PosX as integer, PosY as integer, Farbe as uinteger)
 Dim Shared As Byte Ptr framebuffer
 Dim Shared pitch As Integer
 ScreenInfo ,,,,pitch
 
 '---------------------------------
 
 Declare Function min(var1 As Double, var2 As Double) As Double
 
 Declare Function HSV(Byval Hue as Double, Byval Saturation as Double, Byval Value as Double) as UInteger
 Declare Function HSVtoRGB(Byval HSVValue as UInteger) as UInteger
 
 
 Dim _color As UInteger
 Dim fire_palette(256) As UInteger
 Dim fire_buffer(screen_width,screen_height) As UInteger
 
 
 For x As Integer = 0 To screen_width
 For y As Integer = 0 To screen_height
 fire_buffer(x, y) = 0
 Next
 Next
 
 For i As Integer = 0 To 256
 _color = HSVtoRGB(HSV(i / 3,255,min(255,i * 2)))
 fire_palette(i) = _color
 Next
 
 
 Do
 
 
 For x As Integer = 0 To screen_width
 fire_buffer(x,(screen_height - 1)) = abs(32768 + rnd()) mod 256
 Next
 
 For y As Integer = 0 To (screen_height - 1)
 For x As Integer = 0 To (screen_width)
 
 fire_buffer(x,y) = ((fire_buffer((x - 1 + screen_width) Mod screen_width,(y + 1) Mod screen_height)_
 + fire_buffer((x) Mod screen_width,(y + 1) Mod screen_height)_
 + fire_buffer((x + 1) Mod screen_width,(y + 1) Mod screen_height)_
 + fire_buffer((x) Mod screen_width,(y +2) Mod screen_height))*32 ) / 129
 Next
 Next
 
 
 ScreenLock
 
 Line (0,0)-(screen_width,screen_height),0,bf
 
 
 For x As Integer = 0 To screen_width - 1
 
 For y As Integer = 0 To screen_height - 1
 SetPixelFast(x, y, fire_palette(fire_buffer(x, y)))
 Next
 Next
 
 
 ScreenUnLock
 
 Sleep 10
 Loop Until InKey = "q"
 
 
 End
 
 
 
 
 '####################################################
 
 sub SetPixelFast (PosX as integer, PosY as integer, Farbe as UInteger)
 
 framebuffer = ScreenPtr + (PosY * pitch) + (PosX * 4)
 
 Asm
 mov eax,[framebuffer]
 mov ebx,[Farbe]
 mov dword Ptr [eax],ebx
 End Asm
 
 end Sub
 
 '#################################################
 
 Function min(var1 As Double, var2 As Double) As Double
 If var1 < var2 Then
 Return var1
 Else
 Return var2
 EndIf
 
 End Function
 
 '#################################################
 
 Function HSV(Byval Hue as Double, Byval Saturation as Double, Byval Value as Double) as UInteger
 Dim as Integer H,S,V
 H=Hue
 S=Saturation
 V=Value
 
 If     H<0   Then
 Do : H+=360 : Loop While H<0
 ElseIf H>359 Then
 Do : H-=360 : Loop While H>359
 End If
 
 S=IIF(S<0,0,IIF(S>100,100,S))
 V=IIF(V<0,0,IIF(V>100,100,V))
 
 Return (H SHL 16)+(S SHL 8)+V
 End Function
 
 Function HSVtoRGB(Byval HSVValue as UInteger) as UInteger
 Dim as Double Hue,Saturation,Value
 Dim as Double f,p,q,t
 Dim as Double Red,Green,Blue
 
 'Farbton,Sättigung und Helligkeit trennen und Norminieren [0,1]
 Hue        = HiWord(HSVValue)/360
 Saturation = HiByte(LoWord(HSVValue))/100
 Value      = LoByte(LoWord(HSVValue))/100
 
 f = Frac((Hue * 6))
 p = Value * (1-Saturation)
 q = Value * (1-(f*Saturation))
 t = Value * (1-((1-f)*Saturation))
 
 Select Case (Fix(Hue * 6))
 Case 0
 Red   = Value
 Green = t
 Blue  = p
 Case 1
 Red   = q
 Green = Value
 Blue  = p
 Case 2
 Red   = p
 Green = Value
 Blue  = t
 Case 3
 Red   = p
 Green = q
 Blue  = Value
 Case 4
 Red   = t
 Green = p
 Blue  = Value
 Case 5
 Red   = Value
 Green = p
 Blue  = q
 End Select
 
 'Ausgabe Vorbereiten Anteile[0,255]
 Red=Int(Red*255)
 Green=Int(Green*255)
 Blue=Int(Blue*255)
 
 Return RGB(Red,Green,Blue)
 End Function
 
 
 
 
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 09.10.2012, 15:21    Titel: |   |  
				| 
 |  
				| Ich kenne die Feinheiten von C nicht, aber die Erzeugung der Zufallszahl ist auf jeden Fall nicht deckungsgleich. Vergleiche mal http://www.cplusplus.com/reference/clibrary/cstdlib/rand
 mit
 http://fb-referenz.de/RND
 
 
 edit: Die im C-Code verwendete Zufallserzeugung scheint mir sowieso nicht ganz korrekt zu sein. Sie liefert zwar ein schönes Bild, ist aber von der Berechnung her ziemlich unsinnig - warum erst +32768, wenn das dann sowieso durch modulo 256 gejagt wird?
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| Eternal_pain 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1783
 Wohnort: BW/KA
 
 | 
			
				|  Verfasst am: 09.10.2012, 16:25    Titel: |   |  
				| 
 |  
				| Hab den C Code grad nur mal 'überflogen' meine das geht um einiges besser/schneller, die berechnung des Feuers verwirrt mich grad noch (vielleicht blick ich bei der übersetzung besser durch) 
 Freut mich das mein HSV<->RGB Code genutzt wird
   Ist praktisch nur leider verdammt langsam
 Im C Code wird HSL genutzt (was praktisch das gleiche ist)
 Eine Seite die ich im laufe der Zeit mal gefunden habe könnte bei solchen Dingen hilfreich sein
 
 http://www.easyrgb.com/index.php?X=MATH
 
  	  | Code: |  	  | abs(32768 + rand()) % 256
 
 | 
 
 Stimmt, ergibt für mich auch nicht wirklich viel sinn (bis jetzt)
 gibts zu dem C Code auch eine Quelle?
 _________________
 
  |  |  
		| Nach oben |  |  
		|  |  
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 09.10.2012, 16:32    Titel: |   |  
				| 
 |  
				|  	  | Eternal_pain hat Folgendes geschrieben: |  	  | 
  	  | Code: |  	  | abs(32768 + rand()) % 256
 
 | 
 
 Stimmt, ergibt für mich auch nicht wirklich viel sinn (bis jetzt)
 
 | 
 Das macht auch keinen Sinn, unter der Annahme dass die Zufallszahlen gleichverteilt sind ändert sich am Ergebnis genau gar nichts. Vielleicht dachte da einfach nur jemand, dass er damit "schönere" Zufallszahlen bekommt oder was auch immer... Naja jedenfalls bekommt er sie so sicher nicht.
  _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  |  
		| Nach oben |  |  
		|  |  
		| Muttonhead 
 
  
 Anmeldungsdatum: 26.08.2008
 Beiträge: 570
 Wohnort: Jüterbog
 
 | 
			
				|  Verfasst am: 13.10.2012, 18:22    Titel: |   |  
				| 
 |  
				| definitiv OT aber Eternals HSV hat mich dazu inspiriert: 
  	  | Code: |  	  | ' Muttonheads HSV2RGB function HSV2RGB(h as single, s as single=100, v as single=100) as integer
 dim as integer huecase,r,g,b
 if h>=360 then h=0
 'Grundfarbe ermitteln
 if h>=0   and h<60  then huecase=1
 if h>=60  and h<120 then huecase=2
 if h>=120 and h<180 then huecase=3
 if h>=180 and h<240 then huecase=4
 if h>=240 and h<300 then huecase=5
 if h>=300 and h<360 then huecase=6
 select case huecase
 case 1
 r=255
 g=255 * h/60'steigend
 b=0
 case 2
 r=255 - (255 * (h-60) / 60)'fallend
 g=255
 b=0
 case 3
 r=0
 g=255
 b=255 * (h-120)/60'steigend
 case 4
 r=0
 g=255 - (255 * (h-180)/60)'fallend
 b=255
 case 5
 r=255 * (h-240)/60'steigend
 g=0
 b=255
 case 6
 r=255
 g=0
 b=255 - (255 * (h-300)/60)'fallend
 end select
 
 's Sättigung berechnen
 r=255 - (255-r)*s/100
 g=255 - (255-g)*s/100
 b=255 - (255-b)*s/100
 
 'v Helligkeit berechnen
 r *=v/100
 g *=v/100
 b *=v/100
 function=RGB(r,g,b)
 end function
 
 screen 19,32
 dim as integer posx,posy
 posx=0
 posy=0
 
 for v as single=100 to 0 step -5
 for s as single=100 to 0 step -5
 for h as single=0 to 360 step .5
 pset (posx,posy),HSV2RGB(h,s,v)
 posx +=1
 next h
 posx=0
 posy +=1
 next s
 posx=0
 next v
 sleep
 | 
 
 aber vllcht lieg ich auch total daneben
 
 Mutton
 |  |  
		| Nach oben |  |  
		|  |  
		| Eternal_pain 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1783
 Wohnort: BW/KA
 
 | 
			
				|  Verfasst am: 13.10.2012, 19:30    Titel: |   |  
				| 
 |  
				| Habs nicht genau getestet, aber augenscheinlich scheint es korrekt... 
 kleine Verbesserungen;
 
  	  | Code: |  	  | h = (h mod 360)
 'Grundfarbe ermitteln
 huecase = (h\60)+1
 
 | 
 müsste glaube richtig funktionieren so...
 _________________
 
  |  |  
		| Nach oben |  |  
		|  |  
		| Muttonhead 
 
  
 Anmeldungsdatum: 26.08.2008
 Beiträge: 570
 Wohnort: Jüterbog
 
 | 
			
				|  Verfasst am: 13.10.2012, 20:59    Titel: |   |  
				| 
 |  
				| jau...   
 Kurze Frage noch zu deinem Code:
 
  	  | Code: |  	  | Hue        = HiWord(HSVValue)/360 Saturation = HiByte(LoWord(HSVValue))/100
 Value      = LoByte(LoWord(HSVValue))/100
 | 
 
 die Berechnung/Ermittlung der Prozente/Grad erfolgt nach obigen Schema
 Indirekt rechnest du da mit ganzen Zahlen: erreichst du damit alle 16 mio Farben? Ich komme da "nur" auf  360*100*100.
 Aber dieses Problem haben dann ja wohl alle GFX Programme die die HSV Werte über Slider einstellen
 
 Mutton
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  |