Gegner erstellung, Kampfsysteme?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Blasterfreund

Betreff: Gegner erstellung, Kampfsysteme?

BeitragDi, Dez 21, 2010 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab einige fragen zum Thema Kampf und Gegner:
1.Was ist eine Ki und wie erstellt man eine?(beispiel mit verfolgenden würfel)
2.was ist pathfinding und wozu brauch ich das?
3.Wie wird über Funktionen Schaden erzeugt?
4.Wie Frage ich Attacken ab?
4.1.Speziell: wenn der verfolgende würfel im Beispiel nah an mich rankommt und mich angreift, wie wird der Angriff bei mir abgefragt und andersherum wie beim gegner wenn ich ihn angreife?

Szenario:
Ich habe ein Programm das als eine art kampfsimulation erstmal gilt.
es hat ein Datennetz als Boden und eine technisch aussehende Skybox.
ich kann mich frei bewegen es ist im Ersteperson Ansicht.
Geplant:
ich will das in einem Gewissen Abstand Gegner Spawnen, mich verfolgen und angreifen.
ich soll selbst angreifen können, ihnen schaden und sie besiegen können.
In a world without walls and fences who need gates and windows.

Xeres

Moderator

BeitragDi, Dez 21, 2010 1:07
Antworten mit Zitat
Benutzer-Profile anzeigen
1. KI steht für "künstliche Intelligenz" und Computergesteuerte Spieler im weiteren Sinne. Eine Simple KI könnte die Richtung zum Ziel bestimmen und sich darauf zu bewegen.
2. Nomen est Omen; Pathfinding ist die Routine, über die die KI den (günstigsten) Pfad zum Ziel bestimmt.
3. "Schaden" ist gewöhnlich auch nur eine Zahl (oder ein Wertebereich); man rechnet z.B. HP = HP - DMG und schon nehmen die Hit Points ab.
4. Was für Attacken?
4.1 Für Nahkampf wäre Kugel-Kugel Kollision am sinnvollsten - man bestimmte den Abstand Start zu Ziel und wenn der klein genug ist (kleiner als die Summe der Radien von Start und Ziel) führe man eine Aktion (z.B. Schaden berechnen) aus.
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)

Dottakopf

BeitragDi, Dez 21, 2010 1:39
Antworten mit Zitat
Benutzer-Profile anzeigen
die ersten 2 themen sind ziemlich komplex. Vorallem eine sinnvolle KI zu programieren ist wirklich nicht ohne und ich bin nun einige zeit dabei, und müsste bei diesem thema schon recht schnaufen.

ich möchte jetzt nicht direkt sagen, schlag dir erstmal das mit dem Path finding und der KI aus dem Kopf, aber wenn du noch bei den basics bist, dann könnten wir dir den code auch auf chinesisch hinschreiben Very Happy

Wenn du mal kleinere Projekte gemachst hast, und verstehst wie ein programm/code funktoniert, dann erklären sich dinge wie Path finding und KI usw. fast von selbst.

Nur so als anmerkung. Es gibt verschiedene methoden für path finding. Ich habe bis her immer den A* Algo benutzt um wege für "möchte gern KI Npcs" zu berrechnen. Diese gibts auch schon vorgefertigt und es wird schön das prinzip von Path finding erklärt.

Viel Erfolg noch

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Blasterfreund

BeitragDi, Dez 21, 2010 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit dem kreis teil wie Funktioniert das, und was wenn ich nur Angriffe in eine Richtung zulassen will und auch nur wenn eine function ausgeführt wird?
In a world without walls and fences who need gates and windows.

Xeres

Moderator

BeitragDi, Dez 21, 2010 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten wär's, wenn du dir ein paar Tutorials anschaust - grundlegendes Verständnis von Schleifen, Bedingungen & Funktionen solltest du dir schon selbst erarbeiten.
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)

Blasterfreund

BeitragMi, Dez 22, 2010 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ok...
ich glaube das kann ich aber wie frage ich kollisionen ab?
nicht in sinne von wie mache ich eine schleife und setze da if rein sondern mit welchem befehl konkret frage ich ab, dass dieses und jenes objekt kollidiert sind?
In a world without walls and fences who need gates and windows.

BladeRunner

Moderator

BeitragMi, Dez 22, 2010 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
2D: recht simple Mathematik, Du vergleichst primitive Objekte (Kreis, Rechteck) und schaust anhand ihrer Koordinaten ob sie sich überschneiden. Simpelstes Beispiel ist kreis-kreis-Kollision, wenn die Summe der Radien zweier Kreise größer ist als der Abstand ihrer Mittelpunkte (Pythagoras hilft da) so kollidieren sie zwangsläufig.
3D: Hier hat b3d ein paar Befehle eingebaut, siehe OnlineHilfe.
Allgemein würde ich Dir empfehlen dazu zu googlen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Blasterfreund

BeitragSo, Dez 26, 2010 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
thx ich such mal...
Ich hab auch mich an einer einfachen Ki versucht marke eigenbau...
nun eigentlich sollte sie einen würfel dazu bringen sich auf die position des spielers auszurichten und auf ihn zu laufen...
Aber er rennt weg statt mich zu verfolgen, was mach ich falsch?
Code: [AUSKLAPPEN]
Function follower_Ki(obj,obj2,turnrate,turnlimit,speed#)
If EntityYaw(obj) + turnlimit < Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2)) Then TurnEntity obj,0,turnrate,0
If EntityYaw(obj) - turnlimit > Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2)) Then TurnEntity obj,0,- turnrate,0
If EntityYaw(obj) - turnlimit < Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2)) And EntityYaw(obj) + turnlimit > Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2))  Then MoveEntity obj,speed#,0,0
End Function

wo liegt der fehler?
In a world without walls and fences who need gates and windows.

Xeres

Moderator

BeitragSo, Dez 26, 2010 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer soll den darin durchsehen?
Speichere die ganzen Funktionsaufrufe zwischen und benutze aussagekräftige Variablennamen. Ein paar Kommentare was da warum erreicht werden soll wären auch hilfreich.
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)

Blasterfreund

BeitragSo, Dez 26, 2010 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
so nochmal mit notizen:
Code: [AUSKLAPPEN]
;funktion zur Verfolgung
Function follower_Ki(obj,obj2,turnrate,turnlimit,speed#)
;obj ist der verfolger,obj2 der verfolgte.
;turnrate bestimmt die winkelzahl um die sich der verfolger dreht.
;turnlimit bestimmt die mögliche abweichung von der ideallen winkelstellung zum verfolgtem objekt
;speed# bestimmt die geschwindigkeit mit der sich der verfolger bewegt.
If EntityYaw(obj) + turnlimit < Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2)) Then TurnEntity obj,0,turnrate,0 ; fragt den winkel ab in dem das zu verfolgende objekt zum Verfolger steht
;außerdem wird ein abgleich mit der aktuellen ausrichtung des verfolgers gemacht und wenn nötig angegleicht.
If EntityYaw(obj) - turnlimit > Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2)) Then TurnEntity obj,0,- turnrate,0
;das gleiche wie über diesem programmabschnitt nur mit abfrage in die entgegengesetzte richtung.
If EntityYaw(obj) - turnlimit < Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2)) And EntityYaw(obj) + turnlimit > Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityY (obj),EntityY (obj2))  Then MoveEntity obj,speed#,0,0
;wenn der Verfolger anähernd in die richtung des objekt zeigt wird er nach forne bewegt.
End Function

hoffe ihr kommt damit besser klar.
In a world without walls and fences who need gates and windows.

Blasterfreund

BeitragSo, Dez 26, 2010 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
und hier noch die funktion in der funktion:
Code: [AUSKLAPPEN]
Function Locate_degree_unit (x1#,x2#,y1#,y2#)
Return 1/(Sin(x1#-x2#/Sqr(((y1#-y2#)*(y1#-y2#)) + ((x2#-x1#)*(x2#-x1#)))))
End Function

im prinzip eine Sinusfunktion.
In a world without walls and fences who need gates and windows.

Holzchopf

Meisterpacker

BeitragSo, Dez 26, 2010 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
1.: Unterlasse in Zukunft Doppelposts. Wenn du was nachreichen willst (so wie eben), kannst du den letzten Beitrag bearbeiten (dafür gibt's oben rechts an jedem deiner Beiträge den Edit-Button user posted image).

2. Um die Übersichtlichkeit und Lesbarkeit deines Codes noch zu steigern, kannst du übrigens auch Code einrücken und, um uns dann daran teilhaben zu lassen, statt den code-Boxen die syntax-Boxen (über dem Eingabefeld die Schaltfläche, die mit BB beschriftet ist) verwenden. Wie das im Adventskalender vorgestellt wurde.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Blasterfreund

BeitragSo, Dez 26, 2010 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bemüh mich das nächste mal ne bisschen übersichtlicher zu sein,
damit ihr das auch lesen könnt. Very Happy
auf jedenfall das hab ich nicht gewusst mit dem Syntax, tut mir leid Sad
und was sagt ihr dazu was hab ich den Falsch gemacht?(jetzt mal im Programm! Very Happy )

Ok nun hab ich daran ein bisschen gearbeitet...
es funktioniert schon mal die Winkelbestimmung...
aber der Würfel scheint sich weder nach mir auszurichten noch sonst irgendwie sich zu bewegen...
es muss daran liegen, dass ich die if-Sätze etwas abgeändert habe...
hier mal nochmal die Funktionen:
BlitzBasic: [AUSKLAPPEN]
Function Locate_degree_unit (x1#,x2#,y1#,y2#)
Local dgree# = ASin(Sqr((x1#-x2#)*(x1#-x2#))/Sqr(((y1#-y2#)*(y1#-y2#)) + ((x2#-x1#)*(x2#-x1#))))
If x1# > x2# Then
If y1# > y2# Then
dgree# = 90 - dgree#
dgree# = dgree# + 180
ElseIf y1# < y2# Then
dgree# = dgree# + 90
EndIf
ElseIf x1# < x2# Then
If y1# > y2# Then
dgree# = dgree# + 270
ElseIf y1# < y2# Then
dgree# = 90 - dgree#
EndIf
EndIf
Return dgree#
End Function


;funktion zur Verfolgung
Function follower_Ki(obj,obj2,turnrate,turnlimit,speed#)
Degree# = Locate_degree_unit (EntityX (obj),EntityX (obj2),EntityZ (obj),EntityZ (obj2))
;obj ist der verfolger,obj2 der verfolgte.
;turnrate bestimmt die winkelzahl um die sich der verfolger dreht.
;turnlimit bestimmt die mögliche abweichung von der ideallen winkelstellung zum verfolgtem objekt
;speed# bestimmt die geschwindigkeit mit der sich der verfolger bewegt.

If Sqr((EntityYaw(obj) - Degree#)*(EntityYaw(obj) - Degree#)) < turnlimit And Sqr((EntityYaw(obj) - ( 360 - Degree# ))*(EntityYaw(obj) - ( 360 - Degree# ))) > turnlimit Then TurnEntity obj,0,-turnrate,0
If Sqr((EntityYaw(obj) - Degree#)*(EntityYaw(obj) - Degree#)) > turnlimit And Sqr((EntityYaw(obj) - ( 360 - Degree# ))*(EntityYaw(obj) - ( 360 - Degree# ))) < turnlimit Then TurnEntity obj,0, turnrate,0
If Sqr((EntityYaw(obj) - Degree#)*(EntityYaw(obj) - Degree#)) < turnlimit And Sqr((EntityYaw(obj) - ( 360 - Degree# ))*(EntityYaw(obj) - ( 360 - Degree# ))) < turnlimit And Sqr((EntityYaw(obj) - Degree#)*(EntityYaw(obj) - Degree#)) > turnlimit And Sqr((EntityYaw(obj) - ( 360 - Degree# ))*(EntityYaw(obj) - ( 360 - Degree# ))) < turnlimit Then MoveEntity obj,0,0,speed#
End Function

diesmal mit Synthax Very Happy
schuldigung wenn ich nicht alles übersichtlich gestaltet habe ich bring immer erst später ordnung rein wenns funktioniert(Ja, ich weiß, dass ein ordentliches programm beim Bugfixen unglaublich hilft, aber ich habs ja noch nicht so mit der Form(noch nicht = kommt noch! Laughing ))
In a world without walls and fences who need gates and windows.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group