Problem bei einem kleinem Tic Tac Toe Spiel!
Übersicht

powerfritzBetreff: Problem bei einem kleinem Tic Tac Toe Spiel! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
... 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group