Seite 1 von 1
Spielfigur und Schussrichtung ädern
Verfasst: 30.09.2005 15:40
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.
Verfasst: 30.09.2005 15:47
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]
Verfasst: 30.09.2005 16:55
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
Verfasst: 30.09.2005 17:05
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:
Verfasst: 30.09.2005 17:12
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.
Verfasst: 30.09.2005 18:12
von unix
@ ZeHa
Gute alternative
merke ich mir!
Verfasst: 01.10.2005 01:44
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.
Verfasst: 01.10.2005 03:17
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...
Verfasst: 01.10.2005 05:30
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... >__<
Verfasst: 01.10.2005 12:00
von ZeHa
Jepp, ist richtig. Hab geteilt verwendet. Modulo hab ich zu anderen Zwecken eingesetzt
