Ball und Fahrstuhl | läuft auch unter PB 3.3, erweiterbar!!!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Ball und Fahrstuhl | läuft auch unter PB 3.3, erweiterbar!!!

Beitrag von Xaby »

Code: Alles auswählen

; Test von Folker Linstedt aka xaby 
; PB 4.x 
; 2007|08|13 


If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Error", "Can't open DirectX 7 or later", 0) 
  End 
EndIf 


Global HeldX : HeldX=100 
Global HeldY : HeldY=100 
Global hoch : hoch=150 
Global Richtung : Richtung=1 



Procedure Held() 
  If KeyboardPushed(#PB_Key_Left) 
    HeldX-10 
    If HeldX<20 
      HeldX=630 
    EndIf 
  EndIf 
  If KeyboardPushed(#PB_Key_Right) 
    HeldX+10 
    If HeldX>620 
      HeldX=-10 
    EndIf 
  EndIf 
  
  ; WandAbfrage 
  Wand=0 
  
  For i=0 To 9 
    If SpriteCollision(0,HeldX,HeldY,1,0+64*i, 400) 
      Wand=1 
      DisplaySprite(2, 0+64*i, 400) 
    EndIf 
  Next 
  If SpriteCollision(0,HeldX,HeldY,1,264,Hoch) 
    Wand=2 
    DisplaySprite(2,264,Hoch) 
  EndIf 
  If SpriteCollision(0,HeldX,HeldY,1,328, 200) 
    Wand=1 
    DisplaySprite(2,328,200) 
  EndIf 
  If SpriteCollision(0,HeldX,HeldY,1,200, 200) 
    Wand=1 
    DisplaySprite(2,200,200) 
  EndIf 
  
  ; Guter Vorschlag von DarkDragon!!! 
  If Wand = 2 
    ziel = hoch - 30 
    If ziel < HeldY 
      HeldY - 1 
    ElseIf ziel > HeldY 
      HeldY + 1 
    EndIf 
  EndIf 
  
  If Wand=0 
    HeldY+5 
  EndIf 
  
  DisplayTransparentSprite(0, HeldX, HeldY) 
EndProcedure 


Procedure Mauer() 
  
  DisplaySprite(1, 200, 200) 
  DisplaySprite(1, 328, 200) 
  
  For i=0 To 9 
    DisplaySprite(1, 0+64*i, 400) 
  Next 
  
EndProcedure 


Procedure Beweg() 
  hoch+1*Richtung 
  ; Debug hoch 
  If Hoch>400 
    Hoch=400 
    Richtung*-1 
  EndIf 
  If Hoch<150 
    Hoch=150 
    Richtung*-1 
  EndIf 
  
  
  DisplaySprite(1, 264, Hoch) 
  
  
EndProcedure 



If OpenScreen(640, 480, 16, "Sprite") 
  
  
  ; Erstelle Kreis auf Sprite 
  CreateSprite(0,32,32) 
  StartDrawing(SpriteOutput(0)) 
  Circle(15,15,15,RGB(255,128,128)) 
  StopDrawing() 
  
  ; Erstelle Balken auf Sprite 
  CreateSprite(1,64,4) 
  StartDrawing(SpriteOutput(1)) 
  Box(0,0,64,4,RGB(0,128,255)) 
  StopDrawing() 
  
  CreateSprite(2,64,4) 
  StartDrawing(SpriteOutput(2)) 
  Box(0,0,64,4,RGB(0,255,0)) 
  StopDrawing() 
  
  Repeat 
    ExamineKeyboard() 
    
    Mauer() 
    Beweg() 
    Held() 
    
    
    Delay(10) 
    
    FlipBuffers() 
    ;ClearScreen(0) ; für PB 4.x
    ClearScreen(0,0,0) ; für PB 3.x
  Until KeyboardPushed(#PB_Key_Escape) 
  
Else 
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0) 
EndIf 

End  
>> für PB 3.3 muss in der Zeile unten stehen: ClearScreen(0,0,0)
>>>>>>>>>>>>> für PB 4.x sollte da stehen ClearScreen(0) bzw. ClearScreen(RGB(0,0,0))

War mal ein kleiner Test, wie man bewegte Flächen machen könnte und einen bewegbaren Ball. Ist natürlich noch nicht ideal. Der Ball dreht sich nicht und er hüpft auch komisch :mrgreen:

Das liegt an der Idee, die ich hatte. Ich wollte ihn immer Fallen lassen und wenn er auf dem Fahrstuhl ist, sollte er etwas nach oben schweben.

:shock:
Zuletzt geändert von Xaby am 16.08.2007 14:45, insgesamt 5-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Fehler: ExamineKeyboard must be called before KeyboardPushed() ;-).

Also ExamineKeyboard() in den Anfang der Hauptschleife, nicht ins Ende!

Btw.: Wenn man mit dem Ball runterspringt wenn der Fahrstuhl zwischendrin ist, dann wackelt der Ball auf dem Fahrstuhl nurnoch hoch und runter.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ich bin ja kein Experte, aber meiner Meinung nach ist es egal wo man Examine Keyboard hin macht.

Es sei denn, es wird von FlipBuffer oder ClearScreen beeinflusst.

Es ist eine Schleife.

Wenn man sich die Befehle alle so vorstellt als wären sie in einem Ring angeordnet, so ist ExamineKeyboard auch wenn es am Ende steht, für den zweiten Durchlauf vor der Abfrage.

Und ganz ehrlich, du wirst nicht merken in welchen Durchlauf der Schleife du die Taste gedrückt hast.

Irgendwie glaube ich, dass ich Recht habe, sonst würde sich der Ball ja nicht bewegen. :mrgreen:
Aber du hast Recht. Im DebugModus kommt die Fehlermeldung :roll: /:->

Und zu deiner Aussage, dass der Ball hüpft ... hab ich auch was geschrieben. Vielleicht machst mal einen Vorschlag, wie man das elegant aber einfach lösen könnte. :? :allright:
Kinder an die Macht http://scratch.mit.edu/
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Hmm... ja, mit dem Fahrstuhlproblem hab ich mich auch schonmal in Gedanken auseinandergesetzt.

Bei deiner Methode würde ich einfach das hier:

Code: Alles auswählen

If Wand=2
  HeldY-1
EndIf
durch

Code: Alles auswählen

  If Wand = 2
    ziel = hoch - 30
    If ziel < HeldY
      HeldY - 1
    ElseIf ziel > HeldY
      HeldY + 1
    EndIf
  EndIf
ersetzen (ruckelt hier nichtmehr), aber so ganz sauber finde ich das alles nicht :? , denn immerhin kann man kopfüber an den oberen Platformen gehen wenn man zu früh aus dem Lift rausgeht.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Siehste das nicht? Der Ball hat Arme und kann sich damit an der Stange entlang hangeln :mrgreen:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Mmmm

Wenn der Held aus mehreren Sprites bestehen würde. Füße, Kopf und Arme ... dann könnte man nur die Füße überprüfen lassen.

Und vielleicht sollten man es nur überprüfen, so lange er fällt.
Und wenn er mit einem anderen Sprite als den Füßen etwas berührt, kann man ihn nicht bewegen.

Dann würde man gegen die Stangen neben dem Fahrstuhl laufen, aber nicht mehr durch sie hindurch. :roll:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Xaby hat geschrieben:Wenn man sich die Befehle alle so vorstellt als wären sie in einem Ring angeordnet, so ist ExamineKeyboard auch wenn es am Ende steht, für den zweiten Durchlauf vor der Abfrage.
ja, beim zweiten schon aber eben nicht beim ersten!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ein Freund aus dem Forum benutzt PB 3.3
und ich weiß nicht genau, ob es alle Befehle da schon gegeben hat.

Und aus unerklärlichen Gründen funktioniert auch die PB 4.x Demo bei ihm nicht.

Genaues weiß ich nicht. Ist halt Hörensagen :(

Wäre cool, wenn einer der PB 3.3er es mal ausprobieren könnte.

Dank euch. Gruß, Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Xaby hat geschrieben:Ein Freund aus dem Forum benutzt PB 3.3
[...]
Wäre cool, wenn einer der PB 3.3er es mal ausprobieren könnte.
? wieso probiert das dann Dein Freund nicht aus?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Hat er, geht nicht.
Hab ihm gesagt, er kann sich die Demo runterladen von 4.x

meinte er, der Compiler wird nicht gefunden oder so etwas ...

War vielleicht nicht sein Tag. Ich weíß es nicht.
Er kennt sich mit Programmierung noch nicht so aus und ist auch leicht ungeduldig. Ich möchte ihm aber trotzdem helfen.

Gruß, Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Antworten