Sprites setzen mit Maus

Anfängerfragen zum Programmieren mit PureBasic.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Sprites setzen mit Maus

Beitrag von obar »

Hallo zusammen,

Ich möchte sprites mit der Maus irgendwo auf dem Screen Positionieren.
Der Sprite ist mein Mauszeiger und jedesmal wenn ich Maustaste drücke soll der Sprite an dieser x y Position gezeichnet werden. Dies Funktioniert auch soweit. Problem ist aber das an der Position X=1 Y=1 auch einer gezeichnet wird. Ich verstehe nicht wieso. Ich wäre froh wenn einer mir Tipps geben könnte wie ich das Verbessern könnte.

Code: Alles auswählen

InitMouse()
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"")

anzahl=6

Dim x(anzahl)
Dim y(anzahl)
LoadSprite(10,"sprite1.bmp",0) 

For i=1 To anzahl

Repeat 
  ExamineMouse() 
  ExamineKeyboard() 
  DisplayTransparentSprite(10,MouseX(),MouseY()) 
  If MouseButton(1)
    If druck2=1
      If MouseX() > 1 And MouseX() < 1024  And MouseY() > 1 And MouseY() < 768  
        x(i)=MouseX()
        y(i)=MouseY()
      var=1
      EndIf 
      Beginn = 1
    EndIf 
    druck2=0
    Else 
    druck2=1
  EndIf
  
  For k=1 To anzahl
    If var=1
    DisplayTransparentSprite(10,x(k),y(k))
    EndIf 
  Next
    
  If KeyboardPushed(#PB_Key_Escape) 
      End 
  EndIf 
      
  FlipBuffers() 
  ClearScreen(RGB(0,0,0)) 
Until Beginn = 1 
beginn=0
Next

End
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ganz einfach, Du zeichnest ja immer alle Sprites. Und zwar von k=1 To anzahl, also in dem Fall 6 Sprites. Anfangs sind deren x- und y-Positionen alle 0, daher zeichnet er bei (0|0) einfach alle übereinander, bis auf die, die Du bereits gesetzt hast.

Hab den Fehler behoben und versucht, den Code mal ein bißchen aufzuräumen:

Code: Alles auswählen

InitMouse() 
InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,32,"") 

anzahl = 6
spriteCounter = 0

Dim x(anzahl) 
Dim y(anzahl) 
LoadSprite(10, "sprite1.bmp", 0)

Repeat
    ClearScreen(0)

    ; Sprites anzeigen
    For i = 1 To spriteCounter
        DisplayTransparentSprite(10, x(i), y(i))
    Next i

    ; Maus anzeigen
    ExamineMouse()
    mx = MouseX()
    my = MouseY()
    DisplayTransparentSprite(10, mx, my)

    ; Klick überprüfen
    If MouseButton(1)
        click = 1
    Else
        If click = 1
            click = 2
        EndIf
    EndIf
    
    ; Sprite setzen
    If click = 2
        If mx > 1 And mx < 1024 And my > 1 And my < 768
            spriteCounter +1
            
            If spriteCounter > anzahl
                End
            EndIf
            
            x(spriteCounter) = mx
            y(spriteCounter) = my
        EndIf
        
        click = 0
    EndIf

    FlipBuffers()
    Delay(1)

    ; ESC überprüfen
    ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
        End
    EndIf
ForEver
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Danke vielmal. Ist ein super Forum hier.
Ich werde den Code mal erweitern mit Kollisionsabfrage. Zudem will ich das setzen der Sprites noch auf einen bestimmten Bereich im Screen begrenzen.
Falls dazu noch Fragen auftauchen sollten komme ich gerne hierher zurück.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Ich Habe den Code nun mal erweitert. Es werden nun 3 Kanonen gesetzt. Die erste Kanone gibt nun 2 Schüsse ab bevor die nächste Kanone drankommt und ebenfalls 2 Schüsse abgibt usw.. Die weite der Schüsse wird anhand einer Zufallszahl bestimmt. Eigentlich funktionierts der Code so.
Aber ich bin nicht wirklich zufrieden mit dem Code. Leider fehlt mir noch die Erfahrung um dies weiter zu Optimieren. Der erste Teil ist natürlich in Ordnung. Da wurde mir heute Morgen schon geholfen.


Code: Alles auswählen

InitMouse() 
InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,32,"")
UsePNGImageDecoder() 

Procedure ZufallszahlBereich(von, bis) 
   ProcedureReturn Random(bis-von)+von 
EndProcedure

anzahl = 3 
spriteCounter = 0 

Dim x(anzahl) 
Dim y(anzahl) 
LoadSprite(10, "sprite1.bmp", 0)
LoadSprite(11, "kugel.png",0) 

Repeat 
    ClearScreen(0) 

    ; Sprites anzeigen 
    For i = 1 To spriteCounter 
        DisplayTransparentSprite(10, x(i), y(i)) 
    Next i 

    ; Maus anzeigen 
    ExamineMouse() 
    mx = MouseX() 
    my = MouseY() 
    DisplayTransparentSprite(10, mx, my) 

    ; Klick überprüfen 
    If MouseButton(1) 
        click = 1 
    Else 
        If click = 1 
            click = 2 
        EndIf 
    EndIf 
    
    ; Sprite setzen 
    If click = 2 
        If mx > 300 And mx < 700 And my > 100 And my < 400 
            spriteCounter +1 
            
            If spriteCounter > anzahl 
                Break 
            EndIf 
            
            x(spriteCounter) = mx 
            y(spriteCounter) = my 
        EndIf 
        
        click = 0 
    EndIf 

    FlipBuffers() 
    Delay(1) 

    ; ESC überprüfen 
    ExamineKeyboard() 
    If KeyboardReleased(#PB_Key_Escape) 
        End 
    EndIf 
ForEver 

; Bis hierher ist es ok, aber dann ....... 

Dim zufallszahl.w(anzahl*2)
Dim yy(anzahl*2)
For i = 1 To anzahl*2
  zufallszahl.w(i)=ZufallszahlBereich(-220,-80)
  yy(i)=0
Next 

zaehler=1
a=1
schuss=0

Repeat

  FlipBuffers() 
  ClearScreen(0) 
    
  ; Sprites gesetzt  
  For i = 1 To anzahl 
        DisplayTransparentSprite(10, x(i), y(i)) 
  Next i 
    
  ;schüsse abfeuern
    
  For i = a To a
    If zufallszahl.w(i)<yy(i)
      DisplayTransparentSprite(11,x(zaehler)+11,y(zaehler)+yy(i))
      yy(i)=yy(i)-1
    EndIf   
    If zufallszahl.w(i)=yy(i)  
      a=a+1
      schuss=schuss+1
    EndIf
    If schuss=2
      zaehler=zaehler+1
      schuss=0
    EndIf
    If a> anzahl*2
      End
    EndIf
  Next i    
    
  ; ESC überprüfen 
  ExamineKeyboard() 
  If KeyboardReleased(#PB_Key_Escape) 
      End 
  EndIf 
ForEver
Antworten