Seite 4 von 7

Verfasst: 12.11.2004 16:38
von Robert Wünsche
aha, soll das spiel ne dvd füllen ?
Also einige mb ist ganz gut und schön aber gleich 30 für einen einzigen planeten ... neeee !
Ich geb dir mal einen tipp:
Erfinde nen bmp kodierer und bau dir dein "video"spiel !

Und das mit dem sincos zeug: ne 3d engine ist viel komplitzierter:
mit matrizen
mit relativ und absolut
mit winkelberechnungen
mit hardwarehunger !

Sowas verrücktes ... ne dvd !
:lol: :lol: :lol:
Das is so lustig.

Nein !
Das geht einfach nicht, bei sovielen bildern kannst du das vergessen !
Denk dir was anderes aus !

Verfasst: 12.11.2004 16:51
von Kaeru Gaman
also, nochmal langsam zum mitschreiben....

der 'testplanet' in 512x512 grafik mit 720 frames hat 3097KB, das sind knapp 3MB.... die endgültige grösse wird wohl ungefähr genauso gross sein... bei 1440 frames komm ich dann auf ca.6, max 10mb...

FÜR DEN HINTERGRUND DES HAUPTMENUS....

den kann ich aus dem speicher schmeissen, wenn das spiel läuft...

für im spiel brauche ich dann 1 BMP für den planeten und 1 BMP für den schatten, natürlich pro planetentyp [planetentypen (grob): Merkur, Venus, Erde, Mars, Jupiter, Saturn, Neptun, Mond]
'ne 512x512 24bit BMP hat gerade mal 768KB (als 16bit im speicher sind das 512KB), also

Don't Panic

PS: ich ergänze mal meine signatur...

Verfasst: 12.11.2004 16:57
von Robert Wünsche
achso !
trotzdem :
10 mb * 9 ? = 90 MB
Wass soll denn das werden ?
Irgentwie glaube ich, dass dass etwas zu viel des guten ist !

Verfasst: 12.11.2004 17:04
von Kaeru Gaman
nochmal langsamer zum genau mitschreiben...

die 10MB brauche ich EINMAL für das hauptmenu...

für die ingame grafix sind das 10(typen)*1.5MB = 15MB

+ 5x Zentralgestirn (5Farben) ohne schatten (768KB) = 3.25MB
+ die stationen und raumschiffe..

im speicher: 10MB für die planeten, 2.5MB für die sterne
... da hab ich noch reichlich platz für den rest:
2 screens 1024x768 16bit = 3MB
zus. 10+3+2.5 =15.5
64MB (sollte jeder haben) -15.5
= 48.5MB Grafikkartenspeicher noch frei... das klotze ich NIE zu

...ausserdem kann ich die GRfx auf der CD ja komprimieren...
...eine CD sollte locker reichen...

Verfasst: 12.11.2004 17:07
von Kaeru Gaman
btw... ich träume davon, ein gaanz, gaanz fettes 3D-Weltraum-1stPersonView-Strategie-Aufbau-Adventure zu schreiben... in ferner, ferner Zukunft... (das werd ich dann nicht alleine machen..logisch)

aber dafür brauche ich dann ein 64bit OpenGL, 32bit ist für die grösse nicht ausreichend...

Verfasst: 12.11.2004 17:19
von Robert Wünsche
das dauert noch jahre !
wo leben wir eigentlich ?
Genau:
In einer traumwelt, wo alle superhochintelligent sind und jeder in die zukunftgucken kann ...

Neeeee !
64 bit ?

--32 Bit, moment: 4'294'967'296 Möglichkeiten
--64 Bit : 18'446'744'073'709'551'616 Möglichkeiten ...
der unterschied ist zwar gewaltig aber für so ein weltraumspiel reicht auch float, mit etwas übung sogar long :mrgreen: .
Diese doubler ...
Das kommt (warscheinlich) mit pb v. 4.0

Verfasst: 12.11.2004 17:47
von Kaeru Gaman
floats sind unzureichend... sind zwar sehr genau im bereich um null,
aber im hohen bereich kannst du sie vergessen....
er kann
3'356'987'756'356'256.576 nicht von
3'356'987'756'356'958.765 unterscheiden....

mit 32bit komme ich bei 1mm pro einheit auf maximal 4294km im gesamten OpenGL-Raum, das reicht gerade mal für enin mond, nix weltraum drumrum... und 1mm braucht man bestimmt, du willst doch deine figuren auch drehen können

es geht darum, in einem einzigen OpenGL-Raum eine ganze galaxis darzustellen... mit detaillierten vorgängen auf jedem planeten...
... das ganze wäre ein online-game
... so 'ne art "Galaxy of Starcraft" analog zu "World of Warcraft"
... klar, der server müsste dann ein paar Tera-Hertz Taktfrequenz und etliche Terabyte Plattenspeicher haben...
... 64bit kann 16mio Terabyte Hauptspeicher verwalten...
... du weisst doch wie schnell die entwicklung geht...

dazu folgende , niedliche tabelle:

Code: Alles auswählen

Adrsierb. Bit der       zugehörige 2^x                  Entfernung pro Bit wenn
Speicher  Adresse       natürliche Zahl                 gesamt = 100000LJ(Galaxie)
----------------------------------------------------------------------------------
256 Byte    8 Bit *                               256   3.698e13 m
 64 Kilo   16 Bit *                            65.536   1.444e11 m
 16 Mega   24 Bit                          16.777.216   5.643e8  m
  4 Giga   32 Bit *                     4.294.967.296   2.204e6  m
  1 Tera   40 Bit                   1.099.511.627.776   8.610e3  m  (=8.6km)
256 T      48 Bit                 281.474.976.710.656   3.365e1  m  (=33.65m)
 64 T+1    56 Bit              72.057.594.037.927.936   13.14 cm
 16 T+2    64 Bit *        18.446.744.073.709.551.616   0.513 mm = genug
  4 T+3    72 Bit       4.722.366.482.869.645.213.696              für ein Gesicht
  1 T+4    80 Bit ~ 1.208.925.819.614.629.174.706.176   
256 T+4    88 Bit  
 64 T+5    96 Bit^      !  64 bit kann mimik in der  !
 16 T+6   104 Bit       !     Galaxis darstellen     !
  4 T+7   112 Bit  
  1 T+8   120 Bit ~
256 T+8   128 Bit * 3.403e38 ist der nächste schritt    3.594 Trillionen
 64 T+9   136 Bit   --------------------------------    Galaxiedurchmesser
 16 T+10  144 Bit   3.6e18 (Trio) Gal - 100µ            bei 1/10mm Einheit 
  4 T+11  152 Bit   3.6e15 (Bia)  Gal - 100nm (Nano)    stellt das ganze bekannte
  1 T+12  160 Bit ~ 3.6e12 (Bio)  Gal - 100pm (Pico)    Universum in einem
256 T+12  168 Bit   3.6e09 (Mia)  Gal - 100Am (Atto)    Vektorraum dar
 64 T+13  176 Bit   3.6e06 (mio)  Gal - 100Fm (Femto)=> 36 Milliarden Galax
 16 T+14  184 Bit                                       bei PicoMeter-Einheit
  4 T+15  192 Bit *
  1 T+16  200 Bit ~
256 T+16  208 Bit
 64 T+17  216 Bit
 16 T+18  224 Bit
  4 T+19  232 Bit
  1 T+20  240 Bit
256 T+20  248 Bit
 64 T+21  256 Bit *

es hat für mich den anschein, als ob in einem 26dimensionalen Datenfeld
mit 256bit Variablen als Koordinaten ein 1-bit Wert pro Feld
ausreichen würde, das gesamte EXISTIERENDE Universum zu beschreiben !!!

Ouch. Der Sieg der Mathematik über Verstand und Realität !!!
.... die tabelle hab ich mir mal gemacht, um zu sehen, mit wieviel bit man wieviel machen kann...

... für das kleine programm, wo die Panetenbahnen aus den Massen und Geschindigkeiten berechnet wurden (auch in PB, gabs hier irgendwo zum runterladen) hat der progger 80bit-Variablen benutzt (eigene maths gecodet)
Robert hat geschrieben:In einer traumwelt...
... wenn du deine träume vergisst, hörst du auf, kreativ zu sein...

Verfasst: 12.11.2004 17:59
von Robert Wünsche
gggggg
du machst schertze ...
wenn du deine träume vergisst....
Wie sind nicht in der traumwelt, und ich muss meine träume vergessen, weil ich sonnst rumträum !

Proge doch dei zahlensystem einfach selbst !
mehr fällt mir dazu nicht ein !

Verfasst: 13.11.2004 12:00
von Danilo
Kaeru Gaman hat geschrieben:jetzt muss ich nurnoch den AVI in ein sprite bekommen, das
wird noch mal spannend...

... hast du da nicht nähere tipps dazu, danilo ?
Habe soeben gesehen das es mit PB3.30 noch nicht möglich
war auf Sprites zu rendern. Das kam erst mit PB 3.70, Juni 2003.

Naja, das Beispiel für Dich hatte ich jetzt schon fertig. Vielleicht
wirst Du irgendwann mal updaten, und kannst es dann probieren:

Code: Alles auswählen

;
; by Danilo, 13.11.2004 - german forum
;
#SCREEN_W = 1024
#SCREEN_H = 768

#NAME_MOVIE  = "data\back.avi"
#NAME_STATIC = "data\back.bmp"

#TYPE_MOVIE  = 1
#TYPE_STATIC = 2

#SPR_BCKGRND = 1
#SPR_CURSOR  = 2


Structure MouseCursor
 sprite.l
 width.l
 height.l
 offX.l
 offY.l
EndStructure


Procedure CatchMouseCursor(sprite,*mem.LONG)
  ;
  ; create new mouse cursor
  ;
  If *mem
    width  = *mem\l : *mem+SizeOf(LONG)
    height = *mem\l : *mem+SizeOf(LONG)
    offX   = *mem\l : *mem+SizeOf(LONG)
    offY   = *mem\l : *mem+SizeOf(LONG)
    If width And height ; check > 0
      *new_cursor.MouseCursor = AllocateMemory( SizeOf(MouseCursor) )
      If *new_Cursor
        *new_Cursor\sprite = sprite
        *new_Cursor\width  = width
        *new_Cursor\height = height
        *new_Cursor\offX   = offX
        *new_Cursor\offY   = offY
        If CreateSprite(sprite,width,height)
          If StartDrawing(SpriteOutput(sprite))
            For y = 1 To height
              For x = 1 To width
                Plot(x,y,*mem\l) : *mem+SizeOf(LONG)
              Next x
            Next y
            StopDrawing()
            ProcedureReturn *new_Cursor
          EndIf
        EndIf
        FreeMemory(*new_Cursor)
      EndIf
    EndIf
  EndIf
EndProcedure


Procedure DisplayCursor(*Cursor.MouseCursor,x,y)
  If *Cursor
    DisplayTransparentSprite(*Cursor\sprite,x - *Cursor\offX,y - *Cursor\offY)
  EndIf
EndProcedure




If InitSprite() And InitMovie() And InitKeyboard() And InitMouse()

  If OpenScreen(#SCREEN_W,#SCREEN_H,32,"playmovie")=0
    If OpenScreen(#SCREEN_W,#SCREEN_H,24,"playmovie")=0
      If OpenScreen(#SCREEN_W,#SCREEN_H,16,"playmovie")=0
        MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
  EndIf:EndIf:EndIf

  If LoadMovie(#SPR_BCKGRND,#NAME_MOVIE)
    back_type = #TYPE_MOVIE

    Width  = MovieWidth()
    Height = MovieHeight()

    back_sprite = CreateSprite(1,Width,Height) ; #SCREEN_W,#SCREEN_H fr fullscreen
    If back_sprite = 0
      ; Fehler, nicht mal Sprite kann erstellt werden
      CloseScreen()
      MessageRequester("ERROR","Cant create sprite !",#MB_ICONERROR):End
    EndIf
    
    MovieLength = 1000 + MovieLength()*1000/(MovieInfo(0)/1000) ; milliseconds
  Else
    ; movie konnte nicht geladen werden:
    ; kein grund das spiel abzubrechen, also
    ; alternativ ein hintergrundbild laden.
    ; Ist zwar dann nicht animiert, aber man
    ; kann das spiel trotzdem nutzen.
DisableDebugger
    If LoadSprite(#SPR_BCKGRND,#NAME_STATIC)
      back_type = #TYPE_STATIC
      
      Width  = SpriteWidth (#SPR_BCKGRND)
      Height = SpriteHeight(#SPR_BCKGRND)
    EndIf
EnableDebugger
  EndIf

  ; init mouse cursor
  mouse = CatchMouseCursor(#SPR_CURSOR,?cursor_arrow)

  ; start movie
  If back_type = #TYPE_MOVIE
    PlayMovie(#SPR_BCKGRND,#PB_Movie_Rendered)
    StartTime = timeGetTime_()
  EndIf

  Repeat
    ExamineKeyboard()
    ExamineMouse()
    If IsScreenActive()
      ClearScreen(0,0,0)
      
      If back_type = #TYPE_MOVIE
        If (timeGetTime_()-StartTime) >= MovieLength
          ; wenn movie fertig, restarten
          ;MovieSeek(1)
          PlayMovie(#SPR_BCKGRND,#PB_Movie_Rendered)
          StartTime = timeGetTime_()
        EndIf
        ; wenn movie, dann frame auf sprite rendern
        RenderMovieFrame(back_sprite)
      EndIf

      If back_type
        ; wenn movie oder static sprite fr
        ; hintergrund, dann anzeigen, sonst
        ; einfach ohne hintergrund
        DisplaySprite(#SPR_BCKGRND,#SCREEN_W/2-Width/2,#SCREEN_H/2-Height/2)
      EndIf

    EndIf
    
    ; show mouse cursor
    If mouse
      DisplayCursor(mouse,MouseX(),MouseY())
    EndIf
    
    FlipBuffers()
    ;Delay(10)
  Until KeyboardPushed(#PB_KEY_ESCAPE)
EndIf


#blk = $080808
#wht = $FFFFFF

DataSection

  cursor_arrow:
    Data.l  12, 21  ; width & height
    Data.l   0,  0  ; offX  & offY (Cursor "HotSpot")
    Data.l #blk, 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0
    Data.l #blk,#blk, 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0
    Data.l #blk,#wht,#blk, 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#blk, 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#wht,#blk, 0  , 0  , 0  , 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#wht,#wht,#blk, 0  , 0  , 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#wht,#wht,#wht,#blk, 0  , 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#wht,#wht,#wht,#wht,#blk, 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#wht,#wht,#wht,#wht,#wht,#blk, 0  , 0  , 0
    Data.l #blk,#wht,#wht,#wht,#wht,#wht,#wht,#wht,#wht,#blk, 0  , 0
    Data.l #blk,#wht,#wht,#wht,#wht,#wht,#wht,#wht,#wht,#wht,#blk, 0
    Data.l #blk,#wht,#wht,#wht,#wht,#wht,#wht,#blk,#blk,#blk,#blk,#blk
    Data.l #blk,#wht,#wht,#wht,#blk,#wht,#wht,#blk, 0  , 0  , 0  , 0
    Data.l #blk,#wht,#wht,#blk,#blk,#wht,#wht,#blk, 0  , 0  , 0  , 0
    Data.l #blk,#wht,#blk, 0  , 0  ,#blk,#wht,#wht,#blk, 0  , 0  , 0
    Data.l #blk,#blk, 0  , 0  , 0  ,#blk,#wht,#wht,#blk, 0  , 0  , 0
    Data.l #blk, 0  , 0  , 0  , 0  , 0  ,#blk,#wht,#wht,#blk, 0  , 0
    Data.l  0  , 0  , 0  , 0  , 0  , 0  ,#blk,#wht,#wht,#blk, 0  , 0
    Data.l  0  , 0  , 0  , 0  , 0  , 0  , 0  ,#blk,#wht,#wht,#blk, 0
    Data.l  0  , 0  , 0  , 0  , 0  , 0  , 0  ,#blk,#wht,#wht,#blk, 0
    Data.l  0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  ,#blk,#blk, 0  , 0

EndDataSection
Wenn Video geladen werden kann, wird das Video im Hintergrund auf
einem Sprite abgespielt. Wenn Video nicht geladen werden kann, dann
wird versucht ein Hintergrundbild zu laden. Schlägt das auch fehl, wird
kein Hintergrund angezeigt.

Mußt dann nur noch Deinen GameScreen dazumachen - MausZeiger
ist schon da. ;)

Verfasst: 13.11.2004 15:12
von Kaeru Gaman
@Danilo

mercí vielmalsch.

ich werd wohl nur die info's brauchen, meine procs und grafix mache ich normal selber... trotzdem vielen dank... :wink:

... ich hab mir die CD von André bestellt, sollte anfang nächster woche kommen. dann ist endlich schluss mit dem 3.30 'rumgehänge :mrgreen:

...btw ich seh grad, du hast da ein Delay(10) in der Schleife.. wieso denn das ? FlipBuffers synct doch mit der framerate, die ich vorher setzen kann... jedenfalls bei 3.30...