Seite 4 von 4

Verfasst: 21.03.2008 15:21
von tobe
hallo obar,

ich hab deinen code mal angekuckt und etwas überarbeitet:

Code: Alles auswählen

EnableExplicit

Structure OBJECT
  TileID.l
EndStructure

Define mapHeight.l  = 29
Define mapWidth.l   = 35
Define MapX.l       = 24
Define MapY.l       = 24
Define posX.l       = 48
Define posY.l       = 48
Define speed        =  2
Define points       =  0
Define i, k, t, n
Define punkte, right, left, Up, Down, schritt
Dim map.OBJECT(mapWidth, mapHeight)
#TileSize     = 24
#playerWidth  = 24
#playerHeight = 24

InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"")

CreateSprite(0,24,24)
StartDrawing(SpriteOutput(0))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0,0,24,24,RGB(0,0,0))
StopDrawing()

CreateSprite(1,24,24)
StartDrawing(SpriteOutput(1))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0,0,24,24,RGB(255,255,255))
StopDrawing()

CreateSprite(2,24,24)
StartDrawing(SpriteOutput(2))
  DrawingMode(#PB_2DDrawing_Default)
  Circle(12,12,12,RGB(255,100,255))
StopDrawing()

CreateSprite(3,24,24)
StartDrawing(SpriteOutput(3))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0,0,24,24,RGB(0, 0, 0))
  Circle(12,12,3,RGB(254, 255, 61))
StopDrawing()

Restore map
For t = 0 To mapHeight
  For n = 0 To mapWidth
    Read map(n,t)\TileID
    If map(n, t)\TileID = 0
      punkte + 1
      map(n, t)\TileID = 3
    EndIf
  Next
Next

Repeat
  ClearScreen(0)
  ExamineKeyboard()
  
  For t = 0 To mapHeight
    For n = 0 To mapWidth
      DisplayTransparentSprite(map(n, t)\TileID, (MapX + #TileSize*n),(MapY + #TileSize*t) )
    Next
  Next     
  
  i = ((posX-MapX)/#TileSize)
  k = ((posY-MapY)/#TileSize)
  
  If schritt < 1
    
    If KeyboardPushed(#PB_Key_Right)
      If map(i+1, k)\TileID < 1 Or map(i+1, k)\TileID  > 2
        right = 1:left = 0:Up = 0:Down = 0
      EndIf
    Else
      If KeyboardPushed(#PB_Key_Left)
        If map(i-1, k)\TileID < 1 Or map(i-1, k)\TileID  > 2
          right = 0:left = 1:Up = 0:Down = 0
        EndIf
      EndIf
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      If map(i, k-1)\TileID < 1 Or map(i, k-1)\TileID  > 2   
        right = 0:left = 0:Up = 1:Down = 0
      EndIf
    Else
      If KeyboardPushed(#PB_Key_Down)
        If map(i, k+1)\TileID < 1 Or map(i, k+1)\TileID  > 2   
          right = 0:left = 0:Up = 0:Down = 1
        EndIf
      EndIf
    EndIf
    
  EndIf
  
  If right = 1
    posX + speed
    schritt + speed
    If schritt > 23
      schritt = 0
      right = 0
    EndIf         
  EndIf
  
  If left = 1
    posX - speed
    schritt + speed
    If schritt > 23
      left = 0
      schritt = 0
    EndIf
  EndIf   
  
  If Up = 1
    posY - speed
    schritt + speed
    If schritt > 23
      Up = 0
      schritt = 0
    EndIf
  EndIf           
  
  If Down = 1
    posY + speed
    schritt + speed
    If schritt > 23
      Down = 0
      schritt = 0
    EndIf
  EndIf           
  
  If map(i, k)\TileID = 3
    map(i, k)\TileID = 0
    punkte - 1
    points + 5
  EndIf
  
  DisplayTransparentSprite(2,posX,posY)
  
  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(925,50,"PUNKTE",RGB(255,255,255))
    DrawText(930, 80, RSet(Str(points), 6, "0"),RGB(255,255,255))
    DrawText(10,30,"schritte: "+Str(schritt),RGB(255,0,255))
    DrawText(10,50,"richtung: "+Str(right),RGB(255,0,255))
    DrawText(10,70,"posx: "+Str((posX)),RGB(255,0,0))
    DrawText(10,90,"posy: "+Str((posY)),RGB(255,0,0))
  StopDrawing()
  
  Delay(1)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

End

DataSection
  map:
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1
  Data.l 1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
  Data.l 1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
  Data.l 1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1
  Data.l 1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1
  Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
EndDataSection
mfG
tobe

Verfasst: 21.03.2008 16:37
von obar
Danke für den Code. Ich seh den Fehler den ich mit der Var 'Schritt' gemacht habe. Ich musste aber deinen Code wieder ändern, weil ich ja nicht will,
dass Pacci nach jedem Tastendruck stehen bleibt.

Ich hab mal den Bewegungsteil wie folgt geändert.

Code: Alles auswählen

If schritt < 1 
    
    If KeyboardPushed(#PB_Key_Right) 
      If map(i+1, k)\TileID < 1 Or map(i+1, k)\TileID  > 2 
        right = 1:left = 0:Up = 0:Down = 0 
      EndIf 
    Else 
      If KeyboardPushed(#PB_Key_Left) 
        If map(i-1, k)\TileID < 1 Or map(i-1, k)\TileID  > 2 
          right = 0:left = 1:Up = 0:Down = 0
        EndIf 
      EndIf 
    EndIf 
    
    If KeyboardPushed(#PB_Key_Up) 
      If map(i, k-1)\TileID < 1 Or map(i, k-1)\TileID  > 2    
        right = 0:left = 0:Up = 1:Down = 0
      EndIf 
    Else 
      If KeyboardPushed(#PB_Key_Down) 
        If map(i, k+1)\TileID < 1 Or map(i, k+1)\TileID  > 2    
          right = 0:left = 0:Up = 0:Down = 1
        EndIf 
      EndIf 
    EndIf 
    
  EndIf 


  If right = 1 
    posX + speed 
    schritt + speed 
    If schritt > 23 
        If map(i+2, k)\TileID  < 1 Or map(i+2, k)\TileID  > 2
            schritt = 0
        Else
            right = 0
            schritt = 0
        EndIf
    EndIf          
  EndIf 
  
  If left = 1 
    posX - speed 
    schritt + speed 
    If schritt > 23
        If map(i-1, k)\TileID  < 1 Or map(i-1, k)\TileID  > 2
            schritt = 0
        Else
            left = 0
            schritt = 0
        EndIf
    EndIf 
  EndIf    
  
  If Up = 1 
    posY - speed 
    schritt + speed 
    If schritt > 23
        If map(i, k-1)\TileID  < 1 Or map(i, k-1)\TileID  > 2
            schritt = 0
        Else
            up = 0
            schritt = 0
        EndIf 
    EndIf 
  EndIf            
  
  If Down = 1 
    posY + speed 
    schritt + speed 
    If schritt > 23
        If map(i, k+2)\TileID  < 1 Or map(i, k+2)\TileID  > 2
            schritt = 0
        Else
            down = 0
            schritt = 0
        EndIf 
    EndIf 
  EndIf            
Was ich auch festgestellt habe ist, dass ich nach rechts und unten 2 Tiles vorwärts prüfen muss 'i+2 oder k+2'. Ich nehme an der Grund ist,
wenn ich nur +1 mache und die posx und posy Koordinate des Sprite oben links ist, prüft er nur sich selber. Aber bei der Tastatur Abfrage
darf ich dies wieder nicht machen. Hier wäre ich froh, wenn mir dies einer erklären könnte, wieso das so ist. Ausserdem gibts noch ein
Problem beim sammeln der Punkte. Nach rechts und unten siehts gut aus. Oben und links verschwindet er zu früh. Dies hat vermutlich auch
wieder mit der posx und posy des Sprites zu tun.

Kurz gesagt, sind noch 3 Fragen offen:

1. Wieso Unterschied der bei Bewegungabfrage 'i+2 k+2' und Tastaturabfrage 'i+1 k+1'

2. Punkte fressen. Unterschied rechts unten und links oben

3. Vernünftige Verfolgung der Gegner

Verfasst: 21.03.2008 16:57
von tobe
ich muss zugeben ich hab nur den code angekuckt und nicht gelesen was du eigentlich vor hattest ;)
1 und 2 liegt glaube ich daran, das posx und posy die linke obere ecke des spielersprites ist, damit es in alle richtungen gleich abläuft müsste man warscheinlich von der mitte des sprites ausgehen.
zu 3: welche gegner ? ;)

Verfasst: 21.03.2008 17:20
von obar
Gut, dies hab ich jetzt angepasst. Punkte werden wieder in alle Richtungen sauber gefressen(hört sich bescheuert an).

Zu Punkt 3, der Ursprungscode hatte einen Gegner. Die Frage damals war ja auch primitive Zielverfolgung.

Kaeru hat mir aber nahegelegt, grundsätzliche Änderungen vorzunehmen, dies hab ich jetzt getan. Ich bin nun dabei den
Gegner wieder einzubauen.

Der momentane Stand des Codes:

Code: Alles auswählen

EnableExplicit 

Structure OBJECT 
  TileID.l 
EndStructure 

Define mapHeight.l  = 29 
Define mapWidth.l   = 35 
Define MapX.l       = 24 
Define MapY.l       = 24 
Define posX.l       = 60 
Define posY.l       = 60
Define gposX.l      =804 
Define gposY.l      = 60  
Define speed        =  2 
Define points       =  0 
Define i, k, gi, gk, t, n 
Define punkte, right, left, Up, Down, schritt 
Dim map.OBJECT(mapWidth, mapHeight) 
#TileSize     = 24 
#playerWidth  = 24 
#playerHeight = 24 

InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,32,"") 

CreateSprite(0,24,24) 
StartDrawing(SpriteOutput(0)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(0,0,0)) 
StopDrawing() 

CreateSprite(1,24,24) 
StartDrawing(SpriteOutput(1)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(255,255,255)) 
StopDrawing() 

CreateSprite(2,24,24) 
StartDrawing(SpriteOutput(2)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Circle(12,12,12,RGB(255,100,255)) 
StopDrawing() 

CreateSprite(3,24,24) 
StartDrawing(SpriteOutput(3)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(0, 0, 0)) 
  Circle(12,12,3,RGB(254, 255, 61)) 
StopDrawing() 

CreateSprite(4,24,24) 
StartDrawing(SpriteOutput(4)) 
DrawingMode(#PB_2DDrawing_Default) 
Box(0,0,24,24,RGB(255,0,255)) 
Circle(12,12,12,RGB(0,0,255)) 
StopDrawing() 

Restore map 
For t = 0 To mapHeight 
  For n = 0 To mapWidth 
    Read map(n,t)\TileID 
    If map(n, t)\TileID = 0 
      punkte + 1 
      map(n, t)\TileID = 3 
    EndIf 
  Next 
Next 

Repeat 
  ClearScreen(0) 
  ExamineKeyboard() 
  
  For t = 0 To mapHeight 
    For n = 0 To mapWidth 
      DisplayTransparentSprite(map(n, t)\TileID, (MapX + #TileSize*n),(MapY + #TileSize*t) ) 
    Next 
  Next      
  
  i = ((posX-MapX)/#TileSize) 
  k = ((posY-MapY)/#TileSize)
  gi = ((gposx-mapX)/#TileSize) 
  gk = ((gposy-mapY)/#TileSize) 
  
  If schritt < 1 
    
    If KeyboardPushed(#PB_Key_Right) 
      If map(i+1, k)\TileID < 1 Or map(i+1, k)\TileID  > 2 
        right = 1:left = 0:Up = 0:Down = 0 
      EndIf 
    Else 
      If KeyboardPushed(#PB_Key_Left) 
        If map(i-1, k)\TileID < 1 Or map(i-1, k)\TileID  > 2 
          right = 0:left = 1:Up = 0:Down = 0
        EndIf 
      EndIf 
    EndIf 
    
    If KeyboardPushed(#PB_Key_Up) 
      If map(i, k-1)\TileID < 1 Or map(i, k-1)\TileID  > 2    
        right = 0:left = 0:Up = 1:Down = 0
      EndIf 
    Else 
      If KeyboardPushed(#PB_Key_Down) 
        If map(i, k+1)\TileID < 1 Or map(i, k+1)\TileID  > 2    
          right = 0:left = 0:Up = 0:Down = 1
        EndIf 
      EndIf 
    EndIf 
    
  EndIf 
  
  If right = 1 
    posX + speed 
    schritt + speed 
    If schritt > 23 
        If map(i+1, k)\TileID  < 1 Or map(i+1, k)\TileID  > 2
            schritt = 0
        Else
            right = 0
            schritt = 0
        EndIf
    EndIf          
  EndIf 
  
  If left = 1 
    posX - speed 
    schritt + speed 
    If schritt > 23
        If map(i-1, k)\TileID  < 1 Or map(i-1, k)\TileID  > 2
            schritt = 0
        Else
            left = 0
            schritt = 0
        EndIf
    EndIf 
  EndIf    
  
  If Up = 1 
    posY - speed 
    schritt + speed 
    If schritt > 23
        If map(i, k-1)\TileID  < 1 Or map(i, k-1)\TileID  > 2
            schritt = 0
        Else
            up = 0
            schritt = 0
        EndIf 
    EndIf 
  EndIf            
  
  If Down = 1 
    posY + speed 
    schritt + speed 
    If schritt > 23
        If map(i, k+1)\TileID  < 1 Or map(i, k+1)\TileID  > 2
            schritt = 0
        Else
            down = 0
            schritt = 0
        EndIf 
    EndIf 
  EndIf  
  
  ; 
  ; Primitive Zielverfolgung  ( Flucht noch nicht eingefügt) 
  ;           
    
  If map(i, k)\TileID = 3 
    map(i, k)\TileID = 0 
    punkte - 1 
    points + 5 
  EndIf 
  
  DisplayTransparentSprite(2,posX-#playerWidth/2,posY-#playerHeight/2)
  
  DisplaySprite(4,gposX-#playerWidth/2,gposY-#playerHeight/2) 
  
  StartDrawing(ScreenOutput()) 
    DrawingMode(#PB_2DDrawing_Transparent) 
    DrawText(925,50,"PUNKTE",RGB(255,255,255)) 
    DrawText(930, 80, RSet(Str(points), 6, "0"),RGB(255,255,255)) 
    DrawText(10,30,"schritte: "+Str(schritt),RGB(255,0,255)) 
    DrawText(10,50,"richtung: "+Str(right),RGB(255,0,255)) 
    DrawText(10,70,"posx: "+Str((posX)),RGB(255,0,0)) 
    DrawText(10,90,"posy: "+Str((posY)),RGB(255,0,0)) 
  StopDrawing() 
  
  Delay(1) 
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape) 

End 

DataSection 
  map: 
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 
  Data.l 1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1 
  Data.l 1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1 
  Data.l 1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1 
  Data.l 1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1 
  Data.l 1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1 
  Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 
EndDataSection

Verfasst: 22.03.2008 02:07
von obar
Hallo zusammen,

bin gerade dabei mir eine Zielverfolgung zu bauen. Hätte aber gerne von eurer Seite gewusst ob ich dies so Angehen kann, oder ob es viel einfacher geht.

Der Code ist noch nicht lauffähig.


Code: Alles auswählen

; 
  ; Primitive Zielverfolgung  ( Flucht noch nicht eingefügt) 
  ;           
  If gschritt < 1
    
    If grechts = 1 
        If map(gi+1, gk)\TileID  < 1 Or map(gi+1, gk)\TileID  > 2
            test = Random(1)+1
            If test = 1
                richtungswechsel = 1
            Else
                grechts = 1
            EndIf
        Else
            richtungswechsel = 1    
        EndIf
    EndIf    
        
    If glinks = 1 
        If map(gi-1, gk)\TileID  < 1 Or map(gi-1, gk)\TileID  > 2
            test = Random(1)+1
            If test = 1
                richtungswechsel = 1
            Else
                glinks = 1
            EndIf
        Else
            richtungswechsel = 1    
        EndIf
    EndIf
    
    If grunter = 1 
        If map(gi, gk+1)\TileID  < 1 Or map(gi, gk+1)\TileID  > 2
            test = Random(1)+1
            If test = 1
                richtungswechsel = 1
            Else
                grunter = 1
            EndIf
        Else
            richtungswechsel = 1    
        EndIf
    EndIf
    
    If grauf = 1 
        If map(gi, gk-1)\TileID  < 1 Or map(gi, gk-1)\TileID  > 2
            test = Random(1)+1
            If test = 1
                richtungswechsel = 1
            Else
                grauf = 1
            EndIf
        Else
            richtungswechsel = 1    
        EndIf
    EndIf
        
    
    If richtungswechsel = 1
        zufall = Random(1)+1
        If zufall = 1
            folgen = 1
        Else
            irgendeinerichtung = 1
        EndIf
    EndIf
       
  
    If folgen = 1
    ;
    ; Hier folgt die Abfrage für die verfolgung
    ;
    EndIf
    
    
    If irgendeinerichtung = 1
    ;
    ; Hier wird irgendeine Richtung gegeben 
    ;
    EndIf    
        
  EndIf
  ;
  ; Ab hier wird die Bewegung ausgeführt.
  ;
  If grechts = 1 
    gposX + speed 
    gschritt + speed 
    If gschritt > 23 
        If map(gi+1, gk)\TileID  < 1 Or map(gi+1, gk)\TileID  > 2
            gschritt = 0
        Else
            grechts = 0
            gschritt = 0
        EndIf
    EndIf          
  EndIf 
  
  If glinks = 1 
    gposX - speed 
    gschritt + speed 
    If gschritt > 23 
        If map(gi-1, gk)\TileID  < 1 Or map(gi-1, gk)\TileID  > 2
            gschritt = 0
        Else
            glinks = 0
            gschritt = 0
        EndIf
    EndIf          
  EndIf 
  
  If grunter = 1 
    gposY + speed 
    gschritt + speed 
    If gschritt > 23 
        If map(gi, gk+1)\TileID  < 1 Or map(gi, gk+1)\TileID  > 2
            gschritt = 0
        Else
            grunter = 0
            gschritt = 0
        EndIf
    EndIf          
  EndIf 
  
  If grauf = 1 
    gposY - speed 
    gschritt + speed 
    If gschritt > 23 
        If map(gi, gk-1)\TileID  < 1 Or map(gi, gk-1)\TileID  > 2
            gschritt = 0
        Else
            grauf = 0
            gschritt = 0
        EndIf
    EndIf          
  EndIf 

Verfasst: 28.03.2008 21:13
von obar
Hallo zusammen,

ich hab mal versucht, eine Art von Verfolgung, einzufügen.
Ich wäre für Verbesserungsvorschläge der Zielverfolgung sehr dankbar.

Ich persönlich bin noch nicht ganz zufrieden mit dem Code. Mir gehen aber langsam die Ideen aus, wie ich es besser machen könnte.

Code: Alles auswählen

Structure OBJECT 
  TileID.l 
EndStructure 

Define mapHeight.l  = 29 
Define mapWidth.l   = 35 
Define MapX.l       = 24 
Define MapY.l       = 24 
Define posX.l       = 60 
Define posY.l       = 60
Define gposX.l      =468 
Define gposY.l      =396  
Define speed        =  2 
Define points       =  0 
Define.l i, k, t, n, p, gi, gk, AnzGhost = 3
Define.l punkte, right, left, Up, Down, schritt, tod
Define distance.f

Dim gright(AnzGhost) 
Dim gschritt(AnzGhost)
Dim gleft(AnzGhost) 
Dim gdown(AnzGhost) 
Dim gup(AnzGhost)
Dim folgen(AnzGhost)
Dim gposX(AnzGhost) 
Dim gposY(AnzGhost)

gposX(0)      =468 
gposY(0)      =396 
gposX(1)      =804 
gposY(1)      =60  
gposX(2)      =300 
gposY(2)      =60 
gposX(3)      =852 
gposY(3)      =60  

For i = 0 To AnzGhost
  gright(i)=1
Next

Dim map.OBJECT(mapWidth, mapHeight) 
#TileSize     = 24 
#playerWidth  = 24 
#playerHeight = 24 

InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,32,"") 

CreateSprite(0,24,24) 
StartDrawing(SpriteOutput(0)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(0,0,0)) 
StopDrawing() 

CreateSprite(1,24,24) 
StartDrawing(SpriteOutput(1)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(0, 0, 0)) 
  Circle(12,12,3,RGB(254, 255, 61)) 
StopDrawing()

CreateSprite(2,24,24) 
StartDrawing(SpriteOutput(2)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Circle(12,12,12,RGB(255,100,255)) 
StopDrawing() 

CreateSprite(3,24,24) 
StartDrawing(SpriteOutput(3)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(255,255,255)) 
StopDrawing()

CreateSprite(4,24,24) 
StartDrawing(SpriteOutput(4)) 
  DrawingMode(#PB_2DDrawing_Default) 
  Box(0,0,24,24,RGB(255,0,255)) 
  Circle(12,12,12,RGB(0,0,255)) 
StopDrawing()

Procedure hAbfrage()
    Shared map(),gi,gk,gright(),gleft(),gdown(),gup(),p
    
    If Random(2) = 1
        If map(gi, gk+1)\TileID < 2
            gright(p) = 0 : gleft(p) = 0 : gdown(p) = 1 : gup(p) = 0
        ElseIf map(gi, gk-1)\TileID < 2
            gright(p) = 0 : gleft(p) = 0 : gdown(p) = 0 : gup(p) = 1
        EndIf
    Else
        If map(gi, gk-1)\TileID < 2
            gright(p) = 0 : gleft(p) = 0 : gdown(p) = 0 : gup(p) = 1
        ElseIf map(gi, gk+1)\TileID < 2
            gright(p) = 0 : gleft(p) = 0 : gdown(p) = 1 : gup(p) = 0
        EndIf
    EndIf
EndProcedure

Procedure vAbfrage()
    Shared map(),gi,gk,gright(),gleft(),gdown(),gup(),p
   
    If Random(2) = 1 
        If map(gi+1, gk)\TileID < 2
            gright(p) = 1 : gleft(p) = 0 : gdown(p) = 0 : gup(p) = 0
        ElseIf map(gi-1, gk)\TileID < 2
            gright(p) = 0 : gleft(p) = 1 : gdown(p) = 0 : gup(p) = 0
        EndIf
    Else
        If map(gi-1, gk)\TileID < 2
            gright(p) = 0 : gleft(p) = 1 : gdown(p) = 0 : gup(p) = 0
        ElseIf map(gi+1, gk)\TileID < 2
            gright(p) = 1 : gleft(p) = 0 : gdown(p) = 0 : gup(p) = 0
        EndIf
    EndIf
EndProcedure
 
Restore map 
For t = 0 To mapHeight 
  For n = 0 To mapWidth 
    Read map(n,t)\TileID 
    If map(n, t)\TileID = 0 
      punkte + 1 
      map(n, t)\TileID = 1 
    EndIf 
  Next 
Next 

Repeat 
  ClearScreen(0) 
  ExamineKeyboard() 
  
  For t = 0 To mapHeight 
    For n = 0 To mapWidth 
      DisplayTransparentSprite(map(n, t)\TileID, (MapX + #TileSize*n),(MapY + #TileSize*t) ) 
    Next 
  Next      
  
  i = ((posX-MapX)/#TileSize) 
  k = ((posY-MapY)/#TileSize)
  
  
  If schritt < 1 
    
    If KeyboardPushed(#PB_Key_Right) 
      If map(i+1, k)\TileID < 2
        right = 1:left = 0:Up = 0:Down = 0 
      EndIf 
    Else 
      If KeyboardPushed(#PB_Key_Left) 
        If map(i-1, k)\TileID < 2
          right = 0:left = 1:Up = 0:Down = 0
        EndIf 
      EndIf 
    EndIf 
    
    If KeyboardPushed(#PB_Key_Up) 
      If map(i, k-1)\TileID < 2    
        right = 0:left = 0:Up = 1:Down = 0
      EndIf 
    Else 
      If KeyboardPushed(#PB_Key_Down) 
        If map(i, k+1)\TileID < 2  
          right = 0:left = 0:Up = 0:Down = 1
        EndIf 
      EndIf 
    EndIf   
    
  EndIf 
  
  If right = 1 
    posX + speed 
    schritt + speed 
    If schritt > 23 
        If map(i+1, k)\TileID > 1
            right = 0
        EndIf
        schritt = 0
    EndIf          
  EndIf 
  
  If left = 1 
    posX - speed 
    schritt + speed 
    If schritt > 23
        If map(i-1, k)\TileID > 1
            left = 0
        EndIf
        schritt = 0
    EndIf 
  EndIf    
  
  If Up = 1 
    posY - speed 
    schritt + speed 
    If schritt > 23
        If map(i, k-1)\TileID > 1
            up = 0
        EndIf
        schritt = 0 
    EndIf 
  EndIf            
  
  If Down = 1 
    posY + speed 
    schritt + speed 
    If schritt > 23
        If map(i, k+1)\TileID > 1
            down = 0
        EndIf
        schritt = 0 
    EndIf 
  EndIf  
  ;
  ; Primitive Zielverfolgung  ( Flucht noch nicht eingefügt) 
  ;     
  For p = 0 To AnzGhost
  
      gi = ((gposx(p)-mapX)/#TileSize) 
      gk = ((gposy(p)-mapY)/#TileSize)
  
      distance = Sqr((posx-gposx(p))*(posx-gposx(p)) + (posy-gposy(p))*(posy-gposy(p)))
        
      If gschritt(p) < 1

          If gright(p) = 1
              If map(gi+1, gk)\TileID  < 2
                  If map(gi, gk+1)\TileID < 2 Or map(gi, gk-1)\TileID < 2
                      If Random(2) = 1
                          If Random(3) < 2
                              hAbfrage()
                          Else 
                              folgen(p) = 1 And distance < 150
                          EndIf    
                      EndIf
                  EndIf    
              Else
                  hAbfrage()
              EndIf
          ElseIf gleft(p) = 1
              If map(gi-1, gk)\TileID  < 2
                  If map(gi, gk+1)\TileID < 2 Or map(gi, gk-1)\TileID < 2
                      If Random(2) = 1
                          If Random(3) < 2
                              hAbfrage()
                          Else 
                              folgen(p) = 1 And distance < 150
                          EndIf    
                      EndIf
                  EndIf
              Else
                  hAbfrage()
              EndIf   
          ElseIf gdown(p) = 1
              If map(gi, gk+1)\TileID  < 2
                  If map(gi+1, gk)\TileID < 2 Or map(gi-1, gk)\TileID < 2
                      If Random(2) = 1
                          If Random(3) < 2
                              vAbfrage()
                          Else 
                              folgen(p) = 1 And distance < 150
                          EndIf    
                      EndIf
                  EndIf
              Else
                  vAbfrage()
              EndIf   
          ElseIf gup(p) = 1
              If map(gi, gk-1)\TileID  < 2
                  If map(gi+1, gk)\TileID < 2 Or map(gi-1, gk)\TileID < 2
                      If Random(2) = 1
                          If Random(3) < 2
                              vAbfrage()
                          Else 
                              folgen(p) = 1 And distance < 150
                          EndIf    
                      EndIf
                  EndIf
              Else
                  vAbfrage()
              EndIf  
          EndIf
    
           
          If folgen(p) = 1         
              If posx>gposx(p) And gleft(p) = 0
                  If map(gi+1, gk)\TileID  < 2
                      gright(p) = 1 : gleft(p) = 0 : gdown(p) = 0 : gup(p) = 0
                  EndIf
              ElseIf posx<gposx(p) And gright(p) = 0
                  If map(gi-1, gk)\TileID  < 2
                      gright(p) = 0 : gleft(p) = 1 : gdown(p) = 0 : gup(p) = 0
                  EndIf
              ElseIf posy>gposy(p) And gup(p) = 0
                  If map(gi, gk+1)\TileID  < 2
                      gright(p) = 0 : gleft(p) = 0 : gdown(p) = 1 : gup(p) = 0
                  EndIf
              ElseIf posy<gposy(p) And gdown(p) = 0 
                  If map(gi, gk-1)\TileID  < 2
                      gright(p) = 0 : gleft(p) = 0 : gdown(p) = 0 : gup(p) = 1
                  EndIf
              EndIf
          EndIf
             
      EndIf
  
    
      If gright(p) = 1 
          gposX(p) + speed
      ElseIf gleft(p) = 1
          gposX(p) - speed
      ElseIf gdown(p) = 1
          gposY(p) + speed
      ElseIf gup(p) = 1
          gposY(p) - speed
      EndIf
      gschritt(p) + speed
      If gschritt(p) > 23 
          gschritt(p) = 0
          folgen(p) = 0
      EndIf
  
      DisplaySprite(4,gposX(p)-#playerWidth/2,gposY(p)-#playerHeight/2)
      
      ;tod = SpritePixelCollision(2,posX,posy,4,gposx(p),gposy(p))
      
      ;If tod = 1
      ;    End
      ;EndIf  
      
  Next
    
  If map(i, k)\TileID = 1 
    map(i, k)\TileID = 0 
    punkte - 1 
    points + 5 
  EndIf 
  
  DisplayTransparentSprite(2,posX-#playerWidth/2,posY-#playerHeight/2)
   
  StartDrawing(ScreenOutput()) 
    DrawingMode(#PB_2DDrawing_Transparent) 
    DrawText(925,50,"PUNKTE",RGB(255,255,255)) 
    DrawText(930, 80, RSet(Str(points), 6, "0"),RGB(255,255,255)) 
  StopDrawing() 
  
  Delay(1) 
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape) 

End 

DataSection 
  map: 
  Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  Data.l 3,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,3 
  Data.l 3,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,3 
  Data.l 3,0,3,3,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3,3,0,3 
  Data.l 3,0,3,3,0,3,3,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3,3,0,3,3,0,3 
  Data.l 3,0,0,0,0,3,3,0,0,0,0,3,3,3,0,3,3,3,3,3,3,0,3,3,3,0,0,0,0,3,3,0,0,0,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,3,3,3,3,3,0,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,0,3,3,3,3,3,0,3 
  Data.l 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3 
  Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 
EndDataSection

Verfasst: 30.03.2008 20:31
von obar
Hallo zusammen,

mir stellt sich gerade die Frage, ob dieses Thema wirklich absolut keinen Interessiert. Mir ist bewusst das es keine Antwortgarantie gibt.
Könnte es sein das, dass Thema völlig ausgelutscht ist? Ich möchte auch niemanden ans Schienbein treten, denn ich bekam ja schon einige
Informationen. Aber die letzten paar Einträge stammen allesamt von mir und dass macht das Thema nicht gerade übersichtlich.


Trotzdem stelle ich hier meine Anfangsfragen erneut.

Fragen:

- Wie kann man die Zielverfolgung besser lösen?
- Wie würdet ihr einzelne Bereiche bei Pacman lösen?
- Mapaufbau ?
- Punkte Aufbauen/Darstellen/Verschwinden lassen ?