Npc Sectionen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Fobsi

Betreff: Npc Sectionen

BeitragMi, Jun 03, 2009 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hi @ll

Wieder mal hab ich ein Problem und hoffe ihr könnt mir helfen. Zuerstmal ganz klar, mein Code ist schnellschnell/auf meine Art gemacht und ihr werdet ihn auch wahrscheindlich nicht verstehen ich probeire es euch aber trozdem zu zeigen/erklären:

Jeder Npc besteht aus:

Code: [AUSKLAPPEN]
npc(1,43,17,979,689,"Orc von Zerias" ,20,20,2,2,0,5,0)

->
npc(npcid,npcx,npcy,rnpcx,rnpcy,npc_name$,npc_lifen,npc_maxlifen,npc_lvl,npc_dmgn,min_drop,max_drop,attacke_id)


1-5: Die ersten 5 zahlen sind zur positions Anzeige der Npc auf der Map mit dem Jeweiligen Bild npcid = bild ID.
5: Namen des NPCs
6-7: Npc Life + Max life .. solte Verständlich sein.
8-10: (minimum Geld drop - Maximum Geld drop)->ist nochnicht wirklich implementiert. attacke_id = wind,wasser,feuer etc... auch noch net drin.

Die Funktion ist im Moment so aufgebaut und funktiuniert auch hervorragend, jedoch nur bei 1nem NPC:
(Ich weiss Formatierung ist fürn Arsch! Aber wenn ich programmiere schaue ich nur selten drauf)
Code: [AUSKLAPPEN]
Function npc(npcid,npcx,npcy,rnpcx,rnpcy,npc_name$,npc_lifen,npc_maxlifen,npc_lvl,npc_dmgn,min_drop,max_drop,attacke_id)

If attm = 0 Then
npc_id = npcid
EndIf

If attm = 0 And npc_id <> 0 Then
DrawImage monster,rnpcx-movenpcx,rnpcy-movenpcy,npcid
EndIf
If playerx = npcx And playery=npcy Then
If attm = 0 Then
Color 255,255,255
Rect 230, 275, StringWidth(npc_name$+" lvl:"+npc_lvl+" HP:"+npc_lifen) + 2, StringHeight(npc_name$+" lvl:"+npc_lvl+" HP:"+npc_lifen)+2, 1
Color 0,0,0
Text 230, 275, npc_name$+" lvl:"+npc_lvl+" HP:"+npc_lifen
Color 255,255,255
EndIf
EndIf
If PB_ButtonHit(Btn_atta) And playerx = npcx And playery=npcy Then attm = 1 c_an = 1 ctxt0$ = "beginne kampf mit:"+npc_name$+" " PB_DisableAll()

; ---- im kampf -----

If attm = 1 And npc_id = npcid Then
kampfm =1
DrawImage monster,299,288,npcid
DrawImage player,267,288,playerid
DrawImage attacken,109,224,0
DrawImage attacken,345,224,attacke_id

PB_EnableButton(Btn_att1)
If PB_ButtonHit(Btn_att1) Then hp = hp - npc_dmgn test_npc_hp = test_npc_hp - sterke 

balkenbreite = (178*hp)/max_hp
balkenbreitenpc =(178*test_npc_hp)/npc_maxlifen

If cheker = 0 Then
test_npc_hp = test_npc_hp + npc_lifen
cheker = 1
EndIf

Color 0,128,0

If hp > max_hp/4*3 Then
Color 0,128,0
EndIf

If hp < max_hp/4*3 Then
Color 255,128,0
EndIf    

If hp < max_hp/4*2 Then
Color 200,0,0
EndIf

Rect 108, 353, balkenbreite, 25, 1

If test_npc_hp > npc_maxlifen/4*3 Then
Color 0,128,0
EndIf

If test_npc_hp < npc_maxlifen/4*3 Then
Color 255,128,0
EndIf

If test_npc_hp < npc_maxlifen/4*2 Then
Color 200,0,0
EndIf

Rect 311, 353, balkenbreitenpc,25,1
Color 0,0,0
Text 173,358,"HP: "+hp
Text 381,358,"HP: "+test_npc_hp

If test_npc_hp =< 0 And tcheker = 0 Then
attm = 0
kampfm =0
cheker = 0

gold = gold + 5

tcheker = 1
EndIf

If hp =< 0 And tcheker1 = 0 Then
attm = 0
kampfm =0
cheker = 0
hp = 1
gold = gold/2
tcheker1 = 1
EndIf

EndIf

 

;EndIf
End Function


Gut der Code ist denke ich mal net sooooo Schwer ^^ und genau da liegt der Fehler:
Warum funzt das ganze nur bei einem NPC bzw der Kampf-Modus? Kann mir das net Erklären. Wie unterteile ich den Code so das er für beide funzt bzw für 100derte?

Hier noch das Ganze Game kopiliert zum veranschaulichen:

->Link<-

lg Fobsi


EDIT:

Hier noch Bild vom Problem:
user posted image
 

n-Halbleiter

BeitragMi, Jun 03, 2009 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir raten, dass du deine NPCs in einem Type speicherst. Damit hast du die volle Kontrolle und ersparst dir die viele Arbeit bei den Funktionen. Setze dich damit mal auseinander und speichere alle die ganzen Werte wie IDs, Name, Lebenspunkte u.ä. in Fields. Zusätzlich, zu deinem Kampf-System, solltest du auch noch, da du das scheinbar separat handhaben möchtest, eine zusätzliche Ansicht in deine Hauptschleife einbauen, welche dann entweder angezeigt und berechnet wird, oder eben die normale Ansicht.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Dottakopf

BeitragDo, Jun 04, 2009 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
auch ich stimme n-Halbleiter zu. Die NPCs solltest du mit types lösen. Viel übersichtlicher und auch schöner anzusprechen!!!
(unter der Tutorial sammlung findest du viele Tuts dazu)
https://www.blitzforum.de/foru...hp?t=25321
https://www.blitzforum.de/foru...hp?t=25694


noch kurz eine Frage an alle:
Normalerweise sind arrys schneller als types. Verhält sich das liniar ??
Also ein arry mit 100 dimensionen kann schneller druchgegangen werden als ein type mit 100 feldern ?


P.S. Noch ein kleiner Tipp, "Schnel Schnell code" geht zwar am anfang locker von der Hand, später steht dann aber der Crash bevor.


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Fobsi

BeitragDo, Jun 04, 2009 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten

Gut werd es mal mit types probieren. Jedoch wollte ich eigentlich keine Types weil ich da eher weniger durchblicke hab mir schon mehrere gute Tuts dazu angesehen jedoch verstehe ich nicht ganz wie ich das nun in einen Code umsetze, naja üben macht den Meister.

so Hab nun mal angefangen:

könnte das gehen so:

Code: [AUSKLAPPEN]
Type NPCT
   Field T_ID
   Field T_NX
   Field T_NY
   Field T_RNX
   Field T_RNY
   Field T_NNAME$
   Field T_TDROP
   Field T_ATTS
End Type

Function NNPC(NNAME$,X,Y,RX,RY  ,MIDD,MADD,ATTS)
For t = 1 To 1
   NPC.NPCT = New NPCT

   NPC\T_ID = T_ID +t
   NPC\T_NX = X
   NPC\T_NY = Y
   NPC\T_RNX = RX
   NPC\T_RNY = RY
   NPC\T_NNAME$ = NNAME$
   NPC\T_TDROP = Rand(MIDD,MADD)
   NPC\T_ATTS = Rand(ATTS-3,ATTS+3)

Print NPC\T_ID ;ID
Print NPC\T_NX
Print NPC\T_NY
Print NPC\T_RNX
Print NPC\T_RNY
Print NPC\T_NNAME$
Print NPC\T_TDROP
Print NPC\T_ATTS
Print "-----------" ;Kleine Linie fürs testen

Next
End Function

NNPC("TestMob",2,2,200,200,5,10,4)
 
 

Omenaton_2

BeitragDo, Jun 04, 2009 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi !

Types sind für ein Computerspiel ab einer bestimmten (schon kleinen) Größe ein Muß und es ist nicht im Geringsten schwierig. Du mußt dich einfach nur trauen.

Dein NPC Type könnte zum Beispiel so aussehen :

; Type definieren. Das wird nur ein Mal am Anfang des Codes gemacht.

Type NPCWERTE

Field npcid%
Field npcx
Field npcy
Field rnpcx
Field rnpcy
Field npc_name$
Field npc_lifen%
Field npc_maxlifen%
Field npc_lvl%
Field npc_dmgn
Field min_drop%
Field max_drop%
Field attacke_id%

End Type

; Dann mußt du deine NPCs erschaffen. Am Besten liest du deren Werte aus einer externen Text-Datei heraus, die du am Anfang per Hand in Windows NotePad erstellst.
; Hier wird nur 1 Test NPC als Beispiel erschaffen :

NPC.NPCWERTE = New NPCWERTE

NPC\npcid = LastID
NPC\npcx = 1
NPC\npcy = 1
NPC\rnpcx = 1
NPC\rnpcy = 1
NPC\npc_name$ = "Name"
NPC\npc_lifen = 1
NPC\npc_maxlifen = 1
NPC\npc_lvl = 1
NPC\npc_dmgn = 1
NPC\min_drop = 1
NPC\max_drop = 1
NPC\attacke_id = 1


; Wenn du dann einen bestimmten NPC behandeln möchtest, gehst du mit einem Loop alle NPCs durch und suchst den Richtigen mit Hilfe des IDs aus.

For NPC = Each NPC.NPCWERTE
If NPC\npcid = ID_Gesucht Then Exit
Next

; Danach hast du Zugriff

Fobsi

BeitragDo, Jun 04, 2009 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh wie erstelle ich dan mehrere? muss ich das in einer For to Next schleifen tun oder wie tue ich das weil:

Code: [AUSKLAPPEN]
NPC.NPCWERTE = New NPCWERTE

NPC\npcid = LastID
NPC\npcx = 1
NPC\npcy = 1
NPC\rnpcx = 1
NPC\rnpcy = 1
NPC\npc_name$ = "test1"
NPC\npc_lifen = 1
NPC\npc_maxlifen = 1
NPC\npc_lvl = 1
NPC\npc_dmgn = 1
NPC\min_drop = 1
NPC\max_drop = 1
NPC\attacke_id = 1

NPC.NPCWERTE = New NPCWERTE

NPC\npcid = LastID
NPC\npcx = 1
NPC\npcy = 1
NPC\rnpcx = 1
NPC\rnpcy = 1
NPC\npc_name$ = "test2"
NPC\npc_lifen = 1
NPC\npc_maxlifen = 1
NPC\npc_lvl = 1
NPC\npc_dmgn = 1
NPC\min_drop = 1
NPC\max_drop = 1
NPC\attacke_id = 1


Macht ja net automatisch 2 NPCs? Confused

Nicdel

BeitragDo, Jun 04, 2009 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Xeres

Moderator

BeitragDo, Jun 04, 2009 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann nur empfehlen eure Types, Felder und zugehörigen Funktionen einheitlich und eindeutig zu benennen - und die sinnlose Doppelbennenung wie "NPC.NPC\NPC_X" zu lassen.

Code: [AUSKLAPPEN]
Type TNPC
   Field id%
   Field x
   Field y
   Field rx
   Field ry
   Field name$
   Field lifen%
   Field lifen_max%
   Field lvl%
   Field dmgn
   Field drop_min%
   Field drop_max%
   Field attacke_id%
End Type

Function Create_NPC(anzahl%=1)
   Local i, npc.TNPC
   For i=0 To anzahl
      npc = New TNPC
      npc\name = "npc Nr."+i
   Next
End Function


Edit:
New vergessen Rolling Eyes
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 Do, Jun 04, 2009 18:31, insgesamt 2-mal bearbeitet

Fobsi

BeitragDo, Jun 04, 2009 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
hi Xeres
naja was soll ich damit? Damit kann ich gerademal NPCs machen die alle den Selben Namen haben?
Später/am anfang muss ich dann sowiso jeden Npc abrufen und ihm den Entsprechenden Namen/X/Y etc geben.

Code: [AUSKLAPPEN]
Type TNPC
   Field id%
   Field x
   Field y
   Field rx
   Field ry
   Field name$
   Field lifen%
   Field lifen_max%
   Field lvl%
   Field dmgn
   Field drop_min%
   Field drop_max%
   Field attacke_id%
End Type

Function Create_NPC(anzahl%=1)
   Local i
   npc.TNPC = New TNPC
   For i=0 To anzahl
      npc\name = "npc Nr."+i
     Print npc\name
   Next
End Function

Create_NPC(2)


Edit: In nem RPG sollte eh nicht jeder Npc gleich sein fals du da was missverstehst. Naja oder ich etwas nicht Chek ^^

The_Nici

BeitragDo, Jun 04, 2009 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du damit sollst? Es verstehen und nach dem prinzip vorgehen.

Xeres

Moderator

BeitragDo, Jun 04, 2009 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ging mir nur um die sinnvolle Benennung, denn Ordnung ist das halbe leben Wink
Aber um etwas hilfreicher zu sein: Mit Types lassen sich viele Dinge sehr praktisch Regeln, Beispiel:

Code: [AUSKLAPPEN]
Type TNPC
   Field name$
   Field leben, mana
   Field Klasse.TKlasse ; Eigenschafter der Klasse...
   Field Target.TNPC    ; Dieses Ziel hat der NPC im visier
End Type

Type TKlasse
   Field name$
   Field Leben_multi#
   Field Mana_multi#
End Type

Function Create_Klasse.TKlasse(name$, LM#, MM#)
   Local K.TKlasse = New TKlasse
   K\name = name$
   K\Leben_multi = LM#
   K\Mana_multi = MM#
   Return K
End Function

Function Create_NPC.TNPC(name$, klasse.TKlasse)
   Local npc.TNPC = New TNPC
   npc\name = name$
   npc\Klasse = klasse
   npc\leben = 100 * npc\Klasse\Leben_multi
   npc\mana = 100 * npc\Klasse\Mana_multi
   Return npc
End Function

Function NPC_Info(npc.TNPC)
   Print("Name: "+npc\name+" ,"+npc\Klasse\name)
   Print("Leben: "+npc\leben+"   Mana: "+npc\mana)
   If npc\Target <> Null Then
      Print(npc\name+" ziehlt auf "+npc\Target\name)
   Else
      Print(npc\name+" hat nichts im Visier")
   EndIf
   Print(String("- ",5))
End Function

;*** Klassen erstellen:
Local Klasse_Zauberer.TKlasse = Create_Klasse("Zauberer", 0.5, 1.5)
Local Klasse_Krieger.TKlasse = Create_Klasse("Krieger", 2.0, 0.3)

;*** Charaktere mit einer Klasse Erstellen
Local Orc.TNPC = Create_NPC("Raizul", Klasse_Krieger)
Local mage.TNPC = Create_NPC("Ovor der Große", Klasse_Zauberer)

;*** Am besten packt man sowas in eine Ziel-Suche Funktion oder so:
mage\Target = Orc

NPC_Info(Orc)
NPC_Info(mage)

WaitKey()
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)

Fobsi

BeitragDo, Jun 04, 2009 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den sehr guten Code, hat dich sicher paar Minuten gekostet ! Wink

Naja ich stosse halt an meine Grenzen bei der ganzen Kombination mit den Types, ka warum egentlich ganz einfach nur könnte ich sowas nicht selbst in einen Code fassen oder jedenfals bräuchte ich lange oder würde es garnicht schaffen Mad ! Am besten ich spiel mal bisschen rum mit deinem Code.

lg Fobsi, Danke allen die mir Helfen wollen Exclamation Exclamation Exclamation Surprised
 

Omenaton_2

BeitragFr, Jun 05, 2009 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres :
Zitat:
Ich kann nur empfehlen eure Types, Felder und zugehörigen Funktionen einheitlich und eindeutig zu benennen - und die sinnlose Doppelbennenung wie "NPC.NPC\NPC_X" zu lassen.


Ja, selbstverstänlich werden bei einer Konvertierung von einfachen Variablen in Types Teile der Benennung überflüssig. Ich habe das nur nicht gemacht um den ursprünglichen Poster nicht zu verwirren und damit er seine Variablen gleich wiederfindet. Ich dachte, das würde ihm schon selber auffallen, daß man die Variablennamen nach der Konvertierung optimieren kann.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group