Du bist nicht angemeldet.

#1 14.04.2014 13:05

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

"Remake of Winzer" - Coding Bereich

Hi,

Im Gegensagtz zum Spielbereich von "Remake of Winzer", soll es hier eher um das Programmieren gehen, was das Projekt betrifft etc.

Kann hier auch ersteinmal allgemein sein ...
Konstruktive Hilfe und Kritik ist ja erwünscht gw_smiley_zwinkern

Speziell kann man dann von hier vielleicht auch spezielle Digidea-Framework Themen erstellen, welche dann gewisse dinge behandeln etc.

gruß
~sushi~

Beitrag geändert von sushiTV (14.04.2014 13:06)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#2 15.04.2014 20:16

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

@Ron

Maus auf ein Bereich begrenzen?

Ich hatte jetzt den gedanken, die Maus an manchen stellen vielleicht begrenzen zu wollen.

Habe mit MOUSEMANAGER.x abfragen und setzen das theoretisch optisch auch hinbekommen. (Obwohl x und y der Mouse ein Field ist kann man direkt dies ansprechen)

Also, ergebniss die Maus (TVT-Mauszeiger) bleibt in dem von mir bestimmten Bereich, aber der "Virtuelle" (System?) Mousezeiger funktioniert trotzdem weiter. Das wollte ich aber so ja nicht tongue

Gibts da eine möglichkeit?

Eine ganz andere Variante wäre eine Art Screenshoot zu benutzen damit die maus keinen einfluss auf das noch sichtbare menü hat *g*

In TVT hast du das ja bei "ESC" und der Abfrage ob das Spiel beendet werden soll ja auch irgendwie gelößt *g* ..... müsste ich mich mal durch den ganzen TVT-Code hangeln, ob ich da finde wie du das da gemacht hast.

hier mal noch Code dazu tongue

Type TScreenEingabe Extends TScreenInGame
	Field _contentArea:TRectangle
	
	Method Init:TScreenInGame(name:String)
		Super.Init(name)
		_contentArea = New TRectangle.Init(300, 300, 400, 200)
		col = 100
		Return Self
	End Method


	Method Update:Int()
		'Super.Update
		Print "Maus setzen wenn x, y abweichend von _contentArea"
		If MOUSEMANAGER.x < _contentArea.GetX() Then MOUSEMANAGER.x = _contentArea.GetX()
		If MOUSEMANAGER.x > (_contentArea.GetX() + _contentArea.GetW() ) Then MOUSEMANAGER.x = (_contentArea.GetX() + _contentArea.GetW() )
		If MOUSEMANAGER.y < _contentArea.GetY() Then MOUSEMANAGER.y = _contentArea.GetY()
		If MOUSEMANAGER.y > (_contentArea.GetY() + _contentArea.GetH() ) Then MOUSEMANAGER.y = (_contentArea.GetY() + _contentArea.GetH() )
	End Method
	
	Method Render:Int()
		'Super.Render
		SetColor (col, col, col)
		SetAlpha 0.5
		DrawRect(_contentArea.GetX(), _contentArea.GetY(), _contentArea.GetW(), _contentArea.GetH() )
		SetAlpha 1.0
		SetColor (255, 255, 255)
	End Method

End Type

Habe das hier zwar von TScrennInGame abgeleitet benutze dann aber nur direkt Render() und Update() in einem Tatsächlichem Screen.

Das Problem ist ja, das sich TScreen ja auch wirklich immer auf den ganzen Screen bezieht?

Man kann das natürlich verschachteln soweit wie ich das nun mitbekommen habe

[TSCreenMain]
- Zeichne/Update Background
   [TScreenMenü von Main]
     - Zeichne/update Wenn Gewünscht das geerbte also Backgound
     - Zeichne/update Menü auf den Background
       [TScreenStuff von TScreenMenü]
         - Zeichne/update wenn Gewünscht das geerbte Background und Menü
         - Zeichne Inhalt

Wenn ich das soweit richtig verstanden habe, aber am ende kommt es ja immer auf den Ganzen Bildschirm?

Nun habe ich ja aber einige interaktionen, also abfragen die ich dann noch machen muss, wieviele Flaschen, Lagerplatz etc. möchte der Spieler kaufen usw. ...

Kann da ja nicht für alles extra TScreens erzeugen? (naja, können schon *g*)

gruß
sushi

Beitrag geändert von sushiTV (15.04.2014 20:22)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#3 15.04.2014 20:30

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Alles was einen eigenen "Bereich" darstellt, kannst Du in einen Screen auslagern ... musst Du aber nicht. Du kannst auch alles in einem Screen machen - und dort bei Render() in Abhaengigkeit irgendwelcher Variablen Dinge zeichnen - oder eben nicht.

"if atMarket then DrawMarket()" etc.


@Mausemanager
Der Mausmanager stellt dir ausgelesene Koordinaten zur Verfuegung. Du kannst "x" und "y" direkt benutzen, da BlitzMax kein "private" unterstuetzt. Die "Getter" haben immer den Vorteil, dass man sie bequem ueberschreiben kann, wenn man das Objekt per "extends" in einem anderen Typ benutzt ("mymousemanager extends tmousemanager").


Anstatt nun ueberall zu versuchen dem MouseManager die "limitierenden" Mouse-Koordinaten beizubringen, kannst Du aber auch

- auf Blitzmax-Art die Maus "limitieren" ( MoveMouse(x,y) )
-> das wuerde aber verhindern, dass man im Fenstermodus mal "nach draussen" geht um was anderes anzuklicken (Musikprogramm oder so)

- eigene Hilfsfunktionen schreiben: "GetLimitedMouseX()" und "GetLimitedMouseY()" - die senden entweder die Limits zurueck, oder die aktuellen Mauskoordinaten.
-> musst halt dann den Mauszeiger nicht mehr bei "MouseManager.x" sondern bei "GetLimitedMouseX()" zeichnen.

Elemente die vom GUI-System verwaltet werden, benutzen natuerlich MouseManager.x (alles andere ergaebe meines Erachtens keinen Sinn).


EDIT: ich frage dich mal noch direkt: warum wird die Maus "limitiert" - sowas macht man ja nur, wenn man mittels "Nord/Sued/West/Ost"-Maus-am-Rand sich bewegen will. Fuer alle anderen Bereiche ignoriert man einfach die Maus, ist sie nicht im eigenen Bereich (THelper.MouseIn() oder THelper.MouseInRect()).


bye
Ron


sigimg2.php?id=1

Offline

#4 15.04.2014 21:08

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

beispiel:

Spieler klickt "Flaschen kaufen" an
dann soll sich eine art "fenster" bzw. eingabefeld öffnen in dem dann der spieler angeben kann wieviele flaschen er kaufen möchte. Dies muss der spieler dann bestädigen oder abbrechen (okay, chancel)

Da das eingabefeld aber auf einem TScreenIngame gezeichnet wird, wird ja auch das linke Menü gezeichnet und dies wäre halt weiterhin anklickbar und so war das von mir nicht gewünscht - zuerst müsste der spieler den Dialog abbrechen ... also am ende muss ein ergebnis welches True oder False ist sich ergeben, erst dann gehts weiter ... *g* - deswegen das limitieren, damit der spieler sich auch nur in dem Dialog bewegen kann ...

gruß
~s~

Nachtrag: aber vielleicht fange ich da nochmal neu an ....
und mache den TScreen aufbau auch nochmal neu und mache es dann doch darüber
würde zwar bedeuten das ich wohl viele TScreens erzeuge, ist dann aber vielleicht übersichtlicher gw_smiley_zwinkern

Beitrag geändert von sushiTV (15.04.2014 21:17)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#5 15.04.2014 21:35

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

So aehnlich loese ich es mit den Modaldialogen (so heisst sowas).

Du kannst es aber auch einfach so machen:

- click Flaschen kaufen
- - Dialog aufmachen
- - Innerhalb der "Updateloop": zuerst Dialog aktualisieren, dann Menues
- - wird ausserhalb des Dialogs geklickt (MouseManager.IsHit(1)) dann MouseManager.ResetKey(1)

alternativ kannst du dir eine "modalDialogueOpen"-Variable anlegen und die entsprechend True/False setzen. Im Menue schaust Du dann nur nach Klicks, wenn die Variable False ist.

Ich wuerde den ersten Ansatz nutzen. Entspricht auch der "Logik":
Updates von "oben nach unten". Renders von "unten nach oben". Heisst: Dialogupdate zu erst, gezeichnet aber zuletzt (deswegen ist es gut, Update und Render getrennt zu haben).


bye
Ron


sigimg2.php?id=1

Offline

#6 16.04.2014 12:24

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Moin Ron gw_smiley_zwinkern

ich hoffe dir geht's besser? nicht den osterhasi anstecken tongue
mal ne Frage noch zur grafikbehandlung speziel TSprite ...

in der *.xml steht:

<?xml version="1.0"?>
<tvt>
	<!-- files needed to display something at all (to avoid "image holder") -->
	<resources directload="true">
		<image name="gfx_mousecursor"				url="res/gfx/interface/cursor.png" cw="32" ch="32" f="3" />
	</resources>
</tvt>

hier dachte ich, das in einer "Variable" gfx_mousecursor das cursor.png geladen wird .... mit f=3 das dieses bild 3 Frames beingaltet und diese sind je 32 pixel breit und hoch (cw, ch)


geladen wird dann mit ...

	registryLoader.LoadFromXML("res/config/startup.xml", True)

benutzt dann in RenderHud ...

	Method RenderHUD:Int()
		'=== DRAW MOUSE CURSOR ===
		'default pointer
		If mouseCursorState = 0 Then GetSpriteFromRegistry("gfx_mousecursor").Draw(MOUSEMANAGER.x - 9, MOUSEMANAGER.y - 2, 0)
		'open hand
		If mouseCursorState = 1 Then GetSpriteFromRegistry("gfx_mousecursor").Draw(MouseManager.x-11, MouseManager.y-8, 1)
		'grabbing hand
		If mouseCursorState = 2 Then GetSpriteFromRegistry("gfx_mousecursor").Draw(MOUSEMANAGER.x - 11, MOUSEMANAGER.y - 16, 2)
	End Method

jetzt dachte ich ja, das hinter dem .Draw(koordinaten, ....
das 0,1 oder 2 für die frames steht?

bei mir ändert sich da aber am mousecursor nix? (in TVT ja schon *g*)

kann  ja auch daran liegen, das ich ja keinen GUImanager direkt benutze etc.?
Insgesamt tue ich mich mit dem Framework wohl recht schwer gw_smiley_zwinkern
(und nachvollziehen und herrausfinden dauert mitunter oder blicke ich hier und da gar nicht tongue)

gruß ~s~

Beitrag geändert von sushiTV (16.04.2014 12:40)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#7 16.04.2014 14:57

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Du hast es vollkommen richtig interpretiert.

das "f" (auch "frames" ist moeglich) definiert die Anzahl an "Unterbildern" (frames). mittels dem letzten Parameter im Draw-Befehl gibt man an, welcher Frame explizit angefordert wird.

In der Demoapp:

mach mal aus

		'=== DRAW MOUSE CURSOR ===
		'default pointer
		If mouseCursorState = 0 Then GetSpriteFromRegistry("gfx_mousecursor").Draw(MouseManager.x-9, MouseManager.y-2, 0)
		'=== DRAW MOUSE CURSOR ===
		mouseCursorState = int(millisecs()/100) mod 3
		'default pointer
		If mouseCursorState = 0 Then GetSpriteFromRegistry("gfx_mousecursor").Draw(MouseManager.x-9, MouseManager.y-2, 0)

Dann sollte sich aller 100ms der Mauszeiger aendern.


Hast Du die Mauszeigergrafik geaendert? Alle Frames muessen in das Bild passen.

Anstatt die Mauszeiger als "animierte" Grafik zu laden, kannst Du natuerlich auch jeden Mauszeiger einzeln aus dem "Spritepack" laden.


		<resource name="gfx_mousecursors">
			<type>SpritePack</type>
 			<url>res/gfx/mousecursors.png</url>
 			<filter>FILTEREDIMAGE,MIPMAPPED</filter>
			<children>
				<child name="gfx_mouseCursor1"					x="0"	y="0"	w="32"	h="32" />
				<child name="gfx_mouseCursor2"					x="32"	y="0"	w="32"	h="32" />
				<child name="gfx_mouseCursor3"					x="64"	y="0"	w="32"	h="32" />
			</children>
		</resource>

Zeichnen dann ohne die "frame"-Angabe im Draw()-Befehl.
GetSpriteFromRegistry("gfx_mousecursor1").Draw(MOUSEMANAGER.x - 9, MOUSEMANAGER.y - 2)


Viele Wege fuehren nach Rom.


Das mit dem Framework: Du lernst die Sprache UND die Eigenheiten des Frameworks - ich denke da tut sich jeder anfangs schwer. Solange Du merkst, dass es immer leichter von der Hand geht, ist alles in Ordnung.

Wenn man den Gesamtueberblick nicht hat, dann ist es mit dem "nachvollziehen" manchmal echt bescheiden - aber du liest ja hier und da den Code, wirst also Momente erleben, wo du meinst "da stand doch mal irgendwo was" - sprich der Lernprozess ist schon voll im Gange biggrin.
Du kannst Dir - und natuerlich auch mir - helfen und kleine "Demoprogramme" schreiben, die bestimmte Dinge des Frameworks nutzen - du lernst was dabei, und ich bekomme paar Beispiele.


Ach die Werte die du beim Zeichnen abziehst - die koennte man mittels "offsetLeft" und "offsetTop" innerhalb der XML schon angeben.


bye
Ron


sigimg2.php?id=1

Offline

#8 17.04.2014 07:19

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Moin,

manchmal ist es doch gut, eine nacht drüber zu schlafen *g*

ich dachte der mousecursorstate wird "automatisch" erzeugt, dabei ist es ja ein Field von TMyApp *g* also muss ich auch für die veränderung des status sorgen.

Habe es mit MOUSEMANAGER.IsDown gemacht gw_smiley_zwinkern

Der hintergrund war, das ich im zuge das ich die Screens alle nochmal neu mache, vielleicht doch auch grafische buttons im menü benutze, und da dachte ich, das sich doch die sprites mit frames für eignen würden für die zustände (normal, hovered, active)

gruß
~s~

Beitrag geändert von sushiTV (17.04.2014 07:24)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#9 17.04.2014 10:04

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Oder du nutzt die TGUIButtons... und gibst ihnen einen eigenen "spriteName" - siehe dem Aufbau der gui.xml

Prinzipiell sind diese nach dem "NinePatch"-Prinzip aufgebaut: jede Grafik wird in 9 Rechtecke aufgeteilt.

A B C
D E F
G H I

Waehrend A, C, G und I "starr" sind, werden die anderen Elemente gezerrt ("skaliert").
D und F - vertikal
B und H - horizontal
E in alle Richtungen.

heisst, dekorative Elemente platziert man in A, C G und I (kleine Weinblaetter die ueber den Rand schauen), die anderen Elemente sollten dannn nur Farbverlaeufe oder aehnliches enthalten - Dinge die man gut skalieren kann.

Damit man nicht immer angeben muss, wie gross nun A-I sind, markiert man B und D mittels einer nebenstehenden schwarzen Linie (also einmal oben und einmal links). Rechts und unten hingegen, markiert man mit einer solchen Linie, wo Inhalt in der Grafik reinpassen koennte (also bei Buttons die Beschriftung).

Warum das ganze? Nun stell dir Vor, du hast einen Button mit 100x20, einen mit 120x35 - willst du die alle neuzeichnen - oder soll sowas gleich "automatisch" funktionieren. Willkommen bei NinePatch (bekannt von Android biggrin). Im Groben und Ganzen ist die NinePatch-Erkennung von Dig die erste in BlitzMax die ich kenne. Hey, was exklusives.


Ok, zurueck zu den TGUIButton:
Die nutzen dann den angegebenen Spritenamen. Entsprechend dem Zustand "active" ("gedrueckt" oder "unten") oder "hover" (maus drueber) kann man dann eigene Sprites automatisch genutzt bekommen: einfach die Sprite definieren (siehe gui.xml).

Du kannst wie in der gui.xml fuer "alle" Buttons einen eigenen Stil kreiieren - und/oder dann fuer individuelle Buttons eigene Sprites (spriteName) festlegen.

Um auf einen Click auf TGUIbutton mit dem Variablennamen "myButton" zu reagieren:

'nur der eine button
EventManager.RegisterListenerFunction("guiobject.onclick", onClickMyButton, mybutton)
'alle buttons vom Typ "TGUIButton"
EventManager.RegisterListenerFunction("guiobject.onclick", onClickMyButton, "TGUIButton")

...
Function onClickMyButton:Int(triggerEvent:TEventBase)
  print "mybutton wurde geklickt"
End Function

Function onClickOnAButton:Int(triggerEvent:TEventBase)
	'cast as button to see if it is a button (or extends from one)
	local button:TGUIButton = TGuiButton(triggerEvent.GetSender())
	'not interested in other widgets
	if not button then return FALSE

	local mouseButton:Int = triggerEvent.GetData().GetInt("button")
	print "a TGUIButton just got clicked with mouse button "+mouseButton
	
	if button = mybutton then print "button was mybutton"
End Function

Wie gesagt: mehrere Wege fuehren nach Rom - manche sind allerdings effizienter (es macht einen Unterschied ob 1000 "Listener" bei jedem Buttonklick eine Funktion aufrufen und mit "false" ignorieren - oder ob 1000 "Listener" nur anspringen, wenn ein spezifischer Button geklickt wird. Gleiches, ob man nur 100 "Listener" nutzt - und diese dann innerhalb ihrer Klickfunktion selber ausfiltern, ob einer der 10 Buttons geklickt worden ist.
Darueber kannst Du Dir aber auch spaeter noch Gedanken machen - falls Du mal an eine Performancegrenze kommen solltest (glaube ich nicht).


@CursorState
Du kannst das mittels "isDown" machen. Den zweiten Mauszustand (die Hand) nutze ich dafuer um anzuzeigen, dass etwas "interaktives" drunter ist. Kann man also beim Hovern von GUIElementen nutzen (einen Listener fuer "hover" festlegen und dann mit der Cursoraenderung drauf reagieren - ausser "IsDown", dann nicht).

bye
Ron


sigimg2.php?id=1

Offline

#10 17.04.2014 10:50

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Hmmm, mal sehen ob ich mich da durchwurschteln kann smile

Nachtrag: also habe mir das jetzt in der demoapp nochmal angeschaut, das mit dem "NinePatch" (noch nie gehört *g*) und der *.xml das habe ich wohl ersteinmal kappiert ... werde dann mal bissel rumprobieren ...

~s~

Beitrag geändert von sushiTV (17.04.2014 11:17)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#11 17.04.2014 12:06

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Den parameter ninePatch="true" in der XML brauchst du nicht -- das ist mit dem aktuellen DIG-Framework nicht mehr noetig. Den FontLoader pack ich demnaechst auch noch online (damit man die Schriften in der XML definieren kann - falls man das modifizierbar machen moechte biggrin).


bye
Ron


sigimg2.php?id=1

Offline

#12 17.04.2014 13:51

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

http://www.workupload.com/file/1xk9KHMq

happy fein, jetzt kann ich schon mal rahmen in beliebiger größe zeichnen gw_smiley_zwinkern
warum nicht gleich so *g*

nun muss ich nur das mit den buttons noch hinbekommen, das wird wahrscheinlich bissel schwieriger, mal sehen.

gruß
~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#13 17.04.2014 15:10

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Die TGUIBackgroundbox... die wuerde ich an deiner Stelle nicht benutzen. Die sind eher fuer GUIObjekte gedacht, die einen eigenen Hintergrund brauchen ("Windows", "Panels" usw.).

Fuer dich reicht ja vollkommen:

bgPanel:TSprite = GetSpriteFromRegistry("spritename")
bgPanel.DrawArea(x,y,w,h)

Der "Missbrauch" der GUI ist da denke ich "overkill".


beim Laden der XML hast Du "true" angegeben - dass heisst, die Ressourcen darin werden sofort geladen (noch vorm Start der "Grafik"). Ich wuerde nur das Laden, was fuer den Startbildschirm notwendig ist ... alles andere ueberlaesst du dann dem ResourceLoader - der laedt das Zeug sobald wie moeglich (also bspweise in der Zeit in der du den Mauscursor zum "Starten"-Button im Hauptmenue fuehrst). Laesst sich aber auch mittels klassischem Ladebildschirm bewerkstelligen (einfach einen "eigenen" Screen dafuer nutzen - der wird als aktiver Screen gesetzt und innerhalb der Update-Methode dieses Screens ueberpruefst du, ob nix mehr zum laden vorliegt - und schaltest dann auf den "Spielscreen").

Wenn Du willst, kann ich auch mal eine Beispielapp mit "Ladescreen" basteln.


bye
Ron


sigimg2.php?id=1

Offline

#14 17.04.2014 15:17

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Demnach kann ich auf jedes Sprite den "NinePatch" anwenden und das macht das framework dann selber?

Ladebildschirm wird wohl ersteinmal nicht so wichtig sein, dann eher wohl etwas zur Stringbehandlung und/oder das ganze mit dem VirtualGraphics (Scalierung) tongue

was die Stringbehandlung angeht, ich hatte jetzt bemerkt das er mit String(Float) den Float zwar umwandelt, das dann aber sogar 3 stellen nach dem komma *g*. Aber ich denke das ich sowieso Zahlenwerte mit Tausenderpunkte darstellen möchte, das ist einfach übersichtlicher. Also es ist noch sehr viel zu tun smile

~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#15 17.04.2014 15:26

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Ich hatte angedacht, dass das Framework automatisch nach ninePatch sucht -- aber das ist bloed (Schriften - oder Grafiken die durch Zufall diese Markierungen besitzen) - lass also das ninePatch="true" in der xml - ist besser so biggrin.

Stringbehandlung.

Fuer das Formatieren von Text brauchst Du eine Hilfsfunktion. Momentan gibt es dafuer noch keinen Code in Dig. Du kannst dir den aber aus "basefunctions.bmx" bei TVTower "leihen" (dort in "TFunctions" - gibt es Sachen fuer eine "Formatierung" von Text).

Ansonsten:

string(float) macht einen "text" aus der Zahl. Wenn Du dich nur fuer X Stellen nach dem "Punkt/Komma" interessierst, suchst Du die Stelle des Punktes/Kommas und erstellst einen neuen String der nur bis Stelle+2 geht (dann ist das ohne Rundung).

Faule nehmen dann natuerlich eher die Hilfsfunktionen die ich oben referenziert habe.


bye
Ron


sigimg2.php?id=1

Offline

#16 17.04.2014 16:08

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Field rahmen:TSprite = GetSpriteFromRegistry("gfx_rahmen")
rahmen.DrawArea(x,y,w,h)

ergibt bei mir aber definitiv nicht das selbe ergebnis wie mit dem panel-missbrauch. die umrandung ist völlig verzerrt, also das "NinePatch" scheint da nicht so zu funzen.

~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#17 19.04.2014 09:20

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

Hast du in der xml die "gfx_rahmen" mit ninePatch="TRUE" angegeben?

Wenn nicht, dann EINMALIG im Code:
rahmen.EnableNinePatch() 'das sucht dann die Markierung bei dieser Sprite und schaltet bei Erfolg den ninePatchModus frei.


PS: Hab das Posting uebersehen.
PPS: UNZ hat 'ne neue indevIDE hochgeladen - falls Du das nutzt.


bye
Ron


sigimg2.php?id=1

Offline

#18 19.04.2014 12:02

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

hey Ron,

um auszuschließen das ich da etwas völlig falsch gemacht habe, würde ich dich bitten das du das TSprite so wie du sagtest (GetSpriteFromRegistry) benutzt als meinen gedachten "rahmen" also einfach als bild auf den Screen aber ebend mit ninepatch ...

das ninePatch=True  war angegeben

denn ich weiss nicht wo da nun der fehler liegen könnte, wenn du sagst, das dies so geht.

gruß ~s~

@indevIDE .... ich benutze diese ja, finde vorallem toll das man ja die TYPES etc. in einer bmx dann auch "einklappen" kann ... wenn ich mehrere davon habe mache ich die, die mich für den moment nicht interessieren einfach zu und der rest bleibt stehen ... das find ich ne gute sache gw_smiley_zwinkern

gruß ~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#19 19.04.2014 12:09

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Frage nebenher,

warum ist der "Trenner" denn Schwarz? früher hat man doch für tranzparentbereiche, als das noch nicht so integriert war in grafiken, gelößt mit so einer fießen pinken farbe .... also einer die sowieso nie auftauchen sollte = TRANSPARENZ ... warum ist der Trenner dann nicht auch in so einer farbe .... ?

das war mir als ich mir das anschaute etwas völlig unlogisch .... weil gerade buttons oder rahmen etc. die man zeichnet haben aussen vielleicht gerade schwarz als rahmen und dann kommt als trenner eine schwarze linie ?

gruß ~s~

Beitrag geändert von sushiTV (19.04.2014 12:10)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#20 19.04.2014 13:41

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

@Rahmen ... Keine Ahnung wieso da schwarz genommen worden ist, da ich aber das Prinzip von "Android" uebernahm, dachte ich, dass es ja nur fair waere die gleiche Farbe zu nutzen.

Im Code wird uebrigens nur geschaut, ob "alpha = 0 " oder nicht. Kannst also gern dein "Pink" (Magenta, R=255,G=255,B=0) nutzen. Meine Bilder haben die Marker eh als Layer, da duerfte ein "einfaerben" nicht so schlimm sein..


Kurz: gab und gibt keinen "Grund", ausser das so zu uebernehmen, wie es bei den Android-Dev-Docs drin war biggrin.


@TSprite

Hier mal eine Render-Methode von deiner rebdemo,die die Sprites aehnlich der GUIBoxen zeichnet (nur halt links davon).

Method Render:Int()
	GetSpriteFromRegistry("gfx_background").Draw(0, 0)

	SetAlpha 0.6
	GetSpriteFromRegistry("gfx_gui_rahmen").DrawArea(50,270, 100,40)
	GetSpriteFromRegistry("gfx_gui_rahmen").DrawArea(50,312, 100,100)
	GetSpriteFromRegistry("gfx_gui_rahmen").DrawArea(50,414, 100,40)
	SetAlpha 1.0

	GUIManager.Draw(Self.name)
	willkommenstext()
	LogoDraw()
EndMethod

bye
Ron


sigimg2.php?id=1

Offline

#21 20.04.2014 11:25

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

Ronny schrieb:

Im Code wird uebrigens nur geschaut, ob "alpha = 0 " oder nicht. Kannst also gern dein "Pink" (Magenta, R=255,G=255,B=0) nutzen. Meine Bilder haben die Marker eh als Layer, da duerfte ein "einfaerben" nicht so schlimm sein..

du bist manchmal auch echt lustig smile
ich dachte ja das nach schwarz geschaut wird ... zu was dann der trenner?
das verstehe ich dann jetzt so nicht wirklich tongue

da ich ja eh die koordiniaten angebe, welche das zu ladende image innerhalb eines png sein soll, ist doch gar kein trenner nötig?

naja ...
rest checke ich dann mal später ...

~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#22 20.04.2014 13:43

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

MEINE Bilder = Dateien die nicht im PNG-Format sind. Die Dateien vom Bildbearbeitungsprogramm haben dann also "Layer" damit ich bequemer kopieren/verschieben usw kann.

Der "Marker" ist ein Nicht-Alpha-0-Bereich links,oben,unten,rechts.


bye
Ron


sigimg2.php?id=1

Offline

#23 28.04.2014 18:20

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: "Remake of Winzer" - Coding Bereich

witzig ....

ich habe ein Field erstellt in TScreen:

Field rahmen:TSprite = GetSpriteFromRegistry("gfx_rahmen")

und dann in Render:

rahmen.DrawArea(50, 150, 100, 200)

ich glaube so hattest du es ja auch gesagt und es wäre auch "kürzer" von dem Quelltext her .... nur so funzt es nicht tongue

GetSpriteFromRegistry("gfx_gui_rahmen").DrawArea(50,270, 100,40)

funktioniert aber! (also das ninepatch funzt dann auch)

*g*
~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#24 28.04.2014 21:40

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: "Remake of Winzer" - Coding Bereich

GetSpriteFromRegistry("gfx_rahmen")

kontra

GetSpriteFromRegistry("gfx_gui_rahmen").DrawArea(50,270, 100,40)

Ich denke, fuer "gfx_rahmen" hast du in der XML nichts stehen wie
ninepatch="true"


bye
Ron


sigimg2.php?id=1

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Bist Du ein Mensch oder ein Roboter ?

Verifizierung, dass diese Aktion durch eine reale Person vorgenommen wird und nicht von einem Programm.