Seite 1 von 1

Hintergrundgrafik flimmert

Verfasst: 25.02.2005 20:00
von Rubiko
sorry, so lang bin ich noch nicht bei purebasic dabei aber ich hab ne frage...
erstmal der code

Code: Alles auswählen

; Init

InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"")

Global BallX.w
Global BallY.w
Global SchlaegerX.w
Global SchlaegerY.w
Global Punkte.w
Global Lives.w
Global Ball.w

Global BewegX.w
Global BewegY.w

BallX = 319
BallY = 239
Lives = 3

BewegX = -50
BewegY = -50

SchlaegerX = 639 - 10
SchlaegerY = 239 - (30 / 2)

LoadSprite(1,"GFX\Back.bmp", 0)
Repeat

If BallX > 460
Durchgefallen = Durchgefallen + 1
EndIf

; Malen!!!!

StartDrawing(ScreenOutput())

FrontColor(255,255,255)

Box(0,0,0,480)
Box(0,0,640,20)
Box(0,460,640,20)
StopDrawing()

StartDrawing(ScreenOutput())
FrontColor(0,255,0)
Box(SchlaegerX,SchlaegerY,10,30)
StopDrawing()
StartDrawing(ScreenOutput())
FrontColor(255,255,255)
Box(BallX-1,BallY-1,3,3)
StopDrawing()
FlipBuffers()

DisplaySprite(1,0,0)
; Tastatureingaben

ExamineKeyboard()

If KeyboardPushed(200)
SchlaegerY - 1
EndIf

If KeyboardPushed(208)
SchlaegerY + 1
EndIf

If SchlaegerY < 21
SchlaegerY = 20
ElseIf SchlaegerY > 460 - 30
SchlaegerY = 460 - 30
EndIf

; Ball Bewegung

BallX + BewegX
BallY + BewegY

If BallX < 20
BewegX = 1
EndIf

If BallY < 20
BewegY = 1
EndIf

If BallY > 460
BewegY = -1
EndIf

If BallX > SchlaegerX And BallX < SchlaegerX + 10 And BallY > SchlaegerY And BallY < SchlaegerY + 30 
 BewegX = -1
EndIf

Until KeyboardPushed(1) Or Lives = 0
----------------------------

ich will da die live anzeige mitreinbringen, was dann so aussehen müsste
(oder auch nicht)

Code: Alles auswählen

; Init

InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"")

Global BallX.w
Global BallY.w
Global SchlaegerX.w
Global SchlaegerY.w
Global Punkte.w
Global Lives.w
Global Ball.w

Global BewegX.w
Global BewegY.w

BallX = 319
BallY = 239
Lives = 3

BewegX = -50
BewegY = -50

SchlaegerX = 639 - 10
SchlaegerY = 239 - (30 / 2)

LoadSprite(1,"GFX\Back.bmp", 0)
Repeat

If BallX > 460
Durchgefallen = Durchgefallen + 1
EndIf

; Malen!!!!

StartDrawing(ScreenOutput())

FrontColor(255,255,255)

Box(0,0,0,480)
Box(0,0,640,20)
Box(0,460,640,20)
StopDrawing()

StartDrawing(ScreenOutput())
FrontColor(0,255,0)
Box(SchlaegerX,SchlaegerY,10,30)
StopDrawing()
StartDrawing(ScreenOutput())
FrontColor(255,255,255)
Box(BallX-1,BallY-1,3,3)
StopDrawing()
FlipBuffers()

DisplaySprite(1,0,0)
; Tastatureingaben

ExamineKeyboard()

If KeyboardPushed(200)
SchlaegerY - 1
EndIf

If KeyboardPushed(208)
SchlaegerY + 1
EndIf

If SchlaegerY < 21
SchlaegerY = 20
ElseIf SchlaegerY > 460 - 30
SchlaegerY = 460 - 30
EndIf

; Anzeigen

StartDrawing(ScreenOutput())
DrawingMode(1)
Locate(10,0)
FrontColor(0,0,255)
DrawText("Lives:" + Str(Lives))
StopDrawing()
FlipBuffers()
ClearScreen(0,0,0)
; Ball Bewegung

BallX + BewegX
BallY + BewegY

If BallX < 20
BewegX = 1
EndIf

If BallY < 20
BewegY = 1
EndIf

If BallY > 460
BewegY = -1
EndIf

If BallX > SchlaegerX And BallX < SchlaegerX + 10 And BallY > SchlaegerY And BallY < SchlaegerY + 30 
 BewegX = -1
EndIf

Until KeyboardPushed(1) Or Lives = 0
der code is unvollständig.. lives sollen natürlich noch abgezogen werden wenn der ball raus geht, und der ball soll wieder in die mitte gesetzt werden

also.. bei mir flimmert der bildschirm
1. frage
wieso?
2.frage
wie setz ich den ball wieder in die mitte wenn er raus fliegt?

andres problem
wenn ich versuch die lives abzuziehen mit den code

Code: Alles auswählen

If BallX > 460
Lives = Lives - 1
Endif
was mach ich hier falsch? das programm beendet sich beim laden einfach wieder...


ok das wars erstmal, sorry für die newbie post..
ich will ehrliche antworten^^

Verfasst: 25.02.2005 20:26
von Kaeru Gaman
also, du musst auf jeden fall BallX wieder auf 10 oder sowas setzen,
sonst fliegt er immer weiter und zieht nacheinander alle leben ab...

Code: Alles auswählen

If BallX > 460 
    BallX = 10
    BallY = 240
    Lives = Lives - 1 
Endif 
...das "durchgefallen" kann raus...


bring etwas mehr ordnung ins ganze prog:

clearscreen() an den anfang, flipbuffers() ans ende,
und dann siehst du auch, dass du 2x flipbuffers() drin hast...
...deshalb flimmerts ;)

mach erst alle variablenberechnungen, und dann alles auf einmal zeichnen.
eine einzige startdrawing()-stopdrawing() reicht für alle ausgaben.

und einrücken (TAB) machts auch übersichtlicher...

btw: nettes proggi, weiter so :allright:

Verfasst: 25.02.2005 21:46
von Rubiko
ok.., ich sag erstmal danke für deine antwort :)

hab den code aufgestockt.. nur von der übersicht und einrückung fehlt noch was
wie auch immer

der code sieht jetzt so aus

Code: Alles auswählen

ClearScreen(0,0,0)

; Init

InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"")

Global BallX.w
Global BallY.w
Global SchlaegerX.w
Global SchlaegerY.w
Global Punkte.w
Global Lives.w
Global Ball.w

Global BewegX.w
Global BewegY.w

BallX = 319
BallY = 239
Lives = 3

BewegX = -50
BewegY = -50

SchlaegerX = 639 - 10
SchlaegerY = 239 - (30 / 2)

LoadSprite(1,"GFX\Back.bmp", 0)
Repeat

; Malen

StartDrawing(ScreenOutput())

FrontColor(255,255,255)

Box(0,0,0,480)
Box(0,0,640,20)
Box(0,460,640,20)

FrontColor(0,255,0)
Box(SchlaegerX,SchlaegerY,10,30)

FrontColor(255,255,255)
Box(BallX-1,BallY-1,3,3)

; Anzeige

DrawingMode(1)
Locate(10,0)
FrontColor(0,0,255)
DrawText("Lives:" + Str(Lives))
StopDrawing()
DisplaySprite(1,0,0)


; Tastatureingaben

ExamineKeyboard()

If KeyboardPushed(#PB_Key_down)
          SchlaegerY - 1
EndIf

If KeyboardPushed(#PB_Key_Up)
          SchlaegerY + 1
EndIf

If        SchlaegerY < 21
          SchlaegerY = 20
ElseIf   SchlaegerY > 460 - 30
          SchlaegerY = 460 - 30
EndIf


; Ball Bewegung

BallX + BewegX
BallY + BewegY

If BallX < 20
BewegX = 1
EndIf

If BallY < 20
BewegY = 1
EndIf

If BallY > 460
BewegY = -1
EndIf

If BallX > SchlaegerX And BallX < SchlaegerX + 10 And BallY > SchlaegerY And BallY < SchlaegerY + 30 
 BewegX = -1
EndIf

If BallX > 460
BallX = 10
BallY = 240
Lives = Lives - 1
EndIf


Until KeyboardPushed(1) Or Lives = 0

FlipBuffers()
jetzt beim kompilieren treten keine fehler auf....
doch beim starten siehts anders aus

"purebasic(irgendneID) hat ein problem festgestellt und muss beendet werden"

wo liegt das problem? macht den code unbrauchbar?

Rubiko

Verfasst: 25.02.2005 22:42
von Kaeru Gaman
ok, sorry, hab mich nicht klar ausgedrückt...

clearscreen() an den anfang der hauptschleife, also direkt nach repeat.

flipbuffers() ans ende der hauptschleife, also direkt vor until...

und das maximale X vom ball muss mindestens so gross sein wie das X vom schläger,
am besten rechter bildrand, also

Code: Alles auswählen

If BallX > 639
    BallX = 20 
    BallY = 240 
    Lives = Lives - 1 
EndIf 
und nicht auf 10 sondern mindestens 20 setzen, da du links ja bei 20 begrenzt

Code: Alles auswählen

If BallX<20
dann müsste es gehen ;)
(also, bei mir gehts...)

übrigens:
du brauchst die variablen nur global machen, wenn du sie in Procedures abfragen willst,
ohne sie an diese zu übergeben...

im moment brauchst du keine globalen Var...

noch etwas ist mir aufgefallen:
zuerst zeichnest du...
aber später zeigst du ein hintergrundsprite an:

Code: Alles auswählen

DisplaySprite(1,0,0)
also würdest du zumindest so gross wie das sprite ist, das gezeichnete übermalen..
ich schätze mal, du willst eine 640x480 grafik als hintergrund anzeigen...
machs am besten direkt nach clearscreen()

Verfasst: 25.02.2005 23:14
von Rubiko
danke jetzt funzt es


bin nur noch nicht so erfahren :p