Spielfigur und Schussrichtung ädern

Anfängerfragen zum Programmieren mit PureBasic.
seggl
Beiträge: 17
Registriert: 25.08.2005 16:57

Spielfigur und Schussrichtung ädern

Beitrag von seggl »

was muss ich tun, um die spielfigur wenn ich z.b. auf die aufwärtspfeiltaste drücke sich die spielfigur auch nach oben richtet und wenn ich jetz eine taste zum schiessen drücke die schüsse nach oben fliegen? das spiel wird von oben betrachtet mann kann es sich wie bomberman vorstellen.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

du brauchst entweder 4 bilder mit oben unten, rechts und links die du dann jeweils wie du sie brauchst anzeigst oder du benutzt sprite3d, mit dem kann man ein bild glaub ich drehen oder?
wegen dem schießen, da machst du es einfach so das wenn du auf eine pfeiltaste drückst dass dann eine variable gesetzt wird z.B. für oben wird die variable 1 (wenn du noch konstanten definierst wird es einfacher z.B. #oben)
wenn die variable jetzt 1 ist und dann auf feuer gedrückt wird, wird ein schuss erstellt (linkedlist) der sich dann nach oben bewegt (wegen variable = 1)
[Edit]verwendest du DX oder GUI?[/Edit]
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

ich empfele Die Sprite libary
Wobei du aber eine menge Bilder benötigst!
Für jedes Frame eines.
Da gibt es aber ne gute lösung:
Robsite\Texturen\RainersTileset
Sehr gute Bilder konstellos zum download

beispiel:

If Richtung oben
Sprite Stopp oben
endif

...

Wenn du ein Stradegiespiel machen willst musst du mit ca. 1000 bildern rechnen




du kanst es auch mit Gif versuchen (bewegte Bilder) habe ich leider aber noch nicht versucht
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Also mal ein konkreteres Beispiel:

Code: Alles auswählen

#links = 0
#rechts = 1
#hoch = 2
#runter = 3

;...

If KeyboardPushed(#PB_Key_Left)
  Richtung = #links
EndIf
If KeyboardPushed(#PB_Key_Right)
  Richtung = #rechts
EndIf
; und natürlich noch für die anderen beiden Richtungen entsprechend

; Dann:

Select Richtung
Case #links
  PlayerX-1
Case #rechts
  PlayerX+1
; etc
EndSelect
Wenn der Spieler immer nur einen Schuß abfeuern kann, benötigst Du keine LinkedList. Da dies aber nur selten erwünscht ist (bei www.gloomy-nights.de z.B. ist es so), ist die Idee mit der LinkedList gar nicht schlecht. Du kannst es nun so lösen: Wenn die Leertaste (bzw. die entsprechende Feuertaste) gedrückt wird, erstellst Du einen neuen Schuß an der X- und Y-Position des Spielers und gibst die entsprechende Richtung an. Die Struktur für den Schuß kann also z.B. so aussehen:

Code: Alles auswählen

Structure Shoot
  XPos.w
  YPos.w
  Richtung.b
EndStructure
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Für die Grafik selbst würde ich es so machen, daß Du eine einzige Bitmap anlegst, wo sich alle Animationsphasen der Figur drin befinden.

Und zwar erst die Folge für die nach links schauende Figur, dann nach rechts, dann hoch, dann runter. Denn dann kannst Du das Sprite entsprechend der Richtung clippen:

ClipSprite(#Player, Animationsphase*Breite, Richtung*Hoehe)

Die Animationsphase würde ich pro Frame hochzählen. Ich mach es z.B. so, daß ein Counter namens anicnt immer um einen bestimmten Wert erhöht wird, und beim Maximalwert wieder auf Null gesetzt wird. Damit die Sprite-Animation nicht zu schnell abläuft, benutze ich den %-Operator.

Zum Beispiel:

ClipSprite(#Player, int(anicnt%100)*32, Richtung*32)

In dem Fall wäre das Sprite z.B. 32x32 Pixel groß. Wenn anicnt unter 100 ist, kommt bei der Rechnung int(anicnt%100)*32 NULL raus, zwischen 100 und 200 kommt 32 raus, dann zwischen 200 und 300 kommt 64 raus etc, und bei 400 z.B. mußt du den Counter wieder auf 0 setzen. Jetzt kannst Du die Erhöhung des Counters pro Frame zum Test unterschiedlich hoch festlegen, beispielsweise anicnt+12 oder anicnt+20 etc und schauen, welche Geschwindigkeit am besten aussieht.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

@ ZeHa

Gute alternative :allright:

merke ich mir!
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Zeha hat geschrieben:ClipSprite(#Player, int(anicnt%100)*32, Richtung*32)

hast du das schonmal so verwendet?

1. Int() bei Modulo ist redundant,
weil das ergebnis schon integer ist.

2. Int(a%b) verursacht einen fehler,
da Int() sein argument in floats umwandelt,
Modulo aber nicht mir floats arbeitet.

3. Modulo ist extrem langsam.
testet mal diesen code (ohne debugger):

Code: Alles auswählen

time.l = ElapsedMilliseconds()

For n.l=0 To 100000000
    anicnt+1
    act = anicnt%100
Next

dur1 = ElapsedMilliseconds()-time
time = ElapsedMilliseconds()

For n.l=0 To 100000000
    delay+1
    If delay>100
        anicnt+1
    EndIf
    act = anicnt
Next

dur2 = ElapsedMilliseconds()-time

MessageRequester("Modulo-test", "Modulo: "+Str(dur1)+Chr(13)+Chr(10)+"If: "+Str(dur2))
man sieht deutlich:
die verwendung eines delay-counters ist wesentlich performanter als die verwendung von modulo.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ehrlich gesagt hab ich das einfach so aus dem Kopf reingeschrieben. Ich wunder mich selbst grad, ich glaub nämlich daß ich entweder Int(anicnt/100) oder anicnt%100 genommen hab. Muß aber morgen mal nachschauen...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

was mir grad erst auffällt...

modulo ist ja absoluter quatsch...

du meintest wohl geteilt...

modulo liefert auch ganz andere ergebnisse als von dir beschrieben..

da hab ich selber nicht aufgepasst... hätt mir mein post sparen können... >__<
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Jepp, ist richtig. Hab geteilt verwendet. Modulo hab ich zu anderen Zwecken eingesetzt ;)
Antworten