Hintergrundgrafik flimmert

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Hintergrundgrafik flimmert

Beitrag 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^^
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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()
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

danke jetzt funzt es


bin nur noch nicht so erfahren :p
Antworten