JNR problem mit Pickups
Übersicht

Razor1994Betreff: JNR problem mit Pickups |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bin an einem kleinen JNR nichts besonderes aber es macht trotzdem dauernd Probleme.^^Und dieses schaffe ich einfach nicht alleine zu lösen. Meine Pickups erscheinen wo sie sollen aber immer wenn meine Figur unter den Items durchgeht werden sie "aufgehoben" ohne das meine Figur sie berührt hätte. Ich habe alles schon 2 mal kontrolliert finde den Fehler aber einfach nicht. Vielleicht könnt ihr mir helfen.
der Code: [AUSKLAPPEN] ;grafik optionen
Global Screen_x = 960 Global Screen_y = 640 Graphics Screen_x, Screen_y, 0, 0 SetBuffer BackBuffer() frametimer = CreateTimer(30) Global pickups = LoadImage ("C:\Program Files\Blitz2DDemo\help\resources\samples\Graphics\pickups.bmp") MaskImage pickups, 255, 0, 255 Type pickup Field pickup_x Field pickup_y Field start_x Field start_y Field hoehe Field breite End Type Restore pickups_level1 Read anzahl ;der erste Wert in der Dataschleife gibt die Anzahl der Pickups an For i = 1 To anzahl ;Zählt durch die einzelnen Einträge info.pickup = New pickup ;Neue Pickups erstellen Read x, y, s_x, s_y, h, b ;Koordinaten lesen info\pickup_x = x ;x und y Werte an dem Typ übergeben info\pickup_Y = y ;ausserdem die start parameter weil es nur ein ausschnitt ist info\start_x = s_x ;sowie die höhe und die breite info\start_y = s_y info\hoehe = h info\breite = b Next Repeat Cls PickupsZeichnen PickupKollision Flip Until KeyHit(1) ; Die pickups malen Function PickupsZeichnen() For info.pickup = Each pickup ; Alle pickups abfragen DrawImageRect pickups, info\pickup_x, info\pickup_y, info\start_x, info\start_y, info\hoehe, info\breite ;Pickups malen Next End Function Function PickupKollision() For info.pickup = Each pickup ;Alle Pickups abfragen If ImagesCollide (pickups, info\pickup_x, info\pickup_y, 0, player, spieler\x, spieler\y, 0) Then ;Sobald eine Kollision auftritt Delete info.pickup ; Pickup löschen EndIf Next End Function .pickups_level1 Data 25 Data 32,64,204,0,42,33 Data 64,64,204,0,42,33 Data 96,64,204,0,42,33 Data 128,64,204,0,42,33 Data 160,64,204,0,42,33 Data 448,64,204,0,42,33 Data 480,64,204,0,42,33 Data 512,64,204,0,42,33 Data 544,64,204,0,42,33 Data 576,64,204,0,42,33 Data 224,192,204,0,42,33 Data 256,192,204,0,42,33 Data 288,192,204,0,42,33 Data 320,192,204,0,42,33 Data 352,192,204,0,42,33 Data 32,320,204,0,42,33 Data 64,320,204,0,42,33 Data 96,320,204,0,42,33 Data 128,320,204,0,42,33 Data 160,320,204,0,42,33 Data 448,320,204,0,42,33 Data 480,320,204,0,42,33 Data 512,320,204,0,42,33 Data 544,320,204,0,42,33 Data 576,320,204,0,42,33 Der code ist nicht das ganze. Nur der Teil mit den Pickups wenn ihr den Rest auch noch wollt sagt es einfach. |
||
User posted image
kommt in meinen Runescape clan |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Pack die Items als "normale" Tiles in einen zweiten Layer. Erstens funktioniert ImagesCollide nicht überall richtig und zweitens wird Dir die Art und Weise noch tierisch viel Ärger machen wenn die Maps erstmal größer werden. Tausend mal einfacher ist es noch dazu ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Razor1994 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie geht das mit dem 2. Layer?^^ | ||
User posted image
kommt in meinen Runescape clan |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, du hast ja sicherlich ein Maparray, sagen wir mal BlitzBasic: [AUSKLAPPEN] LevelMap(x,y). Dadrin stecken ja deine Mapdaten. Und du weitest das einfach in die dritte Dimension aus, welche dann deine Layer angiebt. Dadurch erhälst du also: BlitzBasic: [AUSKLAPPEN] Levelmap(x,y,Layeranzahl) Dadrauf kannst du genauso wie auf ein zweidimensionales Array zugreifen, nur halt mit drei verschachtelten For-schleifen. Wenn du ein J'N'Run programmieren willst, würde ich dir sowieso raten nen Leveleditor zu programmieren und die Data Strukturen gleich zu vergessen. Das funktioniert nicht lange. Lg, M0rgenstern |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Denkbar simpel:
Dim map(x,y,1) 2 Layer. Persönlich verwende ich grundsätzlich Layer 0 für die eigentliche Map, sprich alles was der Kollision dient, der Layer 1 ist dann für Gimmicks, optische Aufwertungen und dergleichen Kram. Halt das Zeug wo man durchlaufen kann. Die Kollision prüfe ich dann eben nur auf map(x,y,0). Im Layer 1 (sprich map((spielerX+16)/32,(spielerY+16)/32,1) werden dann Medipacks, Handfeuerwaffen der neuesten Generation, tödliche Stacheln oder Diamanten gespeichert und geprüft. Hat zudem den Vorteil das der Layer 1 den Layer 0 übermalen kann, man kann also Butterblumen oder Totenköpfe ohne Aufwand als Gimmick fürs Auge in einer Felsenwand platzieren ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Razor1994 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ok soweit kapier ich das ja auch aber ich glaube nicht das mir das bei meinem Problem hilft. Denn 1. Wie mache ich dann das mit dem Pick up aufsammeln ohne imagescollide und 2. Ist mein problem glaube ich etwas anderes. Mein problem ist das wenn ich so 5-7 tiles unter dem item durchlaufe ich es "aufhebe." | ||
User posted image
kommt in meinen Runescape clan |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hubsi hat Folgendes geschrieben: map((spielerX+16)/32,(spielerY+16)/32,1)
Nehmen wir an alle Tiles von 100 bis 200 wären Pickups. Dann sieht es nach obiger Formel so aus: BlitzBasic: [AUSKLAPPEN] If map((spielerX+16)/32,(spielerY+16)/32,1)>=100 And map((spielerX+16)/32,(spielerY+16)/32,1)<=200 Then Es wird einfach die Map verändert, respektive eben der 2. Layer. |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, das ist ja kein Problem mehr.
Du rechnest (sofern du das musst) die Position des Spielers in Mapdaten um (weiß jetzt nicht, ob du dich pixelweise oder Tileweise bewegst). Dann vergleichst du diese neuen Koordinaten mit der der Map in deinem ItemLayer. Und wenn die Koordinaten übereinstimmen dann kann der Spieler das Item aufnehmen. Beispiel: BlitzBasic: [AUSKLAPPEN]
Vielleicht hilf das. Lg, M0rgenstern EDIT: Verdammt, zu spät. |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Naja, diese Layer-Lösung ist aber nicht gerade die optimalste ... auch nicht für einen Anfänger. Dein erster Ansatz war um vieles besser!
Code: [AUSKLAPPEN] Function PickupKollision ( )
For info.pickup = Each pickup If .... <- an dieser Stelle eine einfache Distanzabfrage oder Rechteck-Kollision prüfen! Delete info.pickup EndIf Next End Function Distanzabfrage: Code: [AUSKLAPPEN] Sqr ( ( Pickup_Mittelpunkt_x - Player_Mittelpunkt_x ) ^ 2 + ( Pickup_Mittelpunkt_y - Player_Mittelpunkt_y ) ^ 2 <= ( Pickup_Radius + Player_Radius )
Oder eben mit RectsOverlap (gab es bei BB glaube ich? *lang isses her* ^^) Zusätzliche Layer sind umständlich und unflexibel. |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Naja, diese Layer-Lösung ist aber nicht gerade die optimalste ... auch nicht für einen Anfänger. Dein erster Ansatz war um vieles besser! [...] Zusätzliche Layer sind umständlich und unflexibel.
Also, ich weiß beim besten Willen nicht, was an der Layer Lösung so falsch ist. Also, ich finde diese Lösung um einiges angenehmer (Editor vorausgesetzt) als jedes Pickup "von Hand" zu setzen. Jedenfalls gilt das, wenn man die Pickups vorher auf der Karte verteilt. Sollte es jetzt eher darum gehen, Pickups während dem Spielverlauf zu erstellen (Gegner die diese "droppen") dann ist deine Lösung natürlich die Bessere. Aber mehrere Layer braucht man bei sowas schon. Mindestens einer für Kollision und einer für die Tiles selbst. Lg, M0rgenstern |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
M0rgenstern hat Folgendes geschrieben: Also, ich weiß beim besten Willen nicht, was an der Layer Lösung so falsch ist.
Also, ich finde diese Lösung um einiges angenehmer (Editor vorausgesetzt) als jedes Pickup "von Hand" zu setzen. Völliger Quark. Sobald Du einen Editor verwendet, ist es für das Leveldesign in der Regel relativ pillepalle, wie Du die Daten intern verwaltest. Einmal abgesehen davon, dass manche Konstruktionen eben mehr Möglichkeiten offen halten, als andere ... aber es hält Dich nix davon ab, die Pickup-Position in Deinem Editor (bestenfalls: optional) auf das Tilegrid auszurichten. M0rgenstern hat Folgendes geschrieben: Jedenfalls gilt das, wenn man die Pickups vorher auf der Karte verteilt. Sollte es jetzt eher darum gehen, Pickups während dem Spielverlauf zu erstellen (Gegner die diese "droppen") dann ist deine Lösung natürlich die Bessere.
Das Verteilen der Pickups ist immer gleich schwer bzw. einfach. Und - wie Du selbst erkannt hast ^^ - ist Droppen für die Layermethode nicht so schön umsetzbar. *g* Zitat: Aber mehrere Layer braucht man bei sowas schon.
Mindestens einer für Kollision und einer für die Tiles selbst. "Brauchen" tut man ansich überhaupt keinen Layer. Ein Array ist nur meist die einfachste Wahl (und okay oft auch die beste ^^), aber das heisst noch lange nicht, dass man es "braucht". Und was dagegen spricht, sowohl Grafik als auch Kollision in einem einzelnen Array unterzubringen, musst Du mir mal erklären. ![]() |
||
Razor1994 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sry das ich eure Diskussion unterbreche, aber ich habe mich entschieden es vorläufig mit rectsoverlap zu machen. Und es funktioniert jetzt einwandfrei. | ||
User posted image
kommt in meinen Runescape clan |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group