Positionsangaben Cirka-Angaben möglich?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Sereyanne

Betreff: Positionsangaben Cirka-Angaben möglich?

BeitragMi, März 12, 2008 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich würde es gerne in mein Spiel aufnehmen, dass man Gebäude betreten und Personen ansprechen kann. Ist ja eigentlich nicht schwer, so nach dem Motto:
If Player_pos_x=neben der Figur/dem Gebäude then soundso...
Aber: wer kennt ein Spiel, wo man exakt auf X=200 und y=230 stehen muss um eine Person anlabern zu können??? Natürlich kann man bei 2D Personen von 4 Seiten anlabern, und auch nicht von einer exakten Position aus.
Der Code sollte etwa so aussehen:
If Player_pos_x=zwischen 200 und 205
wie geht das?
Freue mich auf hilfreiche Antworten.
Danke im Voraus!

BladeRunner

Moderator

BeitragMi, März 12, 2008 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
> und < sind hier die benötigten Operatoren. Btw: Je nachdem wie die Karte deines Games aufgebaut ist (tiles ?) ist es durchaus üblich fixe werte anzunehmen Wink
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

Sereyanne

BeitragMi, März 12, 2008 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
aaaaah danke mist da hätte ich auch selber drauf kommen können.... Embarassed

AmateurBB

BeitragMi, März 12, 2008 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
If Player_pos_x=zwischen 200 und 205


Ich würde sagen:
Code: [AUSKLAPPEN]
 if Player_pos_x > 199 and Player_pos_x < 206 then


Smile

...wieder einmal eine Antwort, die 1 Minute zu spät kam...
Notebook Medion 97400 | 2 Ghz | 2x ATI Radeon XPRESS 200M (onboard) | Blitz3D 1.86 | Windows 7 / Windows XP | http://www.powerswitch-entertainment.de.vu/

Sereyanne

BeitragMi, März 12, 2008 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Ich würde sagen:
Code: [AUSKLAPPEN]
 if Player_pos_x > 199 and Player_pos_x < 206 then


Smile

...wieder einmal eine Antwort, die 1 Minute zu spät kam...

trotzdem danke!
ich weiß eh noch nicht, wie ich das hinkriege...
if Player_pos_x > 199 and Player_pos_x < 206 then sprungmarke oder gosub sprungmarke oder wie geht das? und wo setz ich die sprungmarke hin? in die funktion oder außerhalb?

BladeRunner

Moderator

BeitragMi, März 12, 2008 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde auf Sprungmarken gänzlich verzichten und alles in Funktionen kapseln.
Und wenn Du es gleich richtig machen willst schreibst Du dir eine Funktion die externe Files einliesst und parst und somit für alle Gespräche verwendbar ist. Sowas alles direkt in den Code zu schreiben ist Selbstmord.

Allerdings muss ich anmerken dass ich glaube dass Du dafür noch nicht erfahren genug bist - vielleicht solltest Du erstmal ein paar kleiner Projekte hinter dich bringen um mit den Basics vertraut und sicher zu werden.
Die Art deiner Fragen lässt erkennen dass Du viele grundlegende Mechanismen noch nicht wirklich verinnerlicht hast.
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

Sereyanne

BeitragMi, März 12, 2008 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Herzlichen Dank für deine Antworten und deine Aufmerksamkeit Wink
Ich habe vor Jahren mal an einem (damals noch teuren) Vtech Basic angefangen. Nur Grafik gabs da noch nicht, daher sind mir viele Befehle logischerweise fremd.

Meine Frage mit der sprungmarke basiert daher, dass ich nicht eine ganze Seite Code einfügen will, nur wenn man bsp. ein Gebäude betritt. Deshalb wollte ich das auslagern in eine Sprungmarke, die nicht mitten im restlichen Code steht. Deine Idee mit dem externen File ist da natürlich prima. Werde mich mal drum kümmern. Cool
 

Dreamora

BeitragMi, März 12, 2008 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür sind Funktionen eigentlich explizit da, dass man funktionalität die immer wieder gebraucht wird an einfache "namen" bindet zum nutzen.

Gosub - Return kann man auch noch brauchen, wird jedoch schwerer zum debuggen.

Aber goto ist effektiv nur als ersatz für exit oder multi-loop exit / continue wirklich zu gebrauchen sonst gibts code der schwer bis garnicht mehr zu verstehen ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Sereyanne

BeitragMi, März 12, 2008 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry jetzt muss ich doch nochmal doof fragen. habe in einem tutorial den befehl include gefunden. was muss ich im include-file reinschreiben? (also im hauptprogramm include "datei.bb")
momentan sieht die include datei zum testen so aus:
If KeyDown (200) And p_x=250 And p_y=290 Then ClsColor 29, 88, 15
Delay 1000
End
wie gesagt nur zum testen. funzt nur nicht. wer kann mir sagen warum nich?

The_Nici

BeitragMi, März 12, 2008 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Include die Datei in deinem Code dort, wo das hinkommen soll.

Sereyanne

BeitragMi, März 12, 2008 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Include die Datei in deinem Code dort, wo das hinkommen soll.

also If KeyDown(200) And 280<pos_x<300 And 240<pos_y<260 Then include datei?

warum geht das nicht:
If KeyDown(200) And 280<pos_x<300 And 240<pos_y<260 Then Print "toll"
egal wo ich stehe, sobald ich hoch drücke kommt "toll". soll es doch gar nicht...

BladeRunner

Moderator

BeitragMi, März 12, 2008 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If KeyDown(200) And 280<pos_x<300 And 240<pos_y<260 Then Print "toll"

->
Code: [AUSKLAPPEN]
if keydown(200) and (pos_x > 279) and (pos_x<300) and ...


immer nur ein Vergleich pro operation, mehr ist nicht.

ql:include setzt anstelle des Befehles den Inhalt der inkludierten Datei.
Und das war definitiv nicht was ich mit "externe Dateien parsen" meinte.
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

Sereyanne

BeitragMi, März 12, 2008 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Und das war definitiv nicht was ich mit "externe Dateien parsen" meinte.

oh sorry. was meintest du dann? hab davon noch nie was gehört.
und nochmals vielen dank dass du dir die zeit nimmst! ich melde mich am Freitag wieder!

The_Nici

BeitragMi, März 12, 2008 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst eine *.txt oder *.whatever-Datei und liest diese dann per ql:ReadFile , ql:ReadLine , ql:CloseFile ein, in der Datei steht dann ein Dialog von einem NPC. Du könntest für jeden NPC z.B. ne Eigene Datei machen, oder du könntest eine "Dialog-Datenbank"-Datei machen, in welcher du alle Dialoge hast und dann zum Entsprechenden Dialog hüpfst wenn er vom Spiel benötigt wird.

MfG

Sereyanne

BeitragMi, März 12, 2008 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
danke. ist aber für das betreten von gebäuden nicht zu gebrauchen, oder?
(jetzt meld ich mich ja doch schon vor freitag wieder Wink )

skey-z

BeitragMi, März 12, 2008 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
du hast bisher noch nicht geschrieben, ob es sich um 2D oder 3D handelt, in 3D kannst du einfach Entitydistance nutzen, für 3D würde ich mir eine Funktion schreiben, die prüft, wie weit die beiden Objekte voneinander entfernt sind (mit Winkelfunktionen), dadurch müsstest du nur die beiden positionswerte übergeben und hast die Entfernung als Rückgabewert.


[Edit]Oh sorry, habe gerade noch mal deinen ersten Beitrag gelesen und da erwähnst du ja, dass es sich zumindest um 2D Personen handelt.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
  • Zuletzt bearbeitet von skey-z am Mi, März 12, 2008 22:06, insgesamt einmal bearbeitet

The_Nici

BeitragMi, März 12, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Sereyanne, mache dir ein eigenes Mapformat. Mache das ganze mit Tiles in einem Array, ist so viel leichter.

Sereyanne

BeitragFr, März 14, 2008 8:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm.... Mapformat? Hab mir nen mapeditor runtergeladen... nur blitz 2d demo liest das glaub ich nich... und davon gibts ja keine vollversion mehr, und 3d hol ich mir erst wenn ich mit 2d klarkomme
Zitat:
in 3D kannst du einfach Entitydistance nutzen, für 3D würde ich mir eine Funktion schreiben, die prüft, wie weit die beiden Objekte voneinander entfernt sind

hast du dich verschrieben? du sagst beidemale was von 3d...

Sereyanne

BeitragFr, März 14, 2008 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@BladeRunner
Jetzt muss ich doch nochmal fragen, wie ich den Code zum Laufen von dir in eine Funktion verpacke. Ich krieg das einfach nicht hin und hab dadurch Probleme mit dem Bildschirmwechsel.
Mein Programm sieht so aus:
Code: [AUSKLAPPEN]
Graphics 640, 480, 32, 3
SetBuffer BackBuffer()
ClsColor 29, 88, 15 ;dunkelgrün
;an der Stelle werden die Grafiken geladen
Global Magier = LoadAnimImage ("Magier5.bmp",32,32,0,12)
MaskImage Magier, 255, 0, 255
Global movetimer = MilliSecs()
Global Score = 0, Lives = -1
Const HOCH = 9, RUNTER = 3, LINKS = 6, RECHTS = 0
Global p_x=290
Global p_y=250
Dim map (20,15)
;Hauptschleife
Repeat
;Die Anzahl der Leben abfragen.
If Lives = -1 Then
   Cls    
   Text 100, 100, "Press F1 to Play"   
   If KeyHit (59) Then    
      Lives = 3         
      score = 0         
   EndIf
   
ElseIf Lives > -1 Then   
   Cls
   If Start = 0 Then    ;Um die Leveldaten neu einzulesen, habe ich eine neue Function erstellt
      Start = 1         ;Diese kann man später erweitern um mehrere Level zu erstellen.
      SetupLevel()
   EndIf

;INPUT - hier kommt dein Code
    moving = False ;steht denn der alte holzmichel noch, ja der steht noch...
    If KeyDown(200) Then
      p_y=p_y-1
        richtung = HOCH
        moving = True ;jetzt lööft er
    EndIf
If map((p_x +16) /32,p_y /32)=0 Then
         p_y = p_y -4
         If p_y =< 0 Then p_y = 1
      EndIf
      Color 0,0,0
      If KeyDown(200) And p_x>280 And p_x<300 And p_y>240 And p_y<260 Then
      Cls
      Delay 2000; nur zum testen ob es überhaupt geht! ich möchte einen bildschirmwechsel ins innere des hauses erreichen
      EndIf
      If KeyDown(208) Then
      p_y=p_y+1
        richtung = RUNTER
        moving = True ;jetzt lööft er
    EndIf
If map((p_x +16) /32,(p_y +32) /32)=0 Then
         p_y = p_y +4
         If p_y => 448 Then p_y = 447
      EndIf
    usw.
   
;ANIMATIONSLOGIK
   ;unverändert
   
   ;BEWEGUNG
 ;unverändert
   EndIf

Color 128,128,128
Rect 292,255,21,224,1
   
   ;OUTPUT
     DrawImage Magier, p_x,p_y,richtung+frame

DrawMap()   ;Karte malen
DrawTut()
Collision()
DrawPoints()
EndIf

Flip   ;Bildschirm tauschen
Cls
Until KeyHit (1)
End

The_Nici

BeitragFr, März 14, 2008 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Lade NIEMALS die Blitz2D Demo runter. Blitz3D kann genauso viel wie Blitz2D und ist weniger verbuggt.

Zum Mapformat solltest du etwas eigeninitiative Zeigen.
Huuch, es gibt keinen Befehl MakeGame(), nun muss man doch ein Spiel machen!

Normalerweise programmiert man sich selber einen Mapeditor und speichert die Daten der Map dann in ein File.

Wenn du ein RPG programmeiren willst solltest du mal die RPG-Tutorials auf Robsite lesen, auch wenn ich sie wegen der fehlenden Formatierung und der Hauptschulrechtschreibung verabscheue, sind sie schon relativ toll für noobs.
  • Zuletzt bearbeitet von The_Nici am Fr, März 14, 2008 19:35, insgesamt 2-mal bearbeitet

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group