2d 360 grad steuerung?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

silent_source

Betreff: 2d 360 grad steuerung?

BeitragDi, Jun 13, 2006 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hi

ich möchte ein spiel programmieren bei dem man ein raumschiff hat das sich um 360 grad drehen kann mit rechts links pfeiltasten und sich dann in die jeweilige richtung bewegt wenn man nach vorne drückt. Eigentlich genau so wie das in asteroid uns spacecombat von robbs bb kurs gemacht wird nur das ich den code einfach nicht verstehe. Sad
Der Beispielcode unten kommt dem schon ziemlich nahe nur wie mache ich das wenn ich eine grafik habe statt des punktes das diese sich auch mitbewegt bei der Drehung Question

; Rob´s BB-Kurs 2
; Robert Gerlach 11.2001
;
; Sinus/Cosinus - Beispiel Nr. 3
;----------------------------------------------
; Einen Punkt in verschiedene Richtungen steuern.
;
; Links: nach links drehen
; Rechts: Nach rechts drehen
; Oben: Schneller
; Unten: Langsamer (und rückwärts, wenn Geschwindigkeit unter 0 ist)


; 640x480 bei höchstmöglicher Farbtiefe im Fenstermodus.
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()


; Startpunkt und Startgeschwindigkeit festlegen.
x# = 320
y# = 240
speed# = 1




Repeat


; Tasten abfragen
If KeyDown(203) Then winkel = winkel - 5 ; Links
If KeyDown(205) Then winkel = winkel + 5 ; Rechts
If KeyDown(200) Then speed# = speed# + .01 ; Oben
If KeyDown(208) Then speed# = speed# - .01 ; Unten



; Damit der Winkel nicht über 360 oder unter 0 geht.
If winkel > 360 Then winkel = 1
If winkel < 1 Then winkel = 360


; Und damit der Punkt nicht verschwindet...
If x# > 640 Then x# = 1
If x# < 0 Then x# = 640
If y# > 480 Then y# = 1
If y# < 0 Then y# = 480




; Position entsprechend dem Winkel verändern.
x# = x# + (Cos(winkel)*speed#)
y# = y# + (Sin(winkel)*speed#)


; Punkt malen
Plot x#, y#


Flip
Until KeyHit(1)
End

Kabelbinder

Sieger des WM-Contest 2006

BeitragDi, Jun 13, 2006 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, dazu musst du 360 einzelbilder erstellen:

Code: [AUSKLAPPEN]
dim ship(360)
ship(0)= loadimage("ship.bmp")

for i = 1 to 360
ship(i)=copyimage(ship(0))
rotateimage ship(i),i
next


-Du erstellst ein 360 ints großes Dimensionsfeld
-Du gehs das Feld mit einer For-Schleife durch und Kopierst dabei das Bild deines Raumschiffes in jeden Feld-Eintrag und drehst es dann um den entsprechenden Winkel

Die Attribute MaskImage und HandleImage werden ja mit dem Kopieren übernommen.

Und dann beim Zeichnen:
Code: [AUSKLAPPEN]
Drawimage ship(winkel),x,y
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

JanK

BeitragDi, Jun 13, 2006 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
als erstes musste das Bild laden und mit rotate image drehen:


Code: [AUSKLAPPEN]

Dim Spieler[359] ;->Das Dim feld
   For x = 1 To 360
         Spieler[x] = LoadImage ("gfx/Rohr.png")
         MidHandle Spieler[x]  ;Bild mittelpunkt in die Mitte
         RotateImage Spieler[x] ,x ;Bild drehen
   Next



Außerdem benötigt so eine variable die die gerad Anzahl des Spielers enthält:
Code: [AUSKLAPPEN]
Global Grad

dann musst du noch mit drawimage das richtige Bild malen:
Code: [AUSKLAPPEN]
Drawimage Spieler(Grad),x,y,0


Edit:
Mist zu spät Sad
Ich habe keine Zeit, mich zu beeilen.
The Pollux Conflict || The Pollux Renegades || Lipstick-live.de
 

silent_source

BeitragDi, Jun 13, 2006 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für eure schnellen antworten Smile

hier der lösungscode für alle interessierten


Graphics 800, 600, 0, 2



; Startpunkt und Startgeschwindigkeit festlegen.

speed# = 0

raumschiffx#=400

raumschiffy#=300

raumschiffbreite=30

raumschiffhoehe=15


raumschiff=CreateImage(raumschiffbreite,raumschiffhoehe)

SetBuffer ImageBuffer(raumschiff)

Color 0,0,255


Oval 0,0,raumschiffbreite,raumschiffhoehe,1



dim raumschiffe(360)

for i = 1 to 360
raumschiffe(i)=copyimage(raumschiff)
rotateimage raumschiffe(i),i
next


Repeat



cls

; Tasten abfragen
If KeyDown(203) Then winkel = winkel - 5 ; Links
If KeyDown(205) Then winkel = winkel + 5 ; Rechts
If KeyDown(200) Then speed# = speed# + .01 ; Oben
If KeyDown(208) Then speed# = speed# - .01 ; Unten



; Damit der Winkel nicht über 360 oder unter 0 geht.
If winkel > 360 Then winkel = 1
If winkel < 1 Then winkel = 360


; Position entsprechend dem Winkel verändern.
raumschiffx# = raumschiffx# + (Cos(winkel)*speed#)
raumschiffy# = raumschiffy# + (Sin(winkel)*speed#)





;das raumschiff zeichen


setbuffer backbuffer()

DrawImage raumschiffe(winkel),raumschiffx#,raumschiffy#

Flip
Until KeyHit(1)
End

DerHase

BeitragMi, Jun 14, 2006 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Imho sind 360 Bilder übertrieben, versuch es z.B. mal mit 36. Denn wenn Du animierste Objekte hast und viele verschiedene Objekte, wird der Rechner mit so vielen Bildern ziemlich schnell in die Kniee gehn.
 

FWeinb

ehemals "ich"

BeitragMi, Jun 14, 2006 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal ne frage muss man nicht den
Code: [AUSKLAPPEN]

Tformfilter 0

ausstellen. Wenn man da eine maskimage hat gibt das doch so unschöne verwischungen oder nicht Question
 

bruce85

BeitragMi, Jun 14, 2006 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, damit keine ecken enstehen, TFormFilter 0 rundet die ecken aus Laughing

Gruss Andreas

Hubsi

BeitragMi, Jun 14, 2006 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau andersrum. Der Filter ist standardmäßig auf true und glättet Kanten die durch das drehen pixelig aussehen würden. Transparenzfarben sind aber dann hinüber.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Christoph

BeitragMi, Jun 14, 2006 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@ich
Das ist nicht so schlimm (in diesem Fall sogar gut), denn er kopiert die Bilder immer
vom Original.
Das heißt:
Das erste Bild wird kopiert gedreht und etwas verwischt,
das zweite Bild wird vom Original (das keine Verwischungen hat) kopiert, gedreht und wieder nur etwas verwischt.

Das ergibt einen besseren Effekt als mit Tformfilter 0.
Eine Katastrophe wäre folgenges(habe nur die wichtigsten Stellen kopiert!!!:
Code: [AUSKLAPPEN]
raumschiff=CreateImage(raumschiffbreite,raumschiffhoehe)
raumschiffe(0)=copyimage(raumschiff)
for i = 1 to 360
  raumschiffe(i)=copyimage(raumschiffe(i-1))
  rotateimage raumschiffe(i),i
next

Durch den Tformfilter 1 würde jedes Bild immer mehr verwischt werden!!
D.h. raumschiffe(360) wäre nicht mehr zu erkennen.

Der Nachteil des Eingeschalteten Tformfilters (wie du sagtest) liegt
bei maskimage, weil da unschöne Ränder sichtbar werden.
Der Vorteil hingegen ist, dass man Abstufungen nicht erkennt (auf der gleichen Hintergrundfarbe)

d.h. wenn silent_source einen schwarzen Hintergrund hat, und die Bilder
auf schwarzem Hintergrund erstellt, kann er die Vorteile des Tformfilters nutzen.
Wink
 

FWeinb

ehemals "ich"

BeitragMi, Jun 14, 2006 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ja gut danke habe den code nicht richtieg gelsesen Embarassed

5k41

BeitragDo, Jun 15, 2006 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Ich kann nur empfehlen kein array für den spieler zu nehmen! Ich hab das nun schon 2 mal gemacht und immer kamen komische Fehler bei bestimmten winkel im zusammenhang mit ImagesCollide. Bin dann auf die TileImage ausgewichen, sieht dann ca. so aus:
Code: [AUSKLAPPEN]

Global player=CreateImage(32,32,180)
MaskImage player,255,0,255
MidHandle player
TFormFilter 0
For i=0 To 179

 SetBuffer ImageBuffer(player,i)
 img2=CopyImage(img)
 MidHandle img2
 RotateImage img2,i*2
 Color 255,0,255
 Rect 0,0,32,32
 DrawImage img2,16,16
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group