Mein Game laggt - Was tun ???

Übersicht BlitzBasic Allgemein

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

Baschdi

Betreff: Mein Game laggt - Was tun ???

BeitragFr, Aug 03, 2007 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
also das spiel unten laggt sobald man mehrer "Aliens" erstellt ich möchte wissen warum und was ich tun kann.....
thx im vorraus
Code: [AUSKLAPPEN]

;#
Const weight=640
Const height=480
Const tile=32
Graphics weight,height,16,1
SetBuffer BackBuffer()
;#
Global mx,my,xback,yback,mapX=64,mapY=64,feld=2
Global gfx$="Graphic\",sfx$="Sound\",name$="map",nam$="map"
;#
Global tileset  = LoadAnimImage(gfx$+"tileset.bmp",tile,tile,0,60)
Global human    = LoadAnimImage(gfx$+"player.bmp",tile,tile,0,35)
Global alien    = LoadAnimImage(gfx$+"alien.bmp",tile,tile,0,35)
Global Imouse   = LoadImage(gfx$+"Imouse.bmp")
Global mouse    = LoadImage(gfx$+"mouse.bmp")
;#
Dim map(mapX,mapY)
;#
Type human
Field x,y,xx,yy,xZ,yZ,nr,typ,sel,spe,liv,att
End Type
;#
Type alien
Field x,y,xx,yy,xZ,yZ,nr,typ,sel,spe,liv,att
Field move,xo,aa,px,py
End Type
;#
;#
;#
Main()
Function Main()
NewHuman(2*tile,2*tile,0)
NewAlien(3*tile,5*tile,0)
NewAlien(4*tile,5*tile,0)
NewAlien(5*tile,5*tile,0)
NewAlien(6*tile,5*tile,0)
NewAlien(7*tile,5*tile,0)
NewAlien(8*tile,5*tile,0)
NewAlien(9*tile,5*tile,0)
NewAlien(3*tile,6*tile,0)
NewAlien(3*tile,7*tile,0)
NewAlien(3*tile,8*tile,0)
NewAlien(3*tile,9*tile,0)
   Repeat
   Cls
   ;BG malen
      For x=0 To mapX
      For y=0 To mapY
         DrawImage tileset,x*tile-xback,y*tile-yback,map(x,y)
      Next
      Next
      
   ;Unitsladen
      UpdateHuman()
      UpdateAlien()
      
      
   ;Maus malen
      UpdateMouse()
   Flip
   Until KeyHit(1)   
   End
End Function
;#
;#
;#
Function LoadMap(name$)

   file=OpenFile("Level\"+name$+".map")
      
      For x=0 To mapX
      For y=0 To mapY
         
         map(x,y)=ReadInt(file)
         
      Next
      Next
            
   CloseFile file
   
End Function
;#
;#
;#
Function UpdateMouse()

   ;Scolling
   If KeyDown(200) And yback>0 Then:
      yback=yback-4
   EndIf
   If KeyDown(208) And yback<mapY*tile-height Then:
      yback=yback+4
   EndIf
   If KeyDown(205) And xback<mapX*tile-weight Then:
      xback=xback+4
   EndIf
   If KeyDown(203) And xback>0 Then:
      xback=xback-4
   EndIf    

   ;Radar
   Color 192,192,192
   Rect (weight-100)-10,10,100,100,1   
   Color 0,0,0
   Rect ((weight-100)-10)+xback / ( (mapX * tile) / 100 ),10+yback / ( (mapY * tile) / 100 ), weight / ( (mapX * tile) / 100 ),height / ( (mapY * tile) / 100 ),0      
   
   ;Maus
   mx=MouseX()
   my=MouseY()
   DrawImage mouse,mx,my
   DrawImage Imouse,mx,my   
   
End Function
;#
;#
;#
Function NewHuman(x,y,typ)
   
   hu.human=New human
   hu\xx=x
   hu\yy=y
   hu\xZ=hu\xx
   hu\yZ=hu\yy
   hu\typ=typ
   hu\spe=2
   hu\liv=100
   hu\att=5
   
End Function
;#
;#
;#
Function UpdateHuman()
   
   For hu.human=Each human
      
   ;Bild Anzeigen
      hu\x=hu\xx-xback
      hu\y=hu\yy-yback
      DrawImage human,hu\x,hu\y,hu\nr
      
   ;Selektieren
      If ImagesCollide(mouse,mx,my,0,human,hu\x,hu\y,hu\nr)=1 And MouseDown(1) Then hu\sel=1
      If ImagesCollide(mouse,mx,my,0,human,hu\x,hu\y,hu\nr)=0 And MouseDown(1) Then hu\sel=0
      If hu\sel=1 Then Color 0,255,0 : Rect hu\x,hu\y,tile,tile,0
   
   ;Zielkoos   
      For x=0 To mapX
      For y=0 To mapY
         If hu\sel=1 And MouseDown(2) And ImagesCollide(mouse,mx,my,0,tileset,x*tile-xback,y*tile-yback,map(x,y)) Then hu\xZ=x*tile : hu\yZ=y*tile
      Next
      Next
      
   ;Bewegen
      If hu\xx < hu\xZ Then:
         hu\xx=hu\xx+hu\spe
      ElseIf hu\xx > hu\xZ Then:
         hu\xx=hu\xx-hu\spe          
      EndIf
      If hu\yy < hu\yZ Then:
          hu\yy=hu\yy+hu\spe       
      ElseIf hu\yy > hu\yZ Then:
         hu\yy=hu\yy-hu\spe
      EndIf         
      
   Next
   
End Function
;#
;#
;#
Function NewAlien(x,y,typ)

   al.alien=New alien
   al\xx=x
   al\yy=y
   al\xZ=al\xx
   al\yZ=al\yy
   al\typ=typ
   al\spe=2
   al\liv=100
   al\att=5
   
End Function
;#
;#
;#
Function UpdateAlien()

   For al.alien=Each alien
      
   ;Bild Anzeigen
      al\x=al\xx-xback
      al\y=al\yy-yback
      al\px=al\xx/tile
      al\py=al\yy/tile      
      DrawImage alien,al\x,al\y,al\nr
      Text 0,0,""+al\px+" "+al\py
   ;Selektieren
      If ImagesCollide(mouse,mx,my,0,human,al\x,al\y,al\nr)=1 And MouseDown(1) Then al\sel=1
      If ImagesCollide(mouse,mx,my,0,human,al\x,al\y,al\nr)=0 And MouseDown(1) Then al\sel=0
      If al\sel=1 Then Color 0,255,0 : Rect al\x,al\y,tile,tile,0
   
   ;Zielkoos   
      For x=0 To mapX
      For y=0 To mapY
         If al\sel=1 And MouseDown(2) And ImagesCollide(mouse,mx,my,0,tileset,x*tile-xback,y*tile-yback,map(x,y)) Then al\xZ=x*tile : al\yZ=y*tile
      Next
      Next
      
   ;Bewegen
      ;oben-rechts laufen
         If al\xZ > al\xx And al\yZ < al\yy Then:
            If map(al\px+1,al\py-1)<feld And al\aa<1 Then:
               al\move=5
               al\aa=1
            EndIf
      ;unten-rechts laufen
         ElseIf al\xZ > al\xx And al\yZ > al\yy Then:
            If map(al\px+1,al\py+1)<feld And al\aa<1 Then:
               al\move=6
               al\aa=1
            EndIf
      ;unten-links laufen
         ElseIf al\xZ < al\xx And al\yZ > al\yy Then:
            If map(al\px-1,al\py+1)<feld And al\aa<1 Then:
               al\move=7
               al\aa=1
            EndIf
      ;oben-links laufen
         ElseIf al\xZ < al\xx And al\yZ < al\yy Then:
            If map(al\px-1,al\py-1)<feld And al\aa<1 Then:
               al\move=8
               al\aa=1
            EndIf                             
      ;Oben laufen
         ElseIf al\yZ < al\yy Then:
            If map(al\px,al\py-1)<feld And al\aa<1 Then:
               al\move=2
               al\aa=1         
            EndIf 
      ;Unten laufen
         ElseIf al\yZ > al\yy Then:
            If map(al\px,al\py+1)<feld And al\aa<1 Then:
               al\move=1
               al\aa=1         
            EndIf
      ;rechts laufen
         ElseIf al\xZ > al\xx Then:
            If map(al\px+1,al\py)<feld And al\aa<1 Then:
               al\move=4
               al\aa=1            
            EndIf
      ;links laufen
         ElseIf al\xZ < al\xx Then:
            If map(al\px-1,al\py)<feld And al\aa<1 Then:
               al\move=3
               al\aa=1
            EndIf
         EndIf
               
      
      ;pfeilhoch-taste
         If al\move = 2 Then
         al\nr=0
         If al\aa > 0
         al\yy = al\yy - 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 3          
         If al\xo < 8 Then al\nr = 2
         If al\xo < 4 Then al\nr = 1
         If al\xo = 16 Then al\aa = 0 : al\xo = 0:al\nr = 0
         EndIf
         EndIf
      ;pfeilrechts-taste
         If al\move = 4 Then
         al\nr=4   
         If al\aa > 0
         al\xx = al\xx + 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 7          
         If al\xo < 8 Then al\nr = 6
         If al\xo < 4 Then al\nr = 5     
         If al\xo = 16 Then al\aa = 0 :al\xo = 0:al\nr = 4
         EndIf
         EndIf
      ;pfeilrunter-taste
         If al\move = 1 Then
         al\nr=8
         If al\aa > 0
         al\yy = al\yy + 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 11          
         If al\xo < 8 Then al\nr = 10
         If al\xo < 4 Then al\nr = 9
         If al\xo = 16 Then al\aa = 0 : al\xo = 0:al\nr = 8
         EndIf
         EndIf      
      ;pfeillinks-taste
         If al\move = 3 Then
         al\nr=12   
         If al\aa > 0
         al\xx = al\xx - 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 15          
         If al\xo < 8 Then al\nr = 14
         If al\xo < 4 Then al\nr = 13     
         If al\xo = 16 Then al\aa = 0 : al\xo = 0:al\nr = 12
         EndIf
         EndIf   
      ;oben rechts
         If al\move = 5 Then
         al\nr=16   
         If al\aa > 0
         al\xx = al\xx + 2
         al\yy = al\yy - 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 19          
         If al\xo < 8 Then al\nr = 18
         If al\xo < 4 Then al\nr = 17   
         If al\xo = 16 Then al\aa = 0 :al\xo = 0:al\nr = 16
         EndIf
         EndIf
      ;unten rechts
         If al\move = 6 Then
         al\nr=20   
         If al\aa > 0
         al\xx = al\xx + 2
         al\yy = al\yy + 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 23          
         If al\xo < 8 Then al\nr = 22
         If al\xo < 4 Then al\nr = 21   
         If al\xo = 16 Then al\aa = 0 :al\xo = 0:al\nr = 20
         EndIf
         EndIf
      ;unten links
         If al\move = 7 Then
         al\nr=24   
         If al\aa > 0
         al\xx = al\xx - 2
         al\yy = al\yy + 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 27          
         If al\xo < 8 Then al\nr = 26
         If al\xo < 4 Then al\nr = 25    
         If al\xo = 16 Then al\aa = 0 :al\xo = 0:al\nr = 24
         EndIf
         EndIf
      ;oben links
         If al\move = 8 Then
         al\nr=28   
         If al\aa > 0
         al\xx = al\xx - 2
         al\yy = al\yy - 2
         al\xo = al\xo + 1
         If al\xo < 12 Then al\nr = 31          
         If al\xo < 8 Then al\nr = 30
         If al\xo < 4 Then al\nr = 29     
         If al\xo = 16 Then al\aa = 0 :al\xo = 0:al\nr = 28
         EndIf
         EndIf
         
   ;sterben                     

   Next

End Function
;#
;#
;#

The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden
 

Dreamora

BeitragFr, Aug 03, 2007 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso das wohl lagt, da bin ich überfragt.

Ne jetzt Mal mit weniger zynismus:

Warum genau gehst du ALLE Tyles durch für Kollision beim Update und das für jedes einzelne Alien und jeden Human?
Das kann nur lagen, mit 10 aliens sind das 65*65*10 image collides ...

Ich weiss zwar nicht genau was du damit erreichen willst, aber es definitiv ein sehr schlechter und extrem fehlerhafter Ansatz.

Aus zweierlei Gründen:

1. Input und Update sollten nie in der gleichen Funktion sein. Splitte das Mal
2. Bestimme beim MouseDown die genauen Tilekoordinaten durch 2 Zeilen Mathematik. Dafür brauchst kein ImageCollide.

auf der Robsite hats ein RPG Tutorial. Arbeit dich da mal durch um den Umgang mit Tilemaps zu erlernen. So wie du das machst hast du am Schluss sogar "negativ gewinn" beim nutzen von Tilemaps, da wärst du ohne besser beraten.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Baschdi

BeitragFr, Aug 03, 2007 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
jap das tut kenn ich ....thx aber was meinst du mit input und update splitten?
was ist was ?
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden

Baschdi

BeitragFr, Aug 03, 2007 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

If al\sel=1 And MouseDown(2) And map(Pmx,Pmy)<feld Then
 al\xZ=Pmx*tile : al\yZ=Pmy*tile
   

also:
Pmx=(mx+xback)/tile
Pmy=(my+yback)/tile


Das ich da net selbst drauf gekommen bin .,.....das slebe system hab ivh schon mal bei nem rpg genutzt ...danke es laggt nicht mehr stockt aber so komisch alle 2 sec ....
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden

Baschdi

BeitragFr, Aug 03, 2007 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ne schmarrn ich rede müll ..hatte was im hintergrund laufe...klar das es stockt ....Smile
läuft einwandfrei ...ab jetzt fast keine for next schleifen mehr .... Wink
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden

BladeRunner

Moderator

BeitragFr, Aug 03, 2007 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
~GESCHLOSSEN~

Triplepost.
Lass das sein.
EDIT: Du wurdest schonmal darauf hingewiesen. Sollte sich das wiederholen gibt es eine Verwarnung.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group