Problem mit bewegten Gegner und Dim feld
Übersicht

![]() |
andi79Betreff: Problem mit bewegten Gegner und Dim feld |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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%) Aufgerufen wird das ganze z.b. so: BlitzBasic: [AUSKLAPPEN] MoveTile ( i, j, -1,0) ; Bewegung nach links 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() BB liefert dir hier auch zwei Funktionen, die aber angeblich fehlerhaft sein sollen: ImagesOverlap() und ImagesCollide() |
||
![]() |
andi79 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok ich habe das jetzt umgesetzt .
hectic hat Folgendes geschrieben: Der Code ist wirklich übersichtlicher geworden ![]() ![]() |
||
![]() |
hazumu-kun |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
andi79 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erst mal danke für die vielen Tipps von euch
Ich hab jetzt den Code überarbeitet und werde die Gegner mit types realisieren ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group