Seite 1 von 2

Drawing Problem

Verfasst: 21.08.2005 16:56
von unix
Ich bin zur Zeit dabei Snake zu Progen und wollte im oberen linken Eck Score, Zeit usw. anzeigen lassen.
Das functioniert ja auch.
Aber nach einer gewissen Zeit haut es mich raus. (Problem mit StartDrawing)

Hier mein Code:

Code: Alles auswählen

StartDrawing(ScreenOutput())
 DrawingMode(1) 
 FrontColor(255,255,0)
 Locate(5,5)
 DrawText("Score: "+Str(Score)+"                Time: "+Str(Time/1000))
StopDrawing()
Habt ihr eine Ahnung woran das liegt?
Oder ist es nur ein Bug?

Verfasst: 21.08.2005 17:08
von Batze
Was, passiert denn?
Fehlermeldung??
Absturz??? :?

Verfasst: 21.08.2005 17:14
von unix
Debugger meldet Fehler bei StartDrawing(ScreenOutput())
(Programmende)

Verfasst: 21.08.2005 17:17
von Batze
Ich glaub da müsstest du wenigstens noch den Code der Hauptschleife posten. So seh ich erstmal keinen Fehler.

Verfasst: 21.08.2005 17:27
von unix
Hier mein ganzer Spielcode:


JaJa alles nur Subs
ist doch nur ein kleines Spiel

Code: Alles auswählen

InitSprite()
InitKeyboard()

UseJPEGImageDecoder()

OpenScreen(1024,768,32,"Snake")

LoadSprite(0,"E:\Bilder\Weltraum.jpeg")
LoadSprite(1,"E:\Bilder\Star.bmp")
LoadSprite(2,"E:\Bilder\Upgrade.bmp")

Structure Tile
 X.l 
 Y.l
EndStructure

NewList Snake.tile()
NewList OldUpgrade.tile()

Global R.b, Quit.b,Pause.b : R = 1
Global Upgrade.b, UpgradeX.l, UpgradeY.l, Ak.b
Global Score.l, Time.l
Gosub FirstSnake

Procedure PlayerControl()
  
  Repeat
  
  MaxElements = CountList(Snake()) 
Dim ItemsX(MaxElements)
Dim ItemsY(MaxElements)
Item = 0

ForEach Snake()

 ItemsX(Item) = Snake()\X
 ItemsY(Item) = Snake()\Y

  If Item = 0
   If R = 3 : Snake()\Y + 35
   ElseIf R = 1 : Snake()\Y - 35
   ElseIf R = 2 : Snake()\X + 35
   ElseIf R = 4 : Snake()\X - 35 : EndIf
  Else
    Snake()\X = ItemsX(Item-1)
    Snake()\Y = ItemsY(Item-1)
  EndIf
 
  item + 1

  Next

  ForEach Snake()
   If Snake()\Y < - 17 : Snake()\Y = 752
   ElseIf Snake()\Y > 751 : Snake()\Y = - 18
   ElseIf Snake()\X < - 17 : Snake()\X = 1020
   ElseIf Snake()\X > 1007 : Snake()\X = - 30 : EndIf
  Next

  Delay(70)
  
  ForEver
  
EndProcedure






ThreadIDPlayerControl = CreateThread(@PlayerControl(),0)

StartTime = ElapsedMilliseconds()   
      
Repeat

 ExamineKeyboard()

ClearScreen(0,0,0)
 
 DisplaySprite(0,0,0)  ;Hintergrund
 
 Element = 0          ;Tot?   funct noch nicht
 ForEach Snake()
  If Element = 0   
    FirstX = Snake()\X 
    FirstY = Snake()\Y
  ElseIf Element > 0 And SpriteCollision(1, FirstX, FirstY, 1, Snake()\X, Snake()\Y) 
      Gosub KillSnake
  EndIf
  DisplayTransparentSprite(1,Snake()\X,Snake()\Y)
  Element + 1
 Next
 
 Gosub Hud      ;Mein Problem

 Gosub Upgrade   ;Upgrade zufällig auf Bildschirm
 Gosub AddSnake ;Schlange um 1 verlänger wenn eine kollision anliegt
 
  
FlipBuffers()



If KeyboardPushed(#PB_Key_Up) And R <> 3 : R = 1     ;Steuerung
ElseIf KeyboardPushed(#PB_Key_Right) And R <> 4 : R = 2
ElseIf KeyboardPushed(#PB_Key_Down) And R <> 1 : R = 3
ElseIf KeyboardPushed(#PB_Key_Left) And R <> 2 : R = 4 : EndIf

If KeyboardPushed(#PB_Key_Escape) : Quit = 1 : EndIf

Delay(1)  ;kleine Pause für CPU :-)

Until  Quit = 1
End



KillSnake:           ;Neu wenn tot

StartTime = ElapsedMilliseconds()   
Score = 0
ClearList(Snake())
Gosub FirstSnake:
R = 1

Return

Hud:   ;Mein Problem
Time = ElapsedMilliseconds()-StartTime

StartDrawing(ScreenOutput())
 DrawingMode(1) 
 FrontColor(255,255,0)
 Locate(5,5)
 DrawText("Score: "+Str(Score)+"                Time: "+Str(Time/1000))
StopDrawing()

Return

Upgrade:   ;Das UpgradeFeld

 If Upgrade = 0
  UpgradeX = Random(28)*35+5
  UpgradeY = Random(20)*35+17
  Upgrade = 1
 Else  
  DisplayTransparentSprite(2,UpgradeX,UpgradeY)
  FirstElement(Snake())
  If SpriteCollision(2,UpgradeX,UpgradeY,1,Snake()\X,Snake()\Y)
   Upgrade = 0
   AddElement(OldUpgrade())
   OldUpgrade()\X = UpgradeX
   OldUpgrade()\Y = UpgradeY
  EndIf
 EndIf

Return

addsnake:  ;Schlange verlängern

LastElement(Snake())
ForEach OldUpgrade()
    
  If OldUpgrade()\X = Snake()\X And Snake()\Y = OldUpgrade()\Y
   Ak + 1
  EndIf 
  
  If (OldUpgrade()\X <> Snake()\X Or Snake()\Y <> OldUpgrade()\Y) And Ak > 0
   Ak - 1
   Score + 100
   AddElement(Snake())
   Snake()\X = OldUpgrade()\X
   Snake()\Y = OldUpgrade()\Y
   DeleteElement(OldUpgrade())
  EndIf 
  
Next

Return

FirstSnake: ;Anfangsschlange

X = 495
Y = 367

For YY = 0 To 175 Step 35
 AddElement(Snake())
 Snake()\X = X
 Snake()\Y = Y + YY 
Next 
 
Return

wiegesagt ist noch NICHT fertig

muss noch aufräumen und son Scheiß

[EDIT] OK das mit TOT habe ich hinbekommen!

Verfasst: 21.08.2005 17:53
von zigapeda
das problem hatte ich auch mal.
kann das sein das da kommt no current screen?

Verfasst: 21.08.2005 18:01
von unix
Wenn ich den debugger ausschalte dan gehts :-)
uns so ist das Spiel von der (function) fertig

wiegesagt Ordung fehlt

Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()

UseJPEGImageDecoder()

OpenScreen(1024,768,32,"Snake")

LoadSprite(0,"E:\Bilder\Weltraum.jpeg")
LoadSprite(1,"E:\Bilder\Star.bmp")
LoadSprite(2,"E:\Bilder\Upgrade.bmp")

Structure Tile
 X.l 
 Y.l
EndStructure

NewList Snake.tile()
NewList OldUpgrade.tile()

Global R.b, Quit.b,Pause.b : R = 1
Global Upgrade.b, UpgradeX.l, UpgradeY.l, Ak.b
Global Score.l, Time.l, Level.l
Gosub FirstSnake

Procedure PlayerControl()
  
  Repeat
  
  MaxElements = CountList(Snake()) 
Dim ItemsX(MaxElements)
Dim ItemsY(MaxElements)
Item = 0

ForEach Snake()

 ItemsX(Item) = Snake()\X
 ItemsY(Item) = Snake()\Y

  If Item = 0
   If R = 3 : Snake()\Y + 35
   ElseIf R = 1 : Snake()\Y - 35
   ElseIf R = 2 : Snake()\X + 35
   ElseIf R = 4 : Snake()\X - 35 : EndIf
  Else
    Snake()\X = ItemsX(Item-1)
    Snake()\Y = ItemsY(Item-1)
  EndIf
 
  item + 1

  Next

  ForEach Snake()
   If Snake()\Y < - 17 : Snake()\Y = 717
   ElseIf Snake()\Y > 751 : Snake()\Y = 17
   ElseIf Snake()\X < - 17 : Snake()\X = 985
   ElseIf Snake()\X > 1007 : Snake()\X = 5 : EndIf
  Next

  Delay(100-Level*10)
  
  ForEver
  
EndProcedure






ThreadIDPlayerControl = CreateThread(@PlayerControl(),0)

StartTime = ElapsedMilliseconds()   
      
Repeat

 ExamineKeyboard()

ClearScreen(0,0,0)
 
 DisplaySprite(0,0,0)  ;Hintergrund
 
 Element = 0          ;Tot?   funct noch nicht
 ForEach Snake()
  If Element = 0   
    FirstX = Snake()\X 
    FirstY = Snake()\Y
  ElseIf Element > 0 And FirstX = Snake()\X And Snake()\Y = FirstY
      Gosub KillSnake
  EndIf
  DisplayTransparentSprite(1,Snake()\X,Snake()\Y)
  Element + 1
 Next
 
 Gosub Hud      ;Mein Problem

 Gosub Upgrade   ;Upgrade zufällig auf Bildschirm
 Gosub AddSnake ;Schlange um 1 verlänger wenn eine kollision anliegt
 
  
FlipBuffers()

i = CountList(Snake()) 
Level = (i - 5)/3
If Level > 10 : Level = 10 : EndIf

If KeyboardPushed(#PB_Key_Up) And R <> 3 : R = 1     ;Steuerung
ElseIf KeyboardPushed(#PB_Key_Right) And R <> 4 : R = 2
ElseIf KeyboardPushed(#PB_Key_Down) And R <> 1 : R = 3
ElseIf KeyboardPushed(#PB_Key_Left) And R <> 2 : R = 4 : EndIf

If KeyboardPushed(#PB_Key_Escape) : Quit = 1 : EndIf

Delay(1)  ;kleine Pause für CPU :-)

Until  Quit = 1
End



KillSnake:           ;Neu wenn tot

StartTime = ElapsedMilliseconds()   
Score = 0
ClearList(Snake())
Gosub FirstSnake:
R = 1

Return

Hud:   ;Mein Problem
Time = ElapsedMilliseconds()-StartTime

StartDrawing(ScreenOutput())
 DrawingMode(1) 
 FrontColor(255,255,0)
 Locate(5,5)
 DrawText("Score: "+Str(Score)+"                Time: "+Str(Time/1000)+"                Level: "+Str(Level))
StopDrawing()

Return

Upgrade:   ;Das UpgradeFeld

 If Upgrade = 0
  UpgradeX = Random(28)*35+5
  UpgradeY = Random(20)*35+17
  Upgrade = 1
 Else  
  DisplayTransparentSprite(2,UpgradeX,UpgradeY)
  FirstElement(Snake())
  If SpriteCollision(2,UpgradeX,UpgradeY,1,Snake()\X,Snake()\Y)
   Upgrade = 0
   AddElement(OldUpgrade())
   OldUpgrade()\X = UpgradeX
   OldUpgrade()\Y = UpgradeY
  EndIf
 EndIf

Return

addsnake:  ;Schlange verlängern

FirstElement(Snake())
ForEach OldUpgrade()
    
  If OldUpgrade()\X = Snake()\X And Snake()\Y = OldUpgrade()\Y
   Ak + 1
  EndIf 
  
  If (OldUpgrade()\X <> Snake()\X Or Snake()\Y <> OldUpgrade()\Y) And Ak > 0
   Ak - 1
   Score + 100
   AddElement(Snake())
   Snake()\X = OldUpgrade()\X
   Snake()\Y = OldUpgrade()\Y
   DeleteElement(OldUpgrade())
  EndIf 
  
Next

Return

FirstSnake: ;Anfangsschlange

X = 495
Y = 367

For YY = 0 To 175 Step 35
 AddElement(Snake())
 Snake()\X = X
 Snake()\Y = Y + YY 
Next 
 
Return
müsster mal Zocken macht voll bock man!!

[EDIT]
meine Tiles sind 34 x 34 Pixel

Stern ist snaketile und upgrade ist natürlich upgrade

Sprite 0 = Background

Verfasst: 21.08.2005 18:03
von zigapeda
ja zocken und wo gibts die bilder?

Verfasst: 21.08.2005 18:17
von DarkDragon
unix hat geschrieben:meine Tiles sind 34 x 34 Pixel

Stern ist snaketile und upgrade ist natürlich upgrade

Sprite 0 = Background
32 x 34 O_o ich denke du meinst eher 32 x 32

Verfasst: 21.08.2005 18:37
von zigapeda
nee so wies aussieht sinds wohl echt 34X34.
Ich hab es getestet.