[Multithread] Allgemeine Fragen zu Allem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: [Multithread] Allgemeine Fragen zu Allem

BeitragSo, Sep 25, 2011 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe diesen Thread mit Absicht Multithread genannt, da ich neu in Sachen wie Types bin. Da ich sie derzeitig lerne und kleine Projekte damit anfange, habe ich einige Fragen. Da ich weiß, dass es nicht nur eine Frage ist, habe ich den Thread, Multithread genannt. Ich hoffe das ist in Ordnung, sonst kann der Thread gerne von einem Moderator umbenannt werden!

Nun zu meinem 1. Problem.
Ich bin derzeitig an einem Minecraft 2D Projekt am arbeiten. Ich bin noch ziemlich am Anfang aber schon ziemlich weit, für meine Programmierfähigkeit gekommen(finde ich).
Trotzdem brauche ich jetzt mal Hilfe.

Ich habe einen Type mit dem Namen: Block_Grass und einen Type mit dem Namen: Block_Erde.
Diese Blöcke haben jeweil folgende Felder: PosX#, PosY# und BlockImg mit dem Pfad zur entsprechenden Textur des Blockes. Die Eigenschaften bekommen ihren Wert in der Funktion Create_Grass_Block bzw. Create_Erde_Block zugewiesen. Jeder Block hat eine Größe von 16x16 Pixeln.

Jetzt habe ich noch einen Player erstellt mit einem Bild und Abmessungen von 16x32 Pixeln.
Somit ist der Spieler genauso groß wie 2 Blöcke die genau untereinander liegen. Rolling Eyes

Mit der Taste "1" (Grass) oder "2" (Erde) lasse ich die entsprechenden Blöcke genau unter meinem Player erstellen. Da gibts weiterhin auch keine Probleme.

Jedoch möchte ich, dass wenn ich mit dem Player genau unter dem Block bin den ich zuvor erstellt habe und mir der nich gefällt das ich den löschen kann. Also den einzelnen Block. Mit Delete grass.Block_Grass lösche ich leider alle. Wie kann ich einzelne löschen und dann auch noch genau den, der unter meinem Player liegt?

Ich hoffe, dass das nicht zu viel Arbeit ist, denn es ist ein Projekt, welches klein, förmlich und übersichtlich bleiben soll. Leider kann ich weder noch Laughing

Ich hoffe mir kann jemand helfen Rolling Eyes
Mit freundlichen Grüßen: GearTechDE
  • Zuletzt bearbeitet von GearTechDE am Mi, Sep 28, 2011 18:26, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Sep 25, 2011 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Was hat das mit Threads oder Multithread zu tun? Du kannst problemlos mehrere Fragen in einem Foren-Thread stellen.

Topic:
Delete grass löscht das Objekt, das gerade in grass verlinkt ist. Am besten hast du ein Array in dem alle Blöcke sind, damit du über die Spielerposition daran kommst und den richtigen block löschst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Sep 25, 2011 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, ein Array also... Rolling Eyes

Okey ich werd mal etwas damit rumprobieren und wenn ich nicht weiter komme, melde ich mich wieder ^^

Vielen Dank

Edit: Hab etwas probiert, hat jedoch nich geklappt.

Könntest du mir büdde, büdde ein kleines Beispiel posten. Ich wäre dir echt dankbar Wink
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSo, Sep 25, 2011 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein paar Tipps:
- Block_Grass & Block_Erde sind unpraktisch, weil beides gleichzeitig nicht in ein Array passt, benutze lieber einen allgemeinen TBlock Type (und unterscheide die per Nummer/ID/Frame).
- Dim Karte.TBlock(X,Y)
- Das neue Array ist leer, was bei Types bedeutet, es voll mit dem NULL-Objekt.
- Außer das du mit Types arbeitest, ist es eine normale Tilemap.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Sep 25, 2011 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja also ein Array mach ich mit Dim usw. aber ich komm gerade nicht auf die Palme wie ich es machen könnte, Types und Arrays miteinander zu kombinieren. Ich möchte ja nur einzelne Blocks löschen. Kann es sein dass ich jeden Block die Koordinate X und Y in das Array eintragen muss? Aber wie kann ich dann nachher das wieder löschen. Ich weiß überhaupt nicht wie ich das anstellen soll...

Gibt es vielleicht Code Beispiele oder etwas ähnliches in dem ich sowas lernen könnte, oder kannst du mir ein Array Tutorial geben? Ich kenn mich damit nicht so gut aus
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSo, Sep 25, 2011 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Position eines Blocks ist durch seine Position im Array festgelegt. Wenn du einen Block löschen willst, reicht ein Code: [AUSKLAPPEN]
Delete Map(x, y)


Hier mal ne kleine Spielerei:
BlitzBasic: [AUSKLAPPEN]
Graphics(512,512,0,2)
SetBuffer(BackBuffer())
SeedRnd(42)

Dim Map.TBlock(15, 15)

Type TBlock
Field ID%
End Type

Local x,y
For x=0 To 15
For y=0 To 15

; 50% Chance ein Block zu erstellen:
If Rnd(0,1) > 0.5 Then
Map(x, y) = New TBlock
Map(x, y)\ID = Rand(0,2)
EndIf

; Blöcke zeichnen:
If Map(x, y) = Null Then
; Kein Block wurde hier erstellt
Color(255,255,255)
Else
; Farbe aus Block ID bestimmen:
Select Map(x, y)\ID
Case 0
Color(128,64,0)
Case 1
Color(0,255,64)
Case 2
Color(64,128,255)
End Select
EndIf

; Zeichnen
Rect(x*32,y*32,32,32)
Next
Next

Flip
WaitKey()
End

Edit: Kleine Verbesserung.
Edit2: Nochmal + Kommentare
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am So, Sep 25, 2011 21:51, insgesamt einmal bearbeitet

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Sep 25, 2011 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh man, dass ist mir alles zu kompliziert. Ich versteh das nicht ganz richtig. Ich suche mir glaub ich erstmal noch ein paar Tutorials zu Arrays und Types etc. Ich denke für so ein Projekt ist es trotzdem noch zu früh.

Trotzdem danke für die Bemühungen.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSo, Sep 25, 2011 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Die RPG-Tutorials sollten helfen, wenn ich mich recht entsinne... ansonsten frag nach.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Sep 25, 2011 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke werde mich mal ins zeug legen ...
Mit freundlichen Grüßen: GearTechDE

ToeB

BeitragSo, Sep 25, 2011 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde es so machen:

Einen Type für einen Block anlegen, in dem Position und Typ gespeichert wird:
BlitzBasic: [AUSKLAPPEN]
Type TBLock
Field xPos, yPos
Field blocktyp
End Type


xPos / yPos sollen nicht nur die Koordinate für das Bild angeben, sondern auch das Feld im Array, sodass hinterher schnellere Zugriffe möglich sind. Dazu brauchen wir aber erst ein Array, welches vom Typ "TBlock" sein soll, sodass für jede X und Y Position in dem Array ein "Tblock" exestieren kann.

BlitzBasic: [AUSKLAPPEN]
Dim Feld.TBLock( 64, 64 )


Jetzt musst du dir eins klar werden lassen: Ist eine Variable von irgendeinem Type "= Null", so exestiert dort kein Eintrag und es kann nicht auf die Variablen des Types zugegriffen werden. Ist die Variable allerdings "<> Null", so kann man auf die Variablen zugreifen und zusätzlich wird der Type in der For-Each Schleife aufgeführt.

Das heißt: Ist ein Feld in dem Array "= Null", so exestiert dort auch kein Block, heißt also, wenn du mit Delete bspw. den TBlock im Array "Feld( 1, 1 )" löscht, so ist dieses Feld "Leer", also "= Null".

Somit kannst du auch ganz einfach Prüfen, ob den Spieler dahin gehen kann oder nicht, also
BlitzBasic: [AUSKLAPPEN]
If Feld( deine_x_position, deine_y_position ) <> Null Then [...] (Oder = Null)


Anstatt also für die Komplette Map ein Array für nur eine Zahl anzulegen, legst du hier ein Array an für gleich mehrere Werte sogar von unterschiedlichen Typen (String / Interger / Float). Somit kannst du deine Blöcke nicht nur so abspeichern das man nur die Bilder auslesen kann, sondern auch z.B. wie lange der Block zum Abbauen braucht oder wie viele Items von was dieser Block nach dem Abbauen hergibt usw.

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!

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Sep 26, 2011 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey ich werde das ganze nochmal etwas durch denken und daran rumprobieren.

Vielen Dank.

Ich hoffe ich komme jetzt endlich mal damit klar.^^

Edit: 1. Problem: Wie kann ich denn überhaupt einen Block in das Array eintragen?

Ich erstelle mit dem drücken einer "1" z.B. einen Grass Block. Aber wie kann ich das jetzt dort eintragen?
Ich versteh irgendwie noch nicht wie man mit einem Array umgeht.
Mit freundlichen Grüßen: GearTechDE

ToeB

BeitragMo, Sep 26, 2011 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Normal kannst du ja einem 2 Dimensionalem Array an einer beliebigen X/Y Koordinate einen Wert zu weisen, bsp:
BlitzBasic: [AUSKLAPPEN]
Dim Array%( 16, 16 ) ;Integer Array auf 17*17 Felder Dimmen (Beachten!: 0 wird mitgezäht!)
Array( 5, 5 ) = 124547 ;Dem array an der Stelle 5,5 eine Zahl speichern



Wenn du einen Type erstellst, tust du dies so
BlitzBasic: [AUSKLAPPEN]
Local block.TBlock = New TBlock


Wenn jetzt die Variable ein Array ist, musst du im prinziep nur die Indizes anhängen ( array( 5, 5 ) :

BlitzBasic: [AUSKLAPPEN]
Dim Array.TBlock( 16, 16 ) ;TBlock Array 17*17
Array( 5, 5 ) = New TBlock ;Für das Feld 5, 5 einen neuen Type zuweisen
Array( 5, 5 )\xPos = 5 ;X/YPos für den Block im Type nochmal speichern
Array( 5, 5 )\yPos = 5


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!

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Sep 26, 2011 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok aber das das Feld 5,5 war ist jetz von dir so bestimmt.. Aber wenn ich jetzt beispielsweise mit 1 nen Block erstelle. Vorher frage ich ja ab

BlitzBasic: [AUSKLAPPEN]

If KeyHit(2) Then

CreateBlock()


End If


SOll ich dann in die Abfrage noch hinzufügen Array(5,5) = New Block_Grass ???

Was ist in dem Falle die 5,5 und wie kann ich jetzt wissen, auf welcher Koordinate mein Player steht um den Block zu löschen über dem ich stehe...

Ich release hier mal den jetzigen source. Vielleicht kannst du mir anhand dessen ein wenig weiterhelfen.

KLICK
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Sep 26, 2011 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Position vom Spieler muss bekannt sein, schließlich musst du den irgendwo zeichnen, z.B. Px und Py (oder in einem Type... wenn dich das nicht zusätzlich verwirrt).
Die Tilemap hat eine Breite und Höhe und jedes Feld eine Koordinate die mit X & Y eindeutig angegeben werden kann. Ein Feld unter dem Spieler wäre dann Feld(Px, Py+1).
Wenn deine Funktion nur Blöcke erstellen soll, muss sie einen zurück geben können:
BlitzBasic: [AUSKLAPPEN]
Type TBlock
Field img
End Type

Function Create_Block.TBlock()

Local b.TBlock = New TBlock
b\img = LoadImage([...])
Return b

End Function

Das funktioniert genauso, wie bei den anderen Datentypen: Die Funktion muss auf $ enden um Strings zurück zu geben oder auf # für Kommazahlen. Für diesen Type eben .TBlock.

Das in der Funktion erstelle Objekt linkst du zu der richtigen Position im Array:
BlitzBasic: [AUSKLAPPEN]
If KeyHit(2) Then 

Map(Px,Py+1) = Create_Block()

End If

Um jetzt alle Koordinaten in der Spielerumgebung benutzen zu können, braucht es etwas mathe - das ist aber völlig unabhängig vom erstellen und zuweisen der Types.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Sep 26, 2011 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey, ich probiers so nochmal. Das ist aber für mich wirklich sehr kompliziert. Ich glaube ich verstehe langsam, warum ich UDP NIE lernen kann xD - zu blöd dafür.

Naja ich werds mal probieren.

Danke für die Code Schnippsel

Edit: So ich habe noch eine Frage zu TCP.

Ich habe vorher immer mit Direct Play gearbeitet, bin damit auch gut zurecht gekommen, doch jetz wird es auch für mich langsam Zeit für schnellere Dinge. Ich fange darum jetzt an mit TCP.
Voraus schon die Frage:

Bei DP gibt es einen NetMsgType Befehl, welcher verschiedene "Channel" sag ich jetzt mal von 1-99 hat. "Channel" 100 und 101 sind jeweils für das joinen und deleten einen net players. So. Jetzt möchte ich z.B. mit TCP, X,Y und Z koordinate verschicken. wie mach ich das am besten? bei DP hab ich X für Channel 1 Y für Channel 2 und Z für channel 3 benutzt. Aber wie mach ich das mit TCP? Muss ich da die Koordinaten in einem String senden und dann den String in 3 teile parsen? sodass meine globale variable jeweils x,y und z die einzelnen werte zugeteilt kriegen?

das ist erstmal meine erste fragen zu TCP...
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group