Problem bei einem kleinem Tic Tac Toe Spiel!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

powerfritz

Betreff: Problem bei einem kleinem Tic Tac Toe Spiel!

BeitragSa, Jun 16, 2007 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich bins wieder,

ich hab ein kleines Problem bei einem Tic-Tac-Toe spiel. also, ich hab ein spielgitter gemacht und 9 leere bilder (das sind dann die felder wo die X und Os draufkommen) richtig reingemalt. Dann habe ich einfach gemacht, dass ein winziges 1x1 großes bild den mauszeiger die ganze zeit verfolgt, und wenn es über eins von den 9 leeren bildern fährt, mit imagescollide eben ein X gemalt wird (aber halt nur solange die maus drüber fährt). Jetzt habe ich in der If-Bedingung eben noch eine if bedingung gemacht, in der geprüft wird, ob die maus egdrückt wird. wenn ja, dann wird das bild über eine repeat schleife (es muss leider über eine repeat schleife passieren, da ich in einer schleife ein cls habe) dauerhaft gemalt wird. danach kann ich aber leider nix andres mehr machen...

Hat wer ne idee, wie ich machen kann, dass das bild dauerhaft da bleibt und ned von cls gelöscht wird, oder wie ich das ganze ohne einem cls machen kann? kann man ned irgendwie cls verwenden und trotzdem manche bilder erhalten bleiben lassen, also mit dem buffersystem da? aber ich find einfach keine lösung Sad

Hier ist der Code zur Hilfe:

Code: [AUSKLAPPEN]
Graphics 366,366,16


;Variablen der Grafiken (ich hab sicherheitshalber alle 9 felder so gemacht)
gitter = LoadImage("images/gitter.png")
feld = LoadImage("images/Hintergrund.png")
feld2 = LoadImage("images/Hintergrund.png")
feld3 = LoadImage("images/Hintergrund.png")
feld4 = LoadImage("images/Hintergrund.png")
feld5 = LoadImage("images/Hintergrund.png")
feld6 = LoadImage("images/Hintergrund.png")
feld7 = LoadImage("images/Hintergrund.png")
feld8 = LoadImage("images/Hintergrund.png")
feld9 = LoadImage("images/Hintergrund.png")
mX=MouseX()
mY=MouseY()
X = LoadImage("images/X.png")
O = LoadImage("images/O.png")
maus = LoadImage("images/maus.png") ;das kleine 1x1 bild für imagecollide
counter = 0

;die funktion funzt zwar, ich verwend sie aber ned..
;Function Zeichenmalen(zeichen,feldname,countername,x,y)
;If ImagesCollide(maus,MouseX(),MouseY(),0,feldname,x,y,0) Then
 ;DrawImage (zeichen,x,y,0)
 ;If MouseDown(1) Then
  ;countername = 1
  ;Repeat
  ;DrawImage zeichen,x,y,0
  ;Until countername = 0
 ;Else countername = 0
 ;EndIf
;EndIf
;End Function

SetBuffer BackBuffer()
Repeat ;Die Schleife würd ich gerne loswerden... weil ich alles da reinbringen muss..
Cls ;und DAS stört mich am meisten, das es alle probleme bereitet und alles löscht
DrawImage maus,MouseX()+2,MouseY()+5,0
TileImage gitter,0,0,0
DrawImage feld,0,0,0
DrawImage feld2,133,0,0
DrawImage feld3,133,266,0
DrawImage feld4,266,0,0
DrawImage feld5,0,133,0
DrawImage feld6,0,266,0
DrawImage feld7,133,133,0
DrawImage feld8,266,133,0
DrawImage feld9,266,266,0

;hier jetz die ifs

If ImagesCollide(maus,MouseX(),MouseY(),0,feld,0,0,0) Then
 DrawImage (X,0,0,0)
 If MouseDown(1) Then
  counter = 1
 
  DrawImage X,0,0,0
 Else counter = 0
 EndIf
EndIf

;das 2. ...

If ImagesCollide(maus,MouseX(),MouseY(),0,feld2,133,0,0) Then
 DrawImage (X,133,0,0)
 If MouseDown(1) Then
  counter2 = 1
 
  DrawImage X,133,0,0
 
 Else counter2 = 0
 EndIf
EndIf

;3..

If ImagesCollide(maus,MouseX(),MouseY(),0,feld3,133,266,0) Then
 DrawImage (X,133,266,0)
EndIf

;usw..

If ImagesCollide(maus,MouseX(),MouseY(),0,feld4,266,0,0) Then
 DrawImage (X,266,0,0)
EndIf

If ImagesCollide(maus,MouseX(),MouseY(),0,feld5,0,133,0) Then
 DrawImage (X,0,133,0)
EndIf

If ImagesCollide(maus,MouseX(),MouseY(),0,feld6,0,266,0) Then
 DrawImage (X,0,266,0)
EndIf

If ImagesCollide(maus,MouseX(),MouseY(),0,feld7,133,133,0) Then
 DrawImage (X,133,133,0)
EndIf

If ImagesCollide(maus,MouseX(),MouseY(),0,feld8,266,133,0) Then
 DrawImage (X,266,133,0)
EndIf

If ImagesCollide(maus,MouseX(),MouseY(),0,feld9,266,266,0) Then
 DrawImage (X,266,266,0)
EndIf

Flip ;wozu is des da?
Forever


WaitKey


Bin für jede Hilfe mehr als dankbar!!

Eingeproggt

BeitragSa, Jun 16, 2007 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Meine Meinung:
Vereinfache das ganze mal. Du musst das hintergrundbild nicht 9mal laden. Einmal laden und immer dasselbe Bild an verschiedene Koordinaten zeichnen geht auch.
Die Collissionsabfragen könnten auch so vereinfacht werden.

Meine Antwort:
Mit SetBuffer BackBuffer() sagst du dem PC, er soll im Hintergrund malen, also für den Benutzer unsichtbar. Beim Aufruf von Flip wird alles auf einmal sichtbar. Das vermeidet Bildflimmern.

Meine Zusammenfassung:
Ich bin heut gut drauf, deshalb die Hilfe. Es kann dir aber passieren, dass jemand meckert "das solltest du schon lang wissen, wenn du auf www.blitzbase.de schaust."
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

mas93

BeitragSa, Jun 16, 2007 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde die X und Os einfach mit types erstellen.
Is viel einfacher und geht schneller
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

BladeRunner

Moderator

BeitragSa, Jun 16, 2007 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Types sind hier völlig überdimensioniert- Du kennst die Anzahl an Feldern, diese bleibt immer gleich, also ist eine dynamische Liste nicht nötig. Ein Array tut es hier vollkommen.
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
 

Lador

BeitragSa, Jun 16, 2007 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Zitat:
If ImagesCollide(maus,MouseX(),MouseY(),0,feld,0,0,0) Then
DrawImage (X,0,0,0)
If MouseDown(1) Then
counter = 1

DrawImage X,0,0,0
Else counter = 0
EndIf
EndIf

;das 2. ...

If ImagesCollide(maus,MouseX(),MouseY(),0,feld2,133,0,0) Then
DrawImage (X,133,0,0)
If MouseDown(1) Then
counter2 = 1

DrawImage X,133,0,0

Else counter2 = 0
EndIf
EndIf


Ähm...soweit ich weiß, kann man MouseDown() nur einmal pro Schleifendurchlauf verwenden, du müsstest das also:

Code: [AUSKLAPPEN]

If MouseDown(1) Then
 If ImagesCollide(maus,MouseX(),MouseY(),0,feld,0,0,0) Then
  DrawImage (X,0,0,0)
  counter = 1
 
   DrawImage X,0,0,0
  Else counter = 0
  EndIf

;das 2. ...

 If ImagesCollide(maus,MouseX(),MouseY(),0,feld2,133,0,0) Then
  DrawImage (X,133,0,0)
  counter2 = 1
 
  DrawImage X,133,0,0
 
  Else counter2 = 0
  EndIf
 EndIf
EndIf


...so machen, wenn ich den Code richtig verstanden habe.

MFG Lador
 

powerfritz

BeitragSa, Jun 16, 2007 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Lador: Naja, wenn ichs auf deine Methode mache, dann erscheint das X und die collidierung erfolgt erst dann wenn ich die Maus drücke...

@Eingeproggt: joah habs vereinfacht...

aber hat nun wer ne idee wie ichs mach, dass wenn ich klicke das X dann auch dort weiterhin bleibt? bis jetzt isses nur da wenn man über einem der felder is...
 

Lador

BeitragSa, Jun 16, 2007 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ähm...soweit ich weiß, kann man MouseDown() nur einmal pro Schleifendurchlauf verwenden


Ok, wie ich schrieb: "wenn ich den Code richtig verstanden habe". Aber du MUSST MouseDown() vor die Kollisionsabfragen setzen, sonst wird nur die erste Kollision bei dir klappen!

MFG Lador
 

$tankY

BeitragSo, Jun 17, 2007 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
... Das ist nur bei MouseHit() so, MouseDown() kannst du so oft verwenden, wie du Lust hast!
Zu deiner Frage mit den Bildern:
Ich würde - wie schon bereits erwähnt - ein Array nehmen (dim Feld(2,2)) und dann mit einer For-Schleife und If-Abfragen schauen, welche Bilder angezeigt werden sollen:
Code: [AUSKLAPPEN]
For i = 0 To 2
  For j = 0 To 2
    If Feld(i,j) = 1 Then
      DrawImage X_Img, i * 20, j * 20
    ElseIf Feld(i,j) = 2 Then
      DrawImage O_Img, i * 20, j * 20
    EndIf
  Next
Next

Und den Code zwischen dein Cls und Flip einbauen.
Du musst dann halt, wenn ein Spieler auf ein Feld klickt, das Feld-Array entsprechend anpassen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group