Startpunkt

Anfängerfragen zum Programmieren mit PureBasic.
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Startpunkt

Beitrag von TheNewOne »

Hallo zusammen,
ich habe mal wieder PureBasic rausgekramt und ein bisschen rumprobiert.
Ich wollte ein kleines Spiel programmieren. Nun bin ich auf folgendes Problem gestoßen:
Ich hab ein Frame an der Position X,Y. Dieses kann ich mit den Pfeiltasten. Soweit, so gut.
Wenn ich aber nun die Leertaste drücke soll sich ab der Position X,Y ein anderes Frame konstant nach rechts bewegen, bis es den Bildschirmrand berührt.
Ich habe schon einiges probiert, doch bisher hat es nicht funktioniert.
Hoffentlich kann mir jemand helfen.

mgf TheNewOne
Win7, 64bit, PB 4.60
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Startpunkt

Beitrag von Bisonte »

Dazu fällt mir folgender Code ein...

Code: Alles auswählen

Select ForumPost
    
  Case Ausführbarer_TestCode
    CallFunctionFast(CommunityHilfe)
    
  Case KlareFragestellung
    CallFunction(Hilfe)
    
  Case AllesAusDerNaseZiehn
    End
    
  Default
    CallFunction(StocherImDunkeln)
    
EndSelect
Sorry aber das musste raus ;)

In der Tat würde Dein bisher geschriebener Code durchaus die Leute hier dazu veranlassen,
Dir flink eine Antwort zukommen zu lassen.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Startpunkt

Beitrag von TheNewOne »

Tut mir leid...

Hier der Code:

Code: Alles auswählen

If InitSprite() = 0
  MessageRequester("Fehler!","Fehler!")
EndIf

If InitKeyboard() = 0
  MessageRequester("Fehler!","Fehler!")
EndIf  

If OpenScreen(800,600,32,"FiSho") = 0
  MessageRequester("Fehler!","Fehler!")
EndIf

LoadSprite(0,"frames\ship.bmp",0)
LoadSprite(1,"frames\shoot.bmp",0)

pos_x = 0
pos_y = 0
pos_shoot_x = pos_x
pos_shoot_y = pos_y

Repeat
  FlipBuffers()
  ClearScreen(0)
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_Right)
    pos_x + 5
    If pos_x > 705
      pos_x = 0
    EndIf 
  EndIf
  
  If KeyboardPushed(#PB_Key_Left)
    pos_x - 5
    If pos_x < -5
      pos_x = 700
    EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    pos_y - 5
    If pos_y < -5
      pos_y = 505
    EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)
    pos_y + 5
    If pos_y > 500
      pos_y = 0
    EndIf
    
  EndIf
  
  If KeyboardPushed(#PB_Key_Escape)
    
    
    Repeat
    pos_shoot_x + 1    
    Until pos_shoot_x =700
    
    If pos_y > 500
      pos_y = 0
    EndIf
    
  EndIf
  
  DisplayTransparentSprite(0,pos_x,pos_y)
  DisplayTransparentSprite(1,pos_shoot_x,pos_shoot_y)
  
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf  
  
  
  
 ForEver 
... wobei ich anmerken sollte, dass das Problem bei dem Folgenden liegt:

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Escape)
    
    
    Repeat
    pos_shoot_x + 1    
    Until pos_shoot_x =700
    
    If pos_y > 500
      pos_y = 0
    EndIf
    
  EndIf
Win7, 64bit, PB 4.60
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Startpunkt

Beitrag von Kiffi »

TheNewOne hat geschrieben:... wobei ich anmerken sollte, dass das Problem bei dem Folgenden liegt:[...]
also ich (als Nicht-Gamer) würde hier #PB_Key_Escape erst einmal durch #PB_Key_Space ersetzen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Startpunkt

Beitrag von NicTheQuick »

Das Problem ist offensichtlich:

Code: Alles auswählen

Repeat
    pos_shoot_x + 1   
    Until pos_shoot_x =700
Hier addierst du immer 1 auf die Position des Schusses ohne ihn aber neu zu zeichnen. Diese Schleife wird so schnell abgearbeitet, dass du gleich hättest pos_shoot_x = 700 hinschreiben können.

Was du machen musst ist folgendes. Du brauchst z.B. eine Variable 'schuss_fliegt', die dann auf 1 gesetzt wird, wenn du ESC drückst. Dann schreibst du außerhalb des Ifs von der Escape-Taste folgenden Code:

Code: Alles auswählen

pos_shoot_x + schuss_fliegt
If pos_shoot_x = 700
  schuss_fliegt = 0
EndIf
Allerdings fehlt hier auch noch das Zurücksetzen der Position deines Schusses. Also was passiert, wenn er am Bildschirmrand angekommen ist? Soll er da bleiben oder wieder an die Schiffsposition gesetzt werden? Ich denke das kriegst du selbst hin. Vielleicht noch ein kleiner Tipp. Da du jetzt ja weißt, wann der Schuss fliegt, kannst du die Variable 'schuss_fliegt' auch nutzen um zu steuern, dass der Schuss überhaupt gezeichnet wird. Also nur wenn 'schuss_fliegt' ungleich 0 ist, rufst du 'DisplayTransparentSprite(1,pos_shoot_x,pos_shoot_y)' auf.
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Startpunkt

Beitrag von TheNewOne »

Kiffi hat geschrieben:
TheNewOne hat geschrieben:... wobei ich anmerken sollte, dass das Problem bei dem Folgenden liegt:[...]
also ich (als Nicht-Gamer) würde hier #PB_Key_Escape erst einmal durch #PB_Key_Space ersetzen.

Grüße ... Kiffi
Stimmt, da hast du recht :). Ist mir auch eben aufgefallen, trozdem danke.

Auch eine Danke an NickTheQuick, deine Antwort hat mir sehr geholfen.
Win7, 64bit, PB 4.60
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Startpunkt

Beitrag von Bisonte »

Bisonte hat geschrieben:In der Tat würde Dein bisher geschriebener Code durchaus die Leute hier dazu veranlassen,
Dir flink eine Antwort zukommen zu lassen.
Hoho... Nach posten des Codes nur 12 Minuten ;)

So sehe ich meinen Codeschnippsel oben als #True :lol:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten