Bitte Kritik - Entity-Positionierungs-Routine

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

martin_moehler

Betreff: Bitte Kritik - Entity-Positionierungs-Routine

BeitragDi, Jun 17, 2008 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme mal an, dass ich nicht der erste bin mit dieser Idee, aber ich hatte sie jetzt nicht im Forum gefunden und da dachte ich ich stell sie mal rein.

Im grunde geht es darum, dass man in eine 256*256 bmp einfache Pixel mahlt, die dann in Blitz Basic ausgelesen weden und als Koordinaten für die meshes dienen.

Dazu benötigt man eine 256*256 bmp (Änderungen logischer Weise möglich),
eine Legende, d.h. welch Farbe für welches Objekt, die geladenen Meshes und ein Terrain.

Momentan muss man für jedes neue Objekt die Funktion aufrufen und dann werden sie auf dem Terrain gesetzt.

Code: [AUSKLAPPEN]

Function EntityMap (pic,coll,entity,ter) ;(pic=MeshMap,coll=Farbe auf die überprüft wird(Hex-schreibweise,entity=das entsprechende Objekt zu der Farbe, ter=terrain)
   Local col
   
   SetBuffer ImageBuffer(pic)
   For x = 1 To 256
      For y = 1 To 256
         col = ReadPixel(x,y)
         If col = coll Then
            x_c= x*(TerrainSize(ter)*2.5/256) ;auf 2.5 hab ich mein terrain ge-scaled
            y_c= y*(TerrainSize(ter)*2.5/256)
            PositionEntity entity,x_c,TerrainY(ter,x_c,0,y_c) ,y_c
            ShowEntity entity
            entity =CopyEntity (entity)
         End If
      Next   
   Next
   
   SetBuffer BackBuffer()
End Function


Ich würde mich sehr über ein paar Kritiken freuen.
MFG Martin
  • Zuletzt bearbeitet von martin_moehler am Sa, Jun 21, 2008 0:29, insgesamt 2-mal bearbeitet

ToeB

BeitragDi, Jun 17, 2008 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde z.b. die Objecte alle in Arrays lesen, also :
Code: [AUSKLAPPEN]
For i = 1 to 5
    Obj(i) = LoadMesh("Mesh"+i+".b3d") ; oder so
Next


Dann würde ich ein Data Feld anlegen :
Code: [AUSKLAPPEN]
Data $FF00FF;Hexadezimal
Data $0000FF


Exclamation
Achte darauf das die Farb codes genau in der reihen folge wie sie im array stehen geladen werden, also
wenn du die Farbe des ersten Data feldes im Bild hast, und dann willst du z.b. ein Auto dahin machen, das dann nicht eine Kiste dahin kommt sondern auch das Auto

Exclamation

Dann brauchst du euneut ein Array :
Code: [AUSKLAPPEN]
Dim FarbCode(5)
For i = 1 to 5
    Read FarbCode(i);Aus Data Farbcode auslesen
Next


Dann prüfst du in einer Schleife :
Code: [AUSKLAPPEN]
wert = 0
For i = 1 to 5
    If FarbCode(i) = Pixel then wert = i
Next
If wert > 0 CopyEntity(Obj(wert))


So kannst du das ganz einfach lösen...

Very Happy

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

martin_moehler

BeitragDi, Jun 17, 2008 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
cool vielen Dank für die antwort und die guten tips!!
Meine Idee war onehin noch nicht ausgereift!
Ich werd sehen, dass ich deine Vorschläge in programcode umwandeln kann.
Smile
 

martin_moehler

BeitragSa, Jun 21, 2008 3:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Und hier mein Ergebnis:

Ich habs noch etwas anders gemacht. Man braucht für jedeb *.3ds die entsprechende *.bmp (1 pixel) in der man den Farbwert eintzeichnet. Ich denke das ist angenehmer zu handhaben, als jedesmal den Farbwert zu ermitteln und dann manuell in den Programmcode einzuarbeiten!

Mann benennt also alle seine Meshes: "mesh"+X+".3ds" und die Bitmap mit "pic"+X+".bmp" wobei X als Nummerierung fungiert. Exclamation Man fängt bei 1 an zu zählen. Die Anzahl der verschiedenen Objekte muss mit mesh_count global definiert werden Exclamation
Code: [AUSKLAPPEN]


Global mesh_count = 2 ;Die Anzahl an verschieden Objekten die man laden möchte

Dim Mesh(mesh_count-1)
Dim Farbe(mesh_count-1)
Dim ent_count(mesh_count-1)
Dim Count(mesh_count-1)

Dim Entities(1,1)
For i = 0 To mesh_count-1
   Mesh(i)=LoadMesh("gfx/mesh"+(i+1)+".3ds")   ;-->Hilfe:    Zählung der Ojekte beginnt ab 1, die Anzahl aller Objekte muss globalisiert werden!!!!
   farb_pic=LoadImage("gfx/pic"+(i+1)+".bmp")   ;         Bilder müssen an 1,1 den Farbwert haben!
   SetBuffer ImageBuffer(farb_pic)
   Farbe(i)=ReadPixel(0,0,ImageBuffer)
   Select i
      Case 0      ; Hochhaus   
         haus_tex = LoadTexture("gfx/Model_uv.jpg")
         haus_bum = LoadTexture("gfx/Model_bum.jpg")
            
         EntityTexture Mesh(0),haus_bum,0,0
         EntityTexture Mesh(0),haus_tex,0,1
         TextureBlend haus_bum,4
         TextureBlend haus_tex,5
         EntityFX Mesh(0),2
         ScaleEntity Mesh(0),15,15,15
      Case 1      ;Baum
         ScaleEntity Mesh(1),2,2,2
   End Select
   
   HideEntity Mesh(i)
   EntityType Mesh(i),2
Next
FreeImage farb_pic
SetBuffer BackBuffer()
Global pic = LoadImage("gfx/entity_map.bmp")
EntityMap (pic, ter, 2.5)
FreeImage pic



Function EntityMap (map,ter,ter_scale=1)
   Local col
   SetBuffer ImageBuffer(map)
   LockBuffer
   For x = 0 To 255                        ;Dimensionierung des Arrays Entities,
      For y = 0 To 255                     ;in dem später alle Entities
         col=ReadPixelFast(x,y)               ;gespeichert werden
         For i = 0 To mesh_count-1
            If col = Farbe(i) Then
               Dim Entities(i,Count(i))
               Count(i)=Count(i) + 1
            End If
         Next
      Next
   Next
   Dim Count(mesh_count-1)                  ;Array zurücksetzen
   For x = 0 To 255
      For y = 0 To 255
         col = ReadPixelFast(x,y)
         For i = 0 To mesh_count-1
            If col = Farbe(i) Then
               Entities(i,Count(i))=CopyEntity(Mesh(i))
                              
               x_c= x*(TerrainSize(ter)*ter_scale/256)
               y_c= y*(TerrainSize(ter)*ter_scale/256)
            
               PositionEntity Entities(i,Count(i)),x_c,TerrainY(ter,x_c,0,y_c) ,y_c
               ShowEntity Entities(i,Count(i))
               EntityPickMode(Entities(i,Count(i)),2)   ;Nur in meinem Programm notwendig =)
               Count(i)=Count(i) + 1
            End If
         Next
      Next   
   Next
   UnlockBuffer ImageBuffer(map)
   SetBuffer BackBuffer()
End Function



Wieder bitte ich um Kritik!! Very Happy

ozzi789

BeitragSa, Jun 21, 2008 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs zwar nicht ausprobiert, glaube aber das
funktioniert sehr wohl Very Happy
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

martin_moehler

BeitragSo, Jun 22, 2008 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir auf jeden Fall! Very Happy
Ich arbeite jetzt noch an ner Erweiterung. Ich hab noch ne zweite Function in der Gras erstellt wird,
das über die EntityMap quasi positioniert werden kann.
Die Funktion ist jedoch anders, da ich sonst tausende Meshes hätte...
Wenn das fertig ist, stell ichs auch rein.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group