Bitte Kritik - Entity-Positionierungs-Routine
Übersicht

martin_moehlerBetreff: Bitte Kritik - Entity-Positionierungs-Routine |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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... ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
martin_moehler |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() ![]() 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!! ![]() |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habs zwar nicht ausprobiert, glaube aber das
funktioniert sehr wohl ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
martin_moehler |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also bei mir auf jeden Fall! ![]() 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group