 |
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, 21: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: 4700 Wohnort: ~/
|
Verfasst am: 22.04.2012, 22: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, 14: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, 18: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, 07: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, 16: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, 19:59 Titel: |
|
|
Ich steig noch nicht so hinter den Paletten Effect  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 07.05.2012, 23: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, 13: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: 4700 Wohnort: ~/
|
Verfasst am: 08.05.2012, 16: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, 10: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, 11: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: 4700 Wohnort: ~/
|
Verfasst am: 09.10.2012, 16: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, 17: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, 17: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: 565 Wohnort: Jüterbog
|
Verfasst am: 13.10.2012, 19: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, 20: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: 565 Wohnort: Jüterbog
|
Verfasst am: 13.10.2012, 21: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.
|
|