Hintergrund Unter dem User bewegen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3, 4  Weiter

Neue Antwort erstellen

 

Bobo2040

BeitragFr, Jul 19, 2013 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Very Happy
Klappt jetzt mit der Schadensanzeige...
Aber das Problem mit der Wartezeit klappt noch nicht so richtig Very Happy

DAK

BeitragFr, Jul 19, 2013 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du schon deine Millisecs gegen Millisecs() getauscht? Ohne dem geht es nämlich wirklich nicht.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragFr, Jul 19, 2013 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja hab ich Very Happy
War mir garnicht aufgefallen.. bin zu sehr an aptana gewohnt ^^
und mir ist mal ausgefallen durch die userDMG() funktion stürzt das spiel fast jedes mal ab...
also ich starte dann das spiel und es funktioniert alle einwandfrei wenn ich aber jetzt durch einen tastenklick die funktion aufrufe klappts manchmal aber total oft kommt dann Keine Rückmeldung... liegt aber denke ich an meinem pc...
 

Bobo2040

BeitragFr, Jul 19, 2013 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab da nochmal ne frage und zwar
wenn das Mulitplayer ist würde ich gerne die Koordinaten des Gegners aus der Datenbank auslesen ist das sinnvoll ? oder gibts da ne bessere möglichkeit...
und wie schnell sendet BB die daten an php in welchen zeitabschnitten oder nur wenn ich das sage ?

DAK

BeitragFr, Jul 19, 2013 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu dem oberen Post: Wenn das Spiel fast immer beim Aufrufen einer bestimmten selbstgeschriebenen Funktion abschmiert, dann ist ziemlich sicher dein Programm und nicht dein Computer schuld.

Daten aus einer Datenbank auslesen.. kommt darauf an, was du willst. Du hast ja im Grunde drei Möglichkeiten, das Ganze anzugehen:

1) Direkt aus der Datenbank lesen (ich gehe hier von SQL oder ähnlichem aus)
Das würde ich generell nicht empfehlen, hauptsächlich deswegen, weil du für den Datenbankzugriff Username und Passwort der Datenbank an selbige senden musst. Das wäre extrem unsicher, da der User dann nur z.B. mit Wireshark mitschneiden muss, was das Programm sendet, und so direkt deine Userdaten hast.

2) Zwar eine Datenbank haben, die aber nur über ein Serverprogramm ansprechen
Da hast du zwar im Hintergrund die Datenbank, aber die User kommunizieren nie direkt mit der. Sie schreiben nur ein Serverprogramm an, fragen das nach Daten oder übergeben dem Daten, und das Programm redet dann mit der Datenbank. Das ist wesentlich sicherer.
Jetzt ist nur die Frage, wie du das Serverprogramm realisierst. Machst du es per PHP kann es auf einem normalen Webspace rennen, ist aber saulahm. Geht nur für Rundenbasiertes oder so.
Machst du es als eigenes Programm brauchst du einen Server, auf dem du genügend Rechte hast, um das Programm dort laufen zu lassen.

Diese Lösung (Datenbank + Server) ist nur dann sinnvoll, wenn du eine Art MMO haben willst. Ein Spiel, wo alle Speicherstände zentral gelagert werden, und alle Daten für alle Spieler verfügbar sein muss.

3) Peer to Peer-Kommunikation
In diesem Fall hast du gar keinen echten dedizierten Server. Stattdessen bauen die User die Verbindungen direkt miteinander auf. Das ist dann besonders sinnvoll, wenn es keine dauerhaften Spielstände gibt (wie z.B. in Strategiespielen, wo man eine Runde aufmacht, und nachdem die Runde zu ist, alles wieder weg ist) und es keine Daten gibt, die alle Spieler brauchen (also nur Daten, die die Spieler in der jeweiligen Runde brauchen).

Oft kommt eine Kombination der 2) und 3) Methoden in Einsatz. Das sieht man z.B. in Warcraft 3. Dort hast du einen Server, der sich darum kümmert, dass Spieler sich mit einem gültigen Namen einloggen, gut zueinander finden und dafür sorgt, dass es einen Highscore und Gilden geben kann.
Die Spiele selbst rennen dann in Peer-to-Peer-Manier ab, um den Server nicht unnötig zu belasten.


Zu der Frage, wie oft gesendet wird: Nur dann wenn du es sagst. Sagst du oft, dann oft, sagst du selten, dann selten.

Allerdings würde ich dir raten, von Multiplayer die Finger zu lassen, bis du die Basics wirklich gut beherrschst. Multiplayer verursacht eine ganze Wagenladung weiterer potentieller Probleme. Kümmer dich bitte zuerst darum, dass du mal die Grundlagen gut beherrscht.
Gewinner der 6. und der 68. BlitzCodeCompo

Midimaster

BeitragSa, Jul 20, 2013 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@bobo

meinst du nicht auch, es wäre sinnvoll, wenn Du die UserDMG() Funktion in ihrem derzeitigen Zustand mit hier veröffentlichen würdest, wenn Du dazu eine Frage stellt, oder ein Problem hast?

Wie sollen wir denn wissen, wie die derzeit aussieht?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

Bobo2040

BeitragSa, Jul 20, 2013 0:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm ja Very Happy
Okay hier ist die UserDMG() - sry hatte ich total verpeilt Very Happy
BlitzBasic: [AUSKLAPPEN]

Function UserDMG()
RSBTimer = MilliSecs()
UCBTimer = MilliSecs()
randDMG=Rand(14,20)
LF3=100+randDMG
;Wenn UCB 100 (Weiß)
If KeyHit(203) Then
Schaden = LF3*30*4*2
If MilliSecs()>UCBTimer+1000 Then
UserDMG()
EndIf
ElseIf KeyHit(200) Then ;Wenn RSB 75 gedrückt wurde
Schaden = LF3*32*5*3
If MilliSecs()>RSBTimer+3000
UserDMG()
EndIf
EndIf
If Schaden > 1 Then
If Schaden < 30000 Then
Print "UCB 100:"+Schaden
Else
Print "RSB 75:"+Schaden
EndIf
EndIf
End Function

EDIT :
Ich hatte die Else rausgenommen Very Happy nur zum testen eig. sollte da noch :
BlitzBasic: [AUSKLAPPEN]

If MilliSecs()>UCBTimer+1000 Then
UserDMG()
Else
Print "Du musst noch kurz warten"
EndIf
Kommen Very Happy

EDIT2:
Zu Punkt 2
Ich möchte ein MMO machen es soll sich einmal pro sekunde aktualisieren...
Aber ich habe keinen server... webspace habe ich ne domain mit mysql und php auch php kann ich Very Happy
Und das PHP script zu schreiben wäre nicht das problem... geht es also auch wenn ich z.b. die datenbank habe und das php script und die daten werden per tcp an php gesendet und dann davon verarbeitet... und das jede sekunde oder ist das eine zu hohe belastung ? und wie viel langsamer ist php ?

Thunder

BeitragSa, Jul 20, 2013 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu der Multiplayer-Sache: Du weißt, was MMO(RPG) heißt oder? Die drei Buchstaben einmal nur: Massive(ly) Multiplayer Online. Und viele Spieler, die in Echtzeit miteinander spielen - das verursacht Daten, viele Daten. Ich bin zwar kein Experte, was PHP angeht, aber im Vergleich ist ein Webserver extrem langsam und hält dieser Kommunikation nicht stand.
In so einem Spiel müssen schnell viele Daten übertragen werden und es ist auch nicht so wichtig, wenn mal irgendwo ein kleiner Teil der Daten falsch ist oder verloren geht, also ist TCP (Transmission Control Protocol) schon Mal die falsche Wahl für die Kommunikation. Dazu kommt, dass das dann über einen Webserver läuft, also HTTP (Hypertext Transfer Protocol). Als Sahnehäubchen kommt dann noch die Geschwindigkeit von PHP dazu. Das funktioniert nicht in annehmbarer Zeit.

Schau lieber, dass du das Spiel Mal im Single Player hinbekommst (also lass das MMO weg). Es ist nämlich wirklich nicht soo wahnsinnig einfach, sonst wäre glaub ich das Showcase voll von denen Very Happy
Ehrlich, viele Leute hier sind jahrelang dabei und haben teilweise auch mit anderen Programmiersprachen eine Vorgeschichte und haben noch kein MMORPG programmiert (ich inklusive) Wink
Vieles ist möglich wenn man sich anstrengt, aber es wird nicht dein erstes Programm/Spiel ein MMO werden, auch nicht dein zweites, auch nicht dein drittes. Das ist nicht die Regel. Aber wenn du dich ranhältst kannst du viel lernen und es eines Tages hinkriegen.

Midimaster

BeitragSa, Jul 20, 2013 10:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Du rufst innerhalb der UserDMG() wieder die UserDMG auf. War das Absicht?

Das ist sicherlich nicht nötig und könnte auch für seltsame Abstürze verantwortlich sein. Außerdem frisst es Performance und Stack.

Was wolltest Du damit erreichen? Dies lässt sich sicher eleganter lösen.
Meine Lösung hast Du dabei ja gar nicht berücksichtigt. Hast Du das Tutorial-Kapitel wirklich mal kurz durchgelesen? Manchmal ist "langsamer" "schneller!!!



Ich würde an Deiner Stelle das Spiel auch erst mal Single-User fertigstellen. Dabei werden Dir noch so viele Schwierigkeiten auftauchen, dass Du sicher monate lang beschäftigt bis.

Läuft das Ding dann, dann würde ich zwei User am selben Rechner einbauen. Da lernst Du viel über Multiuser ohne dass Du gleich auch noch die Internetprotokolle kennenlernen musst.

Läuft das dann auch, dann kannst Du es auf echten Multi-User umstellen.

Die meisten Neu-Einsteiger scheitern, weil sie das Projekt zu umfangreich am Anfang anlegen. Wenn Du unsere Codes, die wir dir hier als Hilfe senden mal anschaust, merkst Du, das man das Problem eines z.B. scrollenden Hintergrundes auch in einen neuen extra Programm lösen kann und dann nicht noch gleichzeitig Ärger mit Sounds oder Bilder, etc haben muss. Das wäre mein Rat an Dich: Schreibe kleinere Lösungen und kombiniere sie später.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

DAK

BeitragSa, Jul 20, 2013 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@Bobo: Ich programmiere jetzt schon seit acht Jahren. Habe angefangen mit BlitzBasic, bin dann auf Blitz3D umgestiegen, dann BlitzMax, C/C++, kurzzeitig auch FASM, hab dazwischen noch mal PHP gelernt und programmiere jetzt seit anderthalb Jahren intensiv in Java, sowohl dem normalen SE als auch mit dem Android SDK.
Ich studiere jetzt Informatik im dritten Semester und arbeite als Programmierer.

Mein erstes Projekt war ein Spiel, das zweite, dritte und ein Großteil der Folgenden auch. Ich hab sehr viele Spiele angefangen und auch ein paar fertig gemacht. Unter den Angefangenen natürlich auch ein paar, die ich gerne als MMO gesehen hätte. Keines der Multiplayer-Spiele ist auch nur annähernd spielbar geworden. Es gibt einen Grund, warum an den meisten MMOs mehrere tausend Leute arbeiten. Die Entwicklungskosten für ein MMORPG betragen rund 60-100 Millionen Dollar, habe ich vor kurzem wo gehört. Das sind Monsterprojekte, wo Leute, die schon seit Jahrzehnten Spiele machen sich die Zähne daran ausbeißen.

Du programmierst jetzt etwas weniger als eine Woche, wenn ich das richtig mitbekommen habe. Vertrau den Leuten, die vor dir genau in der gleichen Situation waren, in der du jetzt bist. Schau, dass du mal den Singleplayer hinkriegst, und dann kümmer dich um den Rest.




Aja, wie Midimaster schon angedeutet hat: Die Rekursion in UserDMG() führt dazu, dass du dir einen Stackoverflow holst, wenn dein Computer schnell genug rechnet.
Hintergrund dazu: Wenn du eine Funktion aufrufst, dann werden die Werte (Variablen, Parameter, Rücksprungadressen, ...) der letzten Funktion auf den Stack gespeichert. Die letzte Funktion ist ja noch offen, also wird sie da abgespeichert. Die Größe des Stacks ist aber limitiert. Der hat nur eine bestimme Menge Speicherplatz.

Am Anfang der Funktion wird RSBTimer auf Millisecs gestellt. Dann kommt dieser Codeteil:
BlitzBasic: [AUSKLAPPEN]
If MilliSecs()>RSBTimer+3000 
UserDMG()
EndIf

Das heißt, wenn RSBTimer+3000<MilliSecs(), dann wird UserDMG() wieder aufgerufen.
Die Funktion hat aber seit Beginn der Funktion nie 3000 ms gebraucht, also ist das quasi immer wahr, und UserDMG() wird neu gestartet. Jetzt wird RSBTimer wieder auf MilliSecs() gestellt, und weiter geht der Spaß.
Du hast hier eine Endlosschleife, die erst durch einen Stackoverflow beendet wird.

Um solche Fehler selbst zu finden, aktiviere doch bitte den Debugmodus und schau, welche Fehlermeldung er dir ausgibt, und wo der Cursor dann in deinem Programm steht. Dort ist dein Fehler.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragSa, Jul 20, 2013 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also im Debug Modus gibt er mir keinen Fehler oder so aus...
Und ich Probiers dann erstmal im Singleplayer... Very Happy
EDIT:
Ich habe jetzt ne Funktion zum map wechsel geschreiben funktioniert auch solange ich das waitmap weglasse
ansonsten passiert nix Very Happy im debug log steht nix
BlitzBasic: [AUSKLAPPEN]

Function ChangeMap()
WaitMap=MilliSecs()
If KeyHit(36) Then
If MilliSecs() > WaitMap+3000 Then
If 50-KameraX < SpielerX And 450-KameraX > SpielerX Then
If 50-KameraY < SpielerY And 450-KameraY > SpielerY Then
PlayMusic("sounds/jump_sound.mp3",1)
If Map=Map_2 Then
Map=Map_1
ElseIf Map=Map_1 Then
Map=Map_2
EndIf
EndIf
EndIf
EndIf
EndIf
End Function

Midimaster

BeitragSa, Jul 20, 2013 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
was genau willst Du denn mit dem WaitMap erreichen?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

Bobo2040

BeitragSa, Jul 20, 2013 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit erstens der ton abgespielt wir dum die karte zu wechseln und damit man die karte nicht so schnell hin und her wechseln kann Very Happy

DAK

BeitragSa, Jul 20, 2013 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal diesen Codeteil genau an:

BlitzBasic: [AUSKLAPPEN]
WaitMap=MilliSecs()
If KeyHit(36) Then
If MilliSecs() > WaitMap+3000 Then


Zuerst wird WaitMap auf MilliSecs() gesetzt. Dann wird der Keyhit überprüft, und wenn der durchgeht, dann wird überprüft, ob MilliSecs() inzwischen größer ist, als WaitMap+3000. Das bringt aber gar nix, da seit WaitMap=MilliSecs() im schlimmsten Fall 1 ms (eher deutlich weniger) vergangen ist, das heißt, WaitMap ist maximal um 1 geringer als MilliSecs(). MilliSecs() > WaitMap+3000 tritt also NIE ein.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragSa, Jul 20, 2013 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm okay also muss ich es so machen ?
BlitzBasic: [AUSKLAPPEN]

If MilliSecs()+3000 < WaitMap Then

Ich habs nicht so mit rechen logik Very Happy

Addi

BeitragSo, Jul 21, 2013 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das oben ist schon richtig, das Problem ist aber (wie DAK bereits erklärt hat), dass du WaitMap die aktuelle Systemzeit zuweist und unmittelbar danach (sollte die Taste gedrückt worden sein) überprüfst, ob 3 Sekunden vergangen sind. Da der WaitKey Befehl aber keine 3 Sekunden benötigt und WaitMap bei Methodenaufruf wieder aktualisiert wird, kann dieses Statement niemals wahr werden und es wird demnach auch nicht geladen.
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62
 

Bobo2040

BeitragSo, Jul 21, 2013 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay und wie kann ich es sonst lösen ?
vllt. so ?
[url]
WaitMap = MilliSecs()-3000
if WaitMap < MilliSecs then
[/url]

DAK

BeitragSo, Jul 21, 2013 5:51
Antworten mit Zitat
Benutzer-Profile anzeigen
In diesem Fall ist WaitMap von Haus aus immer kleiner als MilliSecs() das heißt
WaitMap<MilliSecs() ist immer wahr. Tut auch nix.

Worum es geht, ist, dass du WaitMap nicht jeden Schleifendurchlauf neu initialisieren darfst.

Ich nehme an, deine generelle Codestruktur schaut ungefähr so aus:

BlitzBasic: [AUSKLAPPEN]
While ...
Cls
...
ChangeMap()
...
Flip
Wend


oder?

Und soweit ich verstehe, willst du bezwecken, dass der Inhalt der Funktion nur dann ausgeführt wird, wenn die Taste gedrückt wurde, UND mindestens 3 Sekunden seit dem letzten Tastendruck vergangen ist. In dem Fall muss das so ausschauen:

BlitzBasic: [AUSKLAPPEN]

Global WaitMap = 0
While ...
Cls
...
ChangeMap()
...
Flip
Wend

...

Function ChangeMap()
If KeyHit(36) And WaitMap<MilliSecs() Then
WaitMap = MilliSecs()+3000
...
EndIf
End Function


WaitMap wird hier eine globale Variable. Das ist deswegen notwendig, weil Variablen innerhalb von Funktionen am Ende jedes Funktionsaufrufes verworfen werden. Das heißt, dass du in lokalen Variablen innerhalb von Funktionen keine Information "über mehrere Runden" behalten kannst. Deswegen brauchst du eine Variable, die außerhalb der Funktion steht dafür. Lokale Variablen außerhalb einer Funktion lassen sich aber nicht von innerhalb der Funktion sehen. Deswegen gibt es Globale Variablen. Die kann man von überall aus sehen.

Pass aber auf: Sei mit den globalen Variablen bitte sehr sparsam, und verwende sie nur dort, wo du sie brauchst, sie haben nämlich auch ein paar Nachteile:
-) Du müllst dir deinen Variablenraum zu. Der Sinn hinter dem Wegwerfen der Variablen am Ende von Funktionen ist, dass du die Variablen meist nur an einer Stelle des Codes brauchst, und nicht wo anders. Dadurch sorgst du dafür, dass du Variablen nicht unabsichtlich doppelt verwendest. Globale Variablen verhindern das.
-) Du müllst dir den Speicherplatz zu. Durch das Wegwerfen der Variablen wird automatisch der benötigte Speicherplatz wieder freigegeben. Globale Variablen bleiben dauerhaft im Speicher. In BB ist das aufgrund der generellen Sprachstruktur meist nicht so böse (Variablen beinhalten nur selten mehr als ein paar Bytes), bei anderen Programmiersprachen kann das aber dein Tod sein.


Edit: Außerdem hast du schon wieder MilliSecs ohne () geschrieben, was den Sinn dieses Codeblocks wieder mal zum Hugo schießt...
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragSo, Jul 21, 2013 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke Very Happy
Funktioniert jetzt alles soweit Very Happy
Den rest versuche ich ma alleine Very Happy
 

Bobo2040

BeitragSo, Jul 21, 2013 11:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay ich hätte da noch eine Frage und zwar möchte ich die laser gerne zeichnen lassen wie das geht weiß ich auch mit Line oder Rect oder ich nehme ein Bild aber wie kann ich es in z.b. 1 sekunde von x:100 zu x:200 "fliegen" lassen ?
Also wie kann ich es begrenzen ? die geschwindigkeit

So ich habe eben mal getestet und mit erstaunen bemerkt das TCP wahnsinnig schnell ist Very Happy
Ich habe ein Script geschrieben , das sobald X größer oder kleiner also 100 ist etwas in die db schreiben soll und also ich ich der db geschaut hab stand da bei x 101 also hat er sofort als ich die taste geklickt hatte die daten an php geschickt und php hat die daten ruck zuck an mysql weitergeleitet .... nartürlich ist alles sehr klein gehalten findes aber trozdem schön Very Happy
nur wie kann ich es machen, das er bei jeder bewegung die datensätze einträgt... also eintragen nicht sondern updaten aber das mache ich ja mit php das weiß ich Very Happy
Nur wie kann ich es machen? weil nach dem ersten eintrag kam sonst nix mehr...
hier mal mein BB Code... habe es schon mit einer while schleife versucht hat sich aber aufgehangen was ja auch verständlich ist Very Happy
BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()
Global x=100
Global y=100

Print "Verbinde..."
tcp = OpenTCPStream("127.0.0.1", 80)
If Not tcp Print "Fehlgeschlagen TCP Conn": WaitKey : End
Print "Verbunden! Sende Anfrage..."
Repeat
Cls

If KeyDown(205) Then
x=x+1
ElseIf KeyDown(203) Then
x=x-1
ElseIf KeyDown(208) Then
y=y+1
ElseIf KeyDown(200) Then
y=y-1
EndIf

Rect x,y,10,10
If x < 100 Or x > 100 Then
WriteLine tcp, "GET http://localhost/test/index.php?x="+x+"&y="+y+"&from= HTTP/1.0"
WriteLine tcp, Chr$(10)
EndIf


Delay(1)
Flip 0
Until KeyHit(1)
CloseTCPStream tcp
End

Gehe zu Seite Zurück  1, 2, 3, 4  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group