Seite 1 von 1

Grafik einfügen

Verfasst: 20.09.2004 11:29
von jonathan
Hallo,
ich bin noch anfänger und möchte in das Programm ein Bild einfügen. Es ist so eingestellt das der Hintergrund neutral ist, und wenn ich da nen bild einfügen will, dann malt der Ball den ganzen Bildschirm voll. Kann mir da jemand helfen.
Ich hab da unten meinen Quelltext eingefügt damit ihr es mal nachgucken könnt.
Danke




Code: Alles auswählen

; 1. Inizierung
;die tastatur wir angegeben und die Bildschirmauflösung auf 1024, 768 gesetzt
InitSprite()
InitKeyboard()
OpenScreen(1024,768,16,"ppb")
;dies sind die VAriablen für den Schläger und den Ball, X und Y wert des Bildschirms
Global BallX.w
Global BallY.w
Global SchlaegerX.w
Global SchlaegerY.w
Global BewegX.w
Global BewegY.w
Global Schlaeger2X.w
Global Schlaeger2Y.w
Global BackX.w
Global BackY.w
Global Durchgefallen.w
Global tuchpoint.w
Global tuchpoint2.w

;position des Balles, flugrichtung des balles, und position des schläegers
BallX = 619
BallY = 439
BewegX = -2
BewegY = -2
SchlaegerX = 1024 - 5
SchlaegerY = 400 - (40 / 2)
Schlaeger2X = 5 - 5
Schlaeger2Y = 400 - (40 / 2)
tuchpoint = 0
tuchpoint2 = 0

Repeat

; laden der Grafik
LoadSprite(0,"GFX\Back.bmp",0)

; 2. Grafik setzen
ClearScreen(0,0,0)
StartDrawing(ScreenOutput())
DisplaySprite(0,BackX,BackY)
FrontColor(255,255,255)
DrawingMode(1)                      ;Hintergrund hinter der Schrift neutral
Locate(400,25)                         ; Die Punkte sollen nach links oben
DrawText("1. Player: " + Str(tuchpoint))   ; Und da sind Sie auch schon
Locate(530,25)                       ; Die Anzeige der Durchgefallenen soll nach rechts oben
DrawText("2. Player: " + Str(tuchpoint2)) ; ...
;Box(0,0,20,768)                    ;wand links
Box(0,0,1024,20)                    ;wand oben
Box(0,748,1024,20)                  ;wand unten
Box(SchlaegerX,SchlaegerY,5,40)     ;schlägergröße
Box(Schlaeger2X,Schlaeger2Y,5,40)   ;schlägergröße 2
Box(BallX-1,BallY-1,3,3)            ;weil der ball genau in der mitte sein soll und der ball aber 3 Pixel hat und der 2te soll es sein
StopDrawing()                       ;beenden das malvorgangs
FlipBuffers()

; 3. Abfrage der Benutzer Eingaben
ExamineKeyboard()
If KeyboardPushed(200)              ;taste nach oben
 SchlaegerY - 2                     ;bewegen nach oben
EndIf
If KeyboardPushed(208)              ;taste nach unten
 SchlaegerY + 2                     ;bewegen nach unten
EndIf

If SchlaegerY < 21                  ;damit der schläger nicht aus der Wand raus geht
 SchlaegerY = 20
ElseIf SchlaegerY > 748 - 40
 SchlaegerY = 748 - 40
EndIf

;Schläger2
If KeyboardPushed(#PB_Key_W)              ;taste nach oben
 Schlaeger2Y - 2                     ;bewegen nach oben
EndIf
If KeyboardPushed(#PB_Key_S)              ;taste nach unten
 Schlaeger2Y + 2                     ;bewegen nach unten
EndIf

If Schlaeger2Y < 21                  ;damit der schläger nicht aus der Wand raus geht
 Schlaeger2Y = 20
ElseIf Schlaeger2Y > 750 - 40
 Schlaeger2Y = 750 - 40
EndIf

; 4. Bewegung des Balles
BallX + BewegX
BallY + BewegY

; 5. Kollision				
If BallX < 0                       ;wenn der ball gegen die wand fliegt soll er die Flugrichtung ändern von negativ zu positiv
 BewegX = 2
EndIf
If BallY < 20 
 BewegY = 2
EndIf
If BallY > 748 
 BewegY = -2
EndIf



;wenn der ball den schläger berührt ändert er die flugrichtung
If BallX > SchlaegerX And BallX < SchlaegerX + 5 And BallY > SchlaegerY And BallY < SchlaegerY + 40
 BewegX = -2
 tuchpoint2 = tuchpoint2 +1
EndIf

;wenn der ball den schläger berührt ändert er die flugrichtung
If BallX > Schlaeger2X And BallX < Schlaeger2X + 5 And BallY > Schlaeger2Y And BallY < Schlaeger2Y + 40
 BewegX = 2
 tuchpoint = tuchpoint +1
EndIf

;falls er den ball trifft, so fängt er wieder bei REPEAT an und läuft alles erneut durch
Until KeyboardPushed(1) Or BallX > 1024 Or BallX < 0 ;wenn der ball auserhalb des bildschirms ist, ist das spiel zu ende oder die esc taste wird gedrückt
Delay(500)
CloseScreen()
If Str(tuchpoint) > Str(tuchpoint2)
 MessageRequester("Game Over", "Der 1. Player hat mit " + Str(tuchpoint) + " Punkten gewonnen!",0) ; Und noch einmal die Punkte anzeigen
  ElseIf Str(tuchpoint) = Str(tuchpoint2)
    MessageRequester("Game Over", "Unentschieden!",0) ; Und noch einmal die Punkte anzeigen 
  Else
    MessageRequester("Game Over", "Der 2. Player hat mit " + Str(tuchpoint) + " Punkten gewonnen!",0) ; Und noch einmal die Punkte anzeigen
EndIf
Edit by NicTheQuick: Code-Tags gesetzt

Verfasst: 20.09.2004 21:40
von Lars
Du hast in deinem Code 2 Hauptprobleme:

-Du lädst in jeder Loop das Hintergrundbild neu - Wieso? Reicht dir die eine "Instanz" nicht? :)

-Du zeichnest ein Sprite innerhalb von Start-/StopDrawing(). Das brauchst
du bei den Spritebefehlen nicht, das ist nur bei den sog. "Drawing
Primitives", also deinen Box()es etc. nötig.

Ich habe einfach mal das LoadSprite() und das DisplaySprite() komplett
auskommentiert und alles lief super. Ich denke, du solltest einfach das
Sprite vor der Mainloop laden (wichtig: Den Rückgabewert auf Fehler
überprüfen!) und dann außerhalb von Start-/StopDrawing() zeichnen.

Verfasst: 20.09.2004 23:48
von RaVeN99
Das was Lars angesprochen hat ist mir auch aufgefallen - allerdings noch 2 weiter kleinigkeiten:

a) Du solltest einrücken - so wie er hier zu sehen ist ist dein Code nahezu unlesbar, weil unübersichtlich
b) Etwas was man im alten Forum oftmal lesen konnte: Der variablentyp word ist nicht zu empfehlen, er frisst zwar weniger Speicher - was vordergründig eine "Code Optimierung" zu sein scheint, aber Danilo hatte mal so ein schönes Rechenexempel welches zeigte dass variablen extrem wenig Speicher verbrauchen - sogar in massen. Nun wäre das ganze ja nicht so tragisch, wenn das Arbeiten mit word variablen nicht so langsam wäre, deswegen nimmt man lieber long variablen, die brauchen zwar mehr speicher, aber das ist wie wir gerade gemerkt haben verschwindend gering. Der vorteil den wir dadurch haben: Durch das arbeiten mit den long variablen bekommt man zusätzlich nochmal ein quäntchen mehr geschwindigkeit (liegt glaub ich daran dass longs 32 bit variablen sind und der normale rechner von heute eben auch mit 32 bit arbeitet *keine gewähr*). Also als Faustregel lieber longs nehmen statt words (natürlich strings ausgenommen ;)) wobei es da sicherlich auch ausnahmen geben wird.

[Offtopic]
Wie stehts eigentlich mit der deklarierung von Boolschen Konstanten? Hab ich damit gegenüber longs nen vorteil oder bleibt sich des gleich???
Die Frage kam mir grade beim schreiben in den sinn - vielleicht weiss jemand ne Antwort darauf?
[/Offtopic]

Und hier nochmal - um dir zu zeigen wie ne bessere Formatierung aussieht (iss sicher ned des optimale - jeder hat nen eigenen stil), der verbesserte Code (allerdings ohne Komentare und mit n paar anderen kleinen änderungen):

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,16,"ppb") 

BallX.l = 619
BallY.l = 439
SchlaegerX.l = 1024 - 5
SchlaegerY.l = 400 - (40 / 2)
BewegX.l = -2
BewegY.l = -2
Schlaeger2X.l = 0
Schlaeger2Y.l = 400 - (40 / 2) 
Durchgefallen.l = 0
tuchpoint.l = 0
tuchpoint2.l = 0   

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

Repeat 
 ExamineKeyboard()
 DisplaySprite(0, 0, 0)
 
  StartDrawing(ScreenOutput()) 
    FrontColor(255,255,255) 
    DrawingMode(1) 
    Locate(400,25) 
    DrawText("1. Player: " + Str(tuchpoint)) 
    Locate(530,25)  
    DrawText("2. Player: " + Str(tuchpoint2)) ; ... 
    Box(0,0,1024,20) 
    Box(0,748,1024,20) 
    Box(SchlaegerX,SchlaegerY,5,40) 
    Box(Schlaeger2X,Schlaeger2Y,5,40) 
    Box(BallX-1,BallY-1,3,3) 
  StopDrawing() 


  If KeyboardPushed(200) 
    SchlaegerY - 2 
  EndIf 
  If KeyboardPushed(208) 
    SchlaegerY + 2 
  EndIf 

  If SchlaegerY < 21 
    SchlaegerY = 20 
  ElseIf SchlaegerY > 748 - 40 
    SchlaegerY = 748 - 40 
  EndIf 

 
  If KeyboardPushed(#PB_Key_W) 
    Schlaeger2Y - 2 
  EndIf 
  If KeyboardPushed(#PB_Key_S) 
    Schlaeger2Y + 2 
  EndIf 

  If Schlaeger2Y < 21 
    Schlaeger2Y = 20 
  ElseIf Schlaeger2Y > 750 - 40 
    Schlaeger2Y = 750 - 40 
  EndIf 

 
  BallX + BewegX 
  BallY + BewegY 
 
  If BallX < 0 
    BewegX = 2 
  EndIf 
  If BallY < 20 
    BewegY = 2 
  EndIf 
  If BallY > 748 
    BewegY = -2 
  EndIf 


  If BallX > SchlaegerX And BallX < SchlaegerX + 5 And BallY > SchlaegerY And BallY < SchlaegerY + 40 
    BewegX = -2 
    tuchpoint2 = tuchpoint2 +1 
  EndIf 
 
  If BallX > Schlaeger2X And BallX < Schlaeger2X + 5 And BallY > Schlaeger2Y And BallY < Schlaeger2Y + 40 
    BewegX = 2 
    tuchpoint = tuchpoint +1 
  EndIf 

 FlipBuffers() 

Until KeyboardPushed(1) Or BallX > 1024 Or BallX < 0 

Delay(500) 
CloseScreen() 

If Str(tuchpoint) > Str(tuchpoint2) 
  MessageRequester("Game Over", "Der 1. Player hat mit " + Str(tuchpoint) + " Punkten gewonnen!",0) 
ElseIf Str(tuchpoint) = Str(tuchpoint2) 
  MessageRequester("Game Over", "Unentschieden!",0) 
Else 
  MessageRequester("Game Over", "Der 2. Player hat mit " + Str(tuchpoint) + " Punkten gewonnen!",0) 
EndIf 
Über die weiteren Änderungen kann man sich streiten - wie gesagt geschmackssache :)
Aber so sollte ein halbwegs vernünftig formatierter Quelltext aussehen :)

Mfg
RaVeN