überschneidung von häusern über mehrere felder

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

überschneidung von häusern über mehrere felder

Beitrag von Purebasium »

hallo,
ich habe folgendes Verständnis Problem:
ich entwickle eine Stadt-Aufbausimulation, bei welcher man Häuser bauen und nutzen kann.
Alle Häuser Kann man auf einem Kachel-System frei setzen, dabei ist ein Haus z.b. 4 Kacheln groß.
Nun habe ich eine map erstellt, bei welcher das haus auf der kachel oben links gespeichert wird

Code: Alles auswählen


___________________________
|  |  |  |  |  |  |  |  |  |
___________________________
|  |  |  |S |H |H |H |  |  |
___________________________
|  |  |  |H |H |H |H |  |  |
___________________________
|  |  |  |H |H |H |H |  |  |
___________________________
|  |  |  |H |H |H |H |  |  |
___________________________
|  |  |  |  |  |  |  |  |  |

Legende:
H: das Haus
s: das map Feld auf dem das Haus gespeichert wird
alles Andere:Leer



Nun habe wollt ich natürlich, dass man keine Häuser ineinander bauen kann
d.h. man kann in einem Quadrat mit dem abstand 4 zum S ein weiteres s setzten

Und hier der Code

Code: Alles auswählen

Global Dim MapDaten(240, 240)

  For Arrayz = 1 To 240 
    For ArrayX = 1 To 240
      MapDaten(Arrayx, Arrayz) = 0
  
    Next 
  Next 
;zwei test Häuser
MapDaten(1, 1) = 1

MapDaten(5, 1) = 1



Procedure objsetzen(x,z);haus setzten
  Shared hausid
 
  
  xmin=x-4
  xmax=x+4
  zmin=z-4
  zmax=z+4
  
  hausnichtbauen=0
  For ax = xmin To xmax 
    For az = zmin To zmax
      
     If mapdaten((ax+6000)/50,(az+6000)/50)=1
       hausnichtbauen=1
     EndIf
   Next az
  Next ax
  
  
  

  If Not hausnichtbauen =1
    mapdaten((x+6000)/50,(z+6000)/50)=1;jede kachel ist 50*50 groß
     ProcedureReturn 1
  Else
  ProcedureReturn 0
  EndIf
        
EndProcedure




objsetzen(1,1)
if objsetzen(3,2)= 1
Debug "Wenn man das lesen kann funzt es nicht"
endif

Nun kann ich trotzdem noch Häuser ineinander bauen wenn ich die procedure aufrufe.

Kann mir jemand helfen
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: überschneidung von häusern über mehrere felder

Beitrag von NicTheQuick »

Ich hab zuerst nicht gewusst, wo da jetzt diese Hs abgespeichert werden sollen, aber damit wolltest du ja nur sagen, dass das zwar das Haus ist, aber das so nicht in der Map gespeichert wird.

Meine Idee dafür sieht so aus.

Code: Alles auswählen

#WIDTH = 10
#HEIGHT = 10

#HOUSE_SIZE = 4

Global Dim MapData(#WIDTH, #HEIGHT)

Procedure ClearMapData()
	Shared MapData()
	
	Protected z.i, x.i
	For z = 0 To #HEIGHT - 1
		For x = 0 To #WIDTH - 1
			MapData(x, z) = '.'
		Next
	Next
EndProcedure

Procedure isHouse(posX, posZ)
	If (posX < 0 Or posZ < 0 Or posX + #HOUSE_SIZE >= #WIDTH Or posZ + #HOUSE_SIZE >= #HEIGHT)
		ProcedureReturn #False
	EndIf	
	
	Protected xMin.i = posX - #HOUSE_SIZE + 1
	Protected zMin.i = posZ - #HOUSE_SIZE + 1
	
	If (xMin < 0) : xMin = 0 : EndIf
	If (zMin < 0) : zMin = 0 : EndIf
	
	Shared MapData()
	
	For x = xMin To posX
		For z = zMin To posZ
			If MapData(x, z) = 'S'
				ProcedureReturn #True
			EndIf
		Next
	Next
	
	ProcedureReturn #False
EndProcedure

Procedure SetHouse(posX, posZ)
	If (Not isHouse(posX, posZ))
		MapData(posX, posZ) = 'S'
	EndIf
	
	ProcedureReturn setHouse
EndProcedure

Procedure ShowMapData()
	Shared MapData()
	
	Protected x.i, z.i
	
	OpenConsole()
	
	For z = 0 To #HEIGHT - 1
		For x = 0 To #WIDTH - 1
			Protected field.i = MapData(x, z)
			If (field = '.' And isHouse(x, z))
				field = 'H'
			EndIf				
			Print(Chr(field))
		Next
		PrintN("")
	Next
	Input()
	CloseConsole()
EndProcedure

ClearMapData()

setHouse(1, 1)

ShowMapData()

If SetHouse(3, 2)
	Debug "Wenn man das setzen kann funzt es nicht"
Else
	Debug "Juhu!"
EndIf
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: überschneidung von häusern über mehrere felder

Beitrag von Purebasium »

ich habe hier mal einen Teil meines Codes:



Code: Alles auswählen

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 20
#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0
Define.f KeyX, KeyY, MouseX, MouseY


Global Dim MapDaten(240, 240)


Procedure Weltdefinieren() 

  For Arrayz = 1 To 240 
    For ArrayX = 1 To 240
      MapDaten(Arrayx, Arrayz) = 0
     ; Debug Val(ReadString(0))
    Next 
  Next 

EndProcedure 

Weltdefinieren()

MapDaten(1, 1) = 1

MapDaten(5, 1) = 1

MapDaten(240, 240) = 1


Procedure Weltausgeben() 
  Shared hausid
  For Arrayz = 1 To 240
    For ArrayX = 1 To 240
 
      
      
      If MapDaten(Arrayx, Arrayz) = 1 
        CreateEntity(hausid,MeshID(1),#Null,ArrayX*50-6000,1000,Arrayz*50-6000)
        ScaleEntity(hausid,0.1,0.1,0.1)
       Debug hausid
     hausid+1
     ElseIf MapDaten(Arrayx, Arrayz) = 0

      Else 
  
      EndIf 
    Next 
  Next 
EndProcedure



Procedure objsetzen(x,z)
  Shared hausid
  Shared mapdaten()
  
  
  ;Debug "x:"+Str((x+6000)/50)
  ;Debug "z:"+Str((z+6000)/50)
  
  xmin=x-4
  xmax=x+4
  zmin=z-4
  zmax=z+4
  
  
  
  hausnichtbauen=0
  For ax = xmin To xmax 
    For az = zmin To zmax
      
     If Not mapdaten((ax+6000)/50,(az+6000)/50)=0
       hausnichtbauen=1
     EndIf
   Next az
  Next ax
  
  
  
  Debug hausnichtbauen
  If Not hausnichtbauen =1

      For ax = xmin To xmax 
    For az = zmin To zmax
      
      mapdaten((ax+6000)/50,(az+6000)/50)=2
      
     
   Next az
  Next ax
    
        mapdaten((x+6000)/50,(z+6000)/50)=1
    
     ProcedureReturn 1
  Else
  ProcedureReturn 0
  EndIf
        
EndProcedure


Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure


 hausid=200

; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    Add3DArchive("Data/Textures/"       , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures/nvidia" , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/models/"       , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/GUI"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()
    
    WorldShadows(#PB_Shadow_Modulative, -1, RGB(105, 105, 105))
    
    ;- Light 
    ;
    light = CreateLight(#PB_Any ,RGB(255, 255, 255), 4000, 1200, 1000,#PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4)) 
    LightDirection(light ,0.55, -0.3, -0.75) 
    AmbientColor(RGB(255*0.2, 255*0.2,255*0.2))
        
    ;- Camera 
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0,  0, 400, 0, #PB_Absolute)
    CameraBackColor(0, RGB(5, 5, 10))
    
    
    
     
     CreateMaterial(10, LoadTexture(10, "smoke.png"))
 DisableMaterialLighting(10, 1)
    MaterialBlendingMode   (10,#PB_Material_AlphaBlend )
    
    
    ;----------------------------------
    ; terrain definition
    SetupTerrains(LightID(Light), 9000, #PB_Terrain_NormalMapping)
    ; initialize terrain 
    CreateTerrain(0, 513, 12000, 1000, 4, "TerrainShadow", "dat")
    ; set all texture will be use when terrrain will be constructed 
    AddTerrainTexture(0,  0, 100, "dirt_grayrocky_diffusespecular.jpg",  "dirt_grayrocky_normalheight.jpg")
    AddTerrainTexture(0,  1,  30, "grass_green-01_diffusespecular.jpg", "grass_green-01_normalheight.jpg")
    AddTerrainTexture(0,  2, 200, "growth_weirdfungus-03_diffusespecular.jpg", "growth_weirdfungus-03_normalheight.jpg")
    
    ; construct terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)  
      Next
    Next  
    BuildTerrain(0)  
    
    ;InitBlendMaps
    minHeight1.f = 70
    fadeDist1.f = 40
    minHeight2.f = 70
    fadeDist2.f = 15    
  
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        Size = TerrainTileLayerMapSize(0, tx, ty)
        For y = 0 To Size-1
          For x = 0 To Size-1
            Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)
            
            val.f = (Height - minHeight1) / fadeDist1
            Clamp(@val, 0, 1)
            SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)
            
            val.f = (Height - minHeight2) / fadeDist2
            Clamp(@val, 0, 1)
            SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
          Next
        Next
        UpdateTerrainTileLayerBlend(0, tx, ty, 1)
        UpdateTerrainTileLayerBlend(0, tx, ty, 2)
      Next
    Next  
    
    ; enable shadow terrain
    TerrainRenderMode(0, 0)
        
    ; create sphere for test
    CreateSphere(0, 10)
    
    ;LoadMesh(2,"koloniehaus.mesh")
    CreateCube(1,2048)  ; das Haus
    
    

    
    
    Global cameralook=CreateEntity(#PB_Any,MeshID(0),#Null,20,280,20)
    
    
    Global ball =CreateEntity(#PB_Any, MeshID(1), #Null)
    MoveEntity(ball, 300,60,0, #PB_Absolute)
    EntityRenderMode(ball, #PB_Entity_CastShadow)
    ScaleEntity(ball,0.1,0.1,0.1)
    
    
    
    
    ;CreateEntity(2,MeshID(1),#Null,20,280,20)
    ;ScaleEntity(2,0.1,0.1,0.1)
    
    Weltausgeben()
    
    ; SkyBox
    ;
    SkyBox("desert07.jpg")
    
    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor
    
    
     CreateParticleEmitter(1, 5, 5, 5, #PB_Particle_Point ,0,500,0)
      ParticleMaterial    (1,MaterialID(10))
      ParticleTimeToLive  (1, 2, 4)
      ParticleEmissionRate(1, 300)
      ParticleSize        (1, 5, 5)
      ParticleColorRange  (1, RGB(255,255,255), RGB(255,255,255))
      ParticleEmitterDirection(1, 0, 0.5, 0)
      ParticleVelocity(1, 0.05, 0.1)
    
    HideEntity(cameralook,1)
 
    Repeat
      Screen3DEvents()
      
      If ExamineKeyboard()       
        
        If KeyboardPushed(#PB_Key_A)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_D)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_W)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
        
               If KeyboardPushed(#PB_Key_Q)
          drehung = -2
        ElseIf KeyboardPushed(#PB_Key_E)
          drehung = 2
        Else
          drehung = 0
        EndIf
        
        
      EndIf
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
        
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        
        If MouseButton(#PB_MouseButton_Right)
          TerrainMousePick(0,  CameraID(0), MouseX(),  MouseY())
          MoveEntity(ball, PickX()-Mod(PickX(), 50), PickY()+0, PickZ()-Mod(PickZ(),50), #PB_Absolute)
          
        EndIf
        
       
         If MouseButton(#PB_MouseButton_Left)
          TerrainMousePick(0,  CameraID(0), MouseX(),  MouseY())
          MoveEntity(ball, PickX()-Mod(PickX(), 50), PickY()+0, PickZ()-Mod(PickZ(),50), #PB_Absolute)
          
         If objsetzen(EntityX(ball),EntityZ(ball)) =1
          
            CreateEntity(hausid,MeshID(1),#Null,EntityX(ball),1000,EntityZ(ball))
        ScaleEntity(hausid,0.1,0.1,0.1)
        hausid+1
      EndIf
      
        EndIf
        
        
        
      EndIf

    
    
    MoveEntity(cameralook, KeyX, 0, KeyY,#PB_Local)
    

  
      Yaw(EntityID(cameralook), drehung, #PB_World)         
      CameraFollow(Camera, EntityID(cameralook), 0, EntityY(cameralook) + 1000, 2160, 0.1, 1, #True)
      CameraLookAt(Camera, EntityX(cameralook), 40, EntityZ(cameralook))   
      
      
      
    ;  RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)  
      
      RenderWorld()
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape)   
    
    End 
    
  EndIf 
Else
  CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
    ;
    ; Terrain on Linux/OSX and Windows with OpenGL needs CG toolkit from nvidia
    ; It can be freely downloaded and installed from this site: https://developer.nvidia.com/cg-toolkit-download
    ;
    MessageRequester("Error","Can't initialize engine3D (Please ensures than CG Toolkit from nvidia is correcly installed)")
  CompilerElse
    MessageRequester("Error","Can't initialize engine3D")
  CompilerEndIf
EndIf 





man kann nun immernoch Häuser inneinader bauen.
Kann mir jemand Helfen?
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: überschneidung von häusern über mehrere felder

Beitrag von NicTheQuick »

Hast du dir meinen Code überhaupt mal angesehen? /:->
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: überschneidung von häusern über mehrere felder

Beitrag von Purebasium »

Danke für eure Hilfe :D

das Problem hat sich jetzt bei mir geklärt 8)
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: überschneidung von häusern über mehrere felder

Beitrag von Purebasium »

@NicTheQuick
ja habe ich, aber mir ist aufgefallen das der codeabschnitt den ich gepostet habe funktioniert hat.
Deshalb habe ich ihn nicht verändert.
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Antworten