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.