Problem mit bewegten Gegner und Dim feld

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

andi79

Betreff: Problem mit bewegten Gegner und Dim feld

BeitragSa, März 20, 2010 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich hab da ein kleines Problem ich benutze ein Dim Feld für meine teils, wo ich auch die Gegner speicher, Nun möchte ich die Gegner ja beweglich machen das geht ja auch super nur ist bei meiner Lösung das Problem das die Kollusion abfrage nicht mehr funktioniert.(für den bewegten Vogel Crying or Very sad
Hat jemand einen Vorschlag für mich:?:
Code: [AUSKLAPPEN]
Function DrawMap()
   For y = 0 To MAPY
      For x = 0 To MAPX
         Select map(x,y)
            Case 31
            DrawImage3d (boden, x*TIEL - Offset_x, y*(TIEL) - Offset_y,0,0,1)
            
         Case 32
            DrawImage3d (grass, x*TIEL- Offset_x, y*TIEL - Offset_y,0,0,1)
            
            
         Case 33
            DrawImage3d (boden2, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
            
            
         Case 34
            DrawImage3d (boden22, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
         ;vogel bewegen
         Case 10
            DrawImage3d (vogel, x*TIEL + bewegung  - Offset_x, y*TIEL - Offset_y,0,0,1)
            bewegung = bewegung + (1)
            If (bewegung/TIEL) >= MAPX Then bewegung = 0
            
            
            
         Case 1
            DrawImage3d (wolke1, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
            
         Case 2
            DrawImage3d (wolke2, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
            
         Case 11
            DrawImage3d (geld, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
            
         Case 12
            DrawImage3d (bananne, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
            
      End Select   
   Next
   Next
End Function 



Function kolosionsabfrage()
   RelativSpielerX = player_x + Offset_x + (34)
   RelativSpielerY = player_y + Offset_y + (34)
   ix = RelativSpielerX/TIEL
   iy = RelativSpielerY/TIEL

   Select map(ix,iy)
:abfrage für vogel
      Case 10
         map(ix,iy)=0  punktestand = punktestand +10 chn = PlaySound(snd1)
;vogel ende
      Case 11
         map(ix,iy)=0 punktestand = punktestand + 20 chn =PlaySound(snd1)
      Case 12
         map(ix,iy)=0 punktestand = punktestand - 30 chn =PlaySound(snd1)   
   End Select
   
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 20, 2010 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das erste was du machen kannst ist, die ganzen Case-Anweisungen weg zu lassen und mit Frames zu arbeiten.

Statt ewige Case-Ketten zu bilden:

Code: [AUSKLAPPEN]
            Case 1
               DrawImage3D (wolke1 , x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)
            Case 2
               DrawImage3D (wolke2 , x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1)

Setzt du nur noch ein einziges:
Code: [AUSKLAPPEN]
         DrawImage3D (ursprung, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1, map(x,y)


Die Bewegungen für deine Objekte machst du dann separat. Kollisionen zwischen Objekte und der Tilemap kannst dann in eine spezielle Funktion abfragen. Dabei bitte nicht jedes Tile gegen ein mögliches Objekt auf Kollision berechnen, sondern entsprechend nur die vier möglichen Tiles gegen ein Objekt berechnen. In speziellen Fällen kann man kompeltt auf Kollisionen verzichten und die Position der Objekte direkt mit der Tileposition entgegenrechnen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

andi79

BeitragSo, März 21, 2010 0:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Also du meinst ich sollte stat 10 bilder nur noch einen laden hab ich das richtig versanden
Zitat:

Setzt du nur noch ein einziges:
Code: [AUSKLAPPEN]
         DrawImage3D (ursprung, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1, map(x,y)

Aber wie kann ich dann verschiede Bilder zuweisen?
~EDITIERT~

Bitte in Zukunft den Edit-Button nicht mit dem "Antworten als Zitat"-Button verwechseln =P
mfG
Holzchopf

Midimaster

BeitragSo, März 21, 2010 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
tja, diese Antwort bleibt Dir Hectic leider schuldig! Bleib mal schön bei deinen CASE Zeilen. Sein Vorschlag löst auch gar nicht das Problem in deiner Frage...


Bewegungen

Das Bewegen der Gegner geht durch vertauschen der Werte in dem Map()-Array. Dazu aber zunächst noch eine Frage: Sollen die Figuren sich schlagartig von einer Position zu nächsten bewegen? (also immer um TIEL Pixel auf einmal?)

Wenn ja, dann kannst du die Tiles einfach so bewegen:

BlitzBasic: [AUSKLAPPEN]
Function MoveTile( VonX%, VonY%, AddX%, AddY%)
Map(VonX+AddX, VonY+AddY) = Map(VonX, VonY)
Map(VonX, VonY) = 0
End Function


Aufgerufen wird das ganze z.b. so:
BlitzBasic: [AUSKLAPPEN]
MoveTile ( i, j, -1,0)  ; Bewegung nach links
MoveTile ( i, j, 1,0) ; Bewegung nach rechts
MoveTile ( i, j, 0,1) ; Bewegung nach unten
....
MoveTile ( i, j, -1,-1) ; Bewegung nach links/oben

spätestens jetzt bleibt aber zu klären, was denn dann jetzt an der Stelle sein soll, wo das Spielelement gerade verschwunden ist. Oft arbeitet man hier mit mehreren Ebenen. So kann z.b. Dort wo gerade ein Gegner ist, unter ihm ja auch noch Grass sein, dass anschließend, wenn der Gegner wieder weg ist, wieder zu sehen sein soll.

Schaffe eine Ebene MapFix() mit allen unbeweglichen Elementen (Boden, Grass, Wasser) und eine Ebene Map() mit allen beweglichen oder entfernbaren Elementen (Gegner, Spieler, Banane, etc)


Soft-Bewegungen

Wenn Figuren, wie der Vogel sich weich bewegen sollen, ist es fraglich, ob er überhaupt eine Nummer (bei dir glaube ich "10") in dem Map()-Feld bekommen sollte. Wenn du das so willst, musst du seine MAP() immer alle TIEL Pixel mit dem Nachbar-Tile tauschen, damit die 10 auch wirklich immer unter dem Vogel liegt.

Natürlich könnte der Vogel sich wie der Player frei bewegen und im Bedarfsfall einfach seine aktuelle Map()-Koordinate ausrechnen, um zu wissen wo er gerade fliegt und was sich vor ihm befindet (z.b. Berge). Der Vogel würde in diesem Fall eigene (pixel-echte) Koordinaten VogelX% und VogelY% bekommen

Kollisionen zwischen Soft-Figuren

Um nun die Softfiguren untereinander auf Kollision zu prüfen, checkst du einfach ihre Koordinaten auf Nähe ab:

BlitzBasic: [AUSKLAPPEN]
Function CheckVogelGegenSpieler()
If (player_x > VogelX-TIEL) And (player_x < VogelX+TIEL) Then
If (player_y > VogelY-TIEL) And (player_y < VogelY+TIEL) Then
;Kollision sehr wahrscheinlich
EndIf
EndIf
End Function


BB liefert dir hier auch zwei Funktionen, die aber angeblich fehlerhaft sein sollen: ImagesOverlap() und ImagesCollide()

andi79

BeitragSo, März 21, 2010 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmals für die mühe ich werde es probieren
Ich möchte die Gegner halt auch mit mein leveleditor einfügen deswegen werden die bei mir mit der map mitgespeichert .
Das mit den 3 Dimension im dim Feld habe ich mir auch schon überlegt Idea ist sicher die bessere Lösung da hast du sicher recht. Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 21, 2010 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry Midimaster, aber eine Tilemap dessen Tile-Handle über ein Case-Anweisungen laufen zu lassen ist einfach nur Quatsch. Das benötigt unnötig Rechnerkapazitäten, aber viel schlimmer noch ist, dass das warten solcher Programme es zur Tortur macht. Mit den Frames dagegen wird das ganze dann direkt angesprochen. Klar sollte sein, dass die Frames zuvor entsprechend gesetzt sein müssen. Da andi79 schon eh mehrere Bilder geladen/gegrabbt hat, sind die Frames schon eh vorhanden. Lediglich die Bezeichnung eines jeden Frames ist nicht mehr gegeben. Man geht also immer nur noch aus dem ''Masterframe'' aus, und rechnet von da aus die Frames runter. Diese decken sich dann 1:1 mit den Nummern die in der map(x,y) gespeichert sind. Evil or Very Mad

Auch bin ich zu der eigendlichen Frage sehr wohl eingegangen. Ich hab dazu nur kein Codebeispiel gegeben. Allerdings, das muß ich zugeben, hab ich das Problem von andi79 zuerst anders verstanden. Sowohl ich es nicht so machen würde, aber egal.

- - -

andi79 - schau mal DrawImage3D dessen mögliche Framesangaben

Online-Hilfe hat Folgendes geschrieben:
''frame'' legt fest, welches Frame relativ zum Handle angezeigt wird. Ist Frame z.B. = 1, so wird einfach die Textur benutzt, das gleich nach der angegebener Textur geladen/erstellt/gegrabbt wurde. Man kann auch negative Framewerte angeben, wenn diese vorhanden sind.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Midimaster

BeitragSo, März 21, 2010 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ah, jetzt versteh ich...

Die Sache mit dem "Ursprung" sollte ein Bild sein, das alle Frames enthält und dann durch den letzten Parameter wird die Frame-Nummer angesprochen! Gut!

andi79

BeitragMo, März 22, 2010 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich habe das jetzt umgesetzt .
hectic hat Folgendes geschrieben:


Code: [AUSKLAPPEN]
         DrawImage3D (ursprung, x*TIEL - Offset_x, y*TIEL - Offset_y,0,0,1, map(x,y)



Der Code ist wirklich übersichtlicher geworden Laughing nur kann ich mit dieser Methoden keine animierten tiels (zb.wasser) zeichnen Crying or Very sad oder geht das

hazumu-kun

BeitragMo, März 22, 2010 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Die animierten Tiles musst du dann irgendwie gesondert behandeln.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

TimBo

BeitragMo, März 22, 2010 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
so eine Map besteht für mich immer aus mehreren Ebenen.
Die erste könnte z.B. die sein , welche die statisch-nicht bewegbaren Tiles enthält.
Die darauffolgende Ebene könnte dann in Types gespeichert sein und bewegbar sein.

Zitat:
Die animierten Tiles musst du dann irgendwie gesondert behandeln.

richtig , aber trenne diese besonders gut von den nichtbewegbaren ab =D
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 22, 2010 2:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Um Animationen zu machen, kann man natürlich direkt im Array rumfuschen, wovon ich allerdings abraten würde. Meine Empfehlung wäre folgende: Setz bestimmte Framenummern-Bereiche als Animation fest, diese setzt du dann einem ''Offset'' aus, welches extern gesteuert wird. Für solche spezielle Sachen, ist eine Aufteilung innerhalb der Schleife notwendig, oder man erledigt das über zwei Schleifen, oder durch eine logische Verknüpfung.

Das letztere würde dann in etwa so aussehen:

Code: [AUSKLAPPEN]
Local X,Y
Local Master=LoadImage3D("jo.png",2,2)
Local Frames=GrabImage3D(Master,0,0,64,64) ;Frame 0

;Weitere Frames benötigen keine Handles mehr.
;Diese werden nacheinander als Frames in der
;Draw3D hinterlegt. Löscht man für einen neuen
;Level über 'FreeImage3D' das GELADENE MASTER-BILD
;so entfernt die Draw3D automatisch alle davon
;gegrabbten Frames.
GrabImage3D(Master, 64,  0, 64,64) ;Frame 1
GrabImage3D(Master,128,  0, 64,64) ;Frame 2
GrabImage3D(Master,192,  0, 64,64) ;Frame 3
GrabImage3D(Master,  0, 64, 64,64) ;Frame 4 = 1. Animation Frame 0
GrabImage3D(Master, 64, 64, 64,64) ;Frame 5 = 1. Animation Frame 1
GrabImage3D(Master,128, 64, 64,64) ;Frame 6 = 1. Animation Frame 2
GrabImage3D(Master,192, 64, 64,64) ;Frame 7 = 1. Animation Frame 3

Const GRENZE=3
Const XOFFSET=-200
Const YOFFSET=-200

Dim Map(23,19)

Local AnimFrame
Local AnimTicks




While Not KeyHit(1)
   
   
   AnimTicks=AnimTicks+1
   
   ;Nur jedes fünfte Frame
   ;eine neue Animationssequenz
   ;einleiten lassen.
   If AnimTicks>4 Then
      
      ;Animationsframes gehen
      ;hier von 0 bis 3, und
      ;beginnen dann wieder 0
      AnimFrame=(AnimFrame+1) Mod 4
      
      AnimTicks=0
   End If
   
   
   
   For Y=0 To 19
      For X=0 To 23
         
         DrawImage3D(Frames,XOFFSET+X*64,YOFFSET+Y*64,0,0,1, Map(X,Y) + (Map(X,Y)>GRENZE)*AnimFrame )
         
      Next
   Next
Wend


Der folgende Codeteil ... Map(X,Y) + (Map(X,Y)>GRENZE)*AnimFrame bewirkt, dass wenn Map(X,Y) größer als die GRENZE ist, zusätzlich AnimFrame zu dem zu darstellenden Frame hinzuaddiert wird. Das ganze liesse sich auch über eine If-Anweisung lösen und entsprechend auf zwei Zeilen aufteilen. Ansonsten geht auch folgendes:

Code: [AUSKLAPPEN]
         If Map(X,Y)>GRENZE Then
            
            DrawImage3D(Frames,XOFFSET+X*64,YOFFSET+Y*64,0,0,1,Map(X,Y)+AnimFrame)
         Else
            
            DrawImage3D(Frames,XOFFSET+X*64,YOFFSET+Y*64,0,0,1,Map(X,Y))
         End If


Was man letztendlich nimmt, bleibt jedem selbst überlassen. Generell gebe ich aber zu, dass ich so eine animierte Tilemap bisher nicht gehandhabt hab, und auch keine 'beste' Lösung dafür parat hab. Persönlich besser würde ich finden, indem man in der Tilemap eine weitere Animations-Dimension einbaut. In dieser könnte man dann auch speichern, wie viele Animationsframes das gerade gezeichnete Tile nun hat. Es wäre dadurch dynamischer.

Mein Favorit also für dynamische Tilesetsanimationen:

Code: [AUSKLAPPEN]
DrawImage3D(Frames,XOFFSET+X*64,YOFFSET+Y*64,0,0,1,Map(X,Y,0)+(AnimFrame Mod Map(X,Y,1)))


- - -

Beachte bitte, dass keine der von mir oben gezeigten Codebeispielen getestet worden sind. Alles frei Hand, ohne Garantie auf Fehlerfreiheit

TimBo

BeitragMo, März 22, 2010 2:31
Antworten mit Zitat
Benutzer-Profile anzeigen
mh , so kann man die einzelnen Frames speichern / verwalten.

Die Bewegungen kann man ja dennoch mit Types speichern , oder verstehe ich das falsch ?
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

ToeB

BeitragMo, März 22, 2010 9:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also meine lösung ist ja, den "Vogel" in einem Type zu speichern. Oder zumindest in einem seperaten Array, das der Map aufgelegt ist (ich rate zu Types). Denn wenn ein Vogel z.B. auf einem Grasstile ist, ich glaub das sollte auch noch ein grasstile blieben wenn sich der Vogel bewegt, also kannst du das in etwa benutzen :
Code: [AUSKLAPPEN]
Type vogel
Field TileX,TileY
end Type

Function CreateVogel(TileX,TileY)
tmp.vogel = New vogel
tmp\TileX = TileX
tmp\TileY = TileY
end Function

Function UpdateVogel()
For tmp.vogel = Each vogel
DrawImage3D(image,tmp\TileX*TileSize-OffsetX,tmp\TileY*TileSize-OffsetY)
tmp\TileX = tmp\TileX + 1
tmp\TileY = tmp\TileY -1
next
end Function

Function CheckPlayer()
RelativSpielerX = player_x + OffsetX+ (34)
RelativSpielerY = player_y + OffsetY + (34)
ix = RelativSpielerX/TIEL
iy = RelativSpielerY/TIEL

for tmp.vogel = Each vogel
;Hier die collisiion reinschreiben mit dem Feld tmp\TileX und tmp\TileY
next
end Function
 


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 22, 2010 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, nur so zur Info: andi79 hat bereits mehrere Fragen zu seiner Map. Die eine ist, wie bewegt man einen Objekt (in seinem Fall ein Vogel) über die Map. Das würde ich auch über ein Type machen. Dann hat andi79 noch due Frage gestellt, wie macht man Animationen auf der Map. Also Frameswechsel eines Tiles um zum Beispiel Wasser zu simulieren. Mein letzter Post bezieht sich auf die Animation bestimmter Tiles. Wink
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

andi79

BeitragMo, März 22, 2010 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal danke für die vielen Tipps von euch
Ich hab jetzt den Code überarbeitet und werde die Gegner mit types realisieren Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group