PlanetSwitch Planet3DS PlanetVita PSP.de PlanetiPhone Classics Forum Handheld-Wiki

PGN-ID:[?] (Nicht eingeloggt)
Login
Registrieren
PlanetDS PlanetGameboy N-Page.de
portablegaming.de  

Zurück   portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung


Development Abteilung Ihr wollt für euren Lieblingshandheld Spiele oder Tools entwickeln?
Bitte die Präfixe benutzen!

Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 02.06.2003, 20:11   #1
 
Registriert seit: 24.05.2003

SnaG hat die Renommee-Anzeige deaktiviert

SnaG eine Nachricht über ICQ schicken
Daumen hoch Selber unterprogramme proggn.. HILFE!!

erstma hi!
jaja ich weiß ich mach viele threads auf aber mich interesiert der GBA halt da ich viele sprachen (lol) kann..

also hab zuerst mal eine putgba funktion gecodet...
diese soll einfach per x,y einen punkt auf dem gba lcd setzen...

Code:
void putgba(int x, int y, int c)
{
  if ((REG_DISPCNT&0x7)==0x0) {}
  if ((REG_DISPCNT&0x7)==0x1) {}
  if ((REG_DISPCNT&0x7)==0x2) {}
  if (((REG_DISPCNT&0x7)==0x3)&&(x<=240)&&(y<=160)) videobuffer[(((y)*240)+(x))]=c;
  if (((REG_DISPCNT&0x7)==0x4)&&(x<=240)&&(y<=160)) videobuffer[(((y)*240)+(x))]=c;
  if (((REG_DISPCNT&0x7)==0x5)&&(x<=160)&&(y<=128)) videobuffer[(((y)*160)+(x))]=c;
}
ist ganz nett funktioniert für mode 3 bis 5 klar.. EASY...

doch dann wollte ich mal linien zeichnen...
naja ich als mathematisch begabter idiot hab mal die ganze funktion einfach hingeschrieben:

Code:
void linegba(int x1, int y1, int x2, int y2, int c)
{
  double k;
  int i,r;

  if((y2-y1)<(x2-x1))
  {
    k=(y2-y1)/(x2-x1);
    for(i=0;i<=(x2-x1);i++)
    {
      r=(int)floor(i*k);		//benützung von r da floor rechenleistung frisst
      if((i*k-r)>0.5) r=r+1;		//abrunden! - aufrunden!
      putgba(x1+i,y1+r,c);		//setzt pixel!
    }
  }
  else
  {
    k=(x2-x1)/(y2-y1);
    for(i=0;i<=(y2-y1);i++)
    {
      r=(int)floor(i*k);		//benützung von r da floor rechenleistung frisst
      if((i*k-r)>0.5) r=r+1;		//abrunden! - aufrunden!
      putgba(x1+r,y1+i,c);		//setzt pixel!
    }
  }
}
jedoch anstatt schrege linien zu zeichen macht er nur waagrecht + senkrecht als ob die variable R immer 0 ist...
WARUM ist das so...

ich hoffe ein guter Coder kann mir da weiterhelfen wie dummer anfänger ETC...

mfg SnaG

PS: achja diese unterprogramme entstammen aus der original "snag.h" und sind daher ein teil von SnaG Industries *g*

EDIT1:
OHHH muss mit den includes ein fehler sein...
da floor() immer 0 ergibt!!
also hab se so includiert oben:

Code:
#include "gba.h"
#include "screenmode.h"
#include <math.h>
so kommen keine kompilierfehler
wenn ich "math.h" mach wimmelt es nur davon
also wo ist da bitte der unterschied???

DANKE

EDIT2:
also die funktion linegba funktioniert im TCPP3
hmm nochwas das ist erst ne BETAVERSION

EDIT3:
hmm noch immer keine antwort und fast 3std schon hier drin
naja kann mir einer sagen ob es überhaupt möglich ist header datein aus tcpp3 zu verwenden und dabei nicht HAM zu benutzen?

EDIT4:
hmm noch immer keine antwort...
bin extra so früh aufgestanden weil ich nun meinen GBA Flash 2 Advanced USB linker bekommen hab...
SnaG ist offline   Mit Zitat antworten
Sponsored Links
Alt 03.06.2003, 09:36   #2
Tom männlich
 
Benutzerbild von Tom
 
Registriert seit: 08.10.2002
Alter: 35

Tom hat die Renommee-Anzeige deaktiviert

Standard

Im allgemeinen sollte man die Finger von math.h lassen, weil die CPU vom GBA keine Gleitkomma-Zahlen unterstützt..
Tom ist offline   Mit Zitat antworten
Alt 03.06.2003, 11:24   #3
ehem. Teammitglied
 
Benutzerbild von Tharo
 
Registriert seit: 02.09.2002
Ort: フランクフルト
Spielt gerade: FF7 Remake

Tharo wird schon bald berühmt werdenTharo wird schon bald berühmt werden

Standard

Eben so ist es. In manchen Fällen ist es wirklich besser auf math.h zu verzichten und lieber solide grundarbeit zu vollrichten.

Ist es zu langsam kann man ja immernoch per ASM optimieren. Ich denke mein Mathematischen Grundfunktionen wird das nicht soo problematisch werden.

Nur eben nervig ^^
__________________
Ney ney ney. So viel Sand und keine Förmchen

Code:
Hey DU! Join uns im PG Discord! https://discord.gg/SVqutfFpTc
Tharo ist offline   Mit Zitat antworten
Alt 03.06.2003, 12:29   #4
 
Registriert seit: 24.05.2003

SnaG hat die Renommee-Anzeige deaktiviert

SnaG eine Nachricht über ICQ schicken
Standard

Zitat:
Original von Tom301185
Im allgemeinen sollte man die Finger von math.h lassen, weil die CPU vom GBA keine Gleitkomma-Zahlen unterstützt..
wie solll ich dann meine linien berechnung durchführen?

EDIT1:
wo finde ich deine mathematischen grundfunktionen @dummer Anfänger
SnaG ist offline   Mit Zitat antworten
Alt 03.06.2003, 12:52   #5
Tom männlich
 
Benutzerbild von Tom
 
Registriert seit: 08.10.2002
Alter: 35

Tom hat die Renommee-Anzeige deaktiviert

Standard

Ich würde es so machen:

Berechne die Steigung in (Erfindung von mir ) probyte.. (Sind Prozent, nur statt mit 100 mit 256)

Also:

punkt1: [x1;y1]
punkt2: [x2;y2]

k256= (y2-y1)*256/(x2-x1) <-- So ist die Steigung auf jeden Fall sehr groß.. dadurch machen rundungsfehler nichts..

Zeichnen:

Code:
for (x=0, x<=(x2-x1), x++)
     {
          y= x*k256;
          y= y<<8;       // sozusagen y=y/256          hardwaresparender..
          putgba(x1+x,y1+y,color);
     };
Tom ist offline   Mit Zitat antworten
Alt 03.06.2003, 12:55   #6
 
Registriert seit: 24.05.2003

SnaG hat die Renommee-Anzeige deaktiviert

SnaG eine Nachricht über ICQ schicken
Standard

verstehe also therätisch kann ich so viel machen wie ich will,
und k256 od, k512 wie auch immer ist ein INT...

ich probiers mal:

EDIT1:
hab doch ned verstanden...

Code:
void linegba(int x1, int y1, int x2, int y2, int c)
{
  int i,r;

  if((y2-y1)<(x2-x1))
  {
    for(i=0;i<=(x2-x1);i++)
    {
      r= i*(y2-y1)/(x2-x1)*256;
      r= r<<8;   
      putgba(x1+i,y1+r,c);		//setzt pixel!
    }
  }
  else
  {
    for(i=0;i<=(y2-y1);i++)
    {
      r= i*(x2-x1)/(y2-y1)*256;
      r= r<<8;   
      putgba(x1+r,y1+i,c);		//setzt pixel!
    }
  }
}
das übergebe ich: linegba(10,10,50,50,0);
naja nun zeichnet er nur einen punkt bei 10,10 und das wars auch...

EDIT2:
es geht!
nur du hast mir << statt >> gesagt deswegne hab ich ja nochmal mit 256 multipliziert
ok super danke
SnaG ist offline   Mit Zitat antworten
Alt 03.06.2003, 13:16   #7
Tom männlich
 
Benutzerbild von Tom
 
Registriert seit: 08.10.2002
Alter: 35

Tom hat die Renommee-Anzeige deaktiviert

Standard

Super

Du solltest die steigung aber besser ausserhalb der for-Schleife berechnen.. Divisionen brauchen mehrere Rechenzyklen und sind deshalb hardware-Fressender.. Das ist auch der Grund warum ich den shift-Operator verwende..
Tom ist offline   Mit Zitat antworten
Alt 03.06.2003, 14:02   #8
 
Registriert seit: 24.05.2003

SnaG hat die Renommee-Anzeige deaktiviert

SnaG eine Nachricht über ICQ schicken
Standard

ok hier das fertige unterprogramm:

Code:
void linegba(int x1, int y1, int x2, int y2, int c)
{
  int i,r,u,k256;
 
  if((x1>=x2)&&(y1>=y2))
  {
    u=x1; x1=x2; x2=u;
    u=y1; y1=y2; y2=u;
  }
  if((y2-y1)<(x2-x1))
  {
    k256=(y2-y1)*256/(x2-x1);
    for(i=0;i<=(x2-x1);i++)
    {
      r= i*k256;
      r= r>>8;   
      putgba(x1+i,y1+r,c);		//setzt pixel!
    }
  }
  else
  {
    k256=(x2-x1)*256/(y2-y1);
    for(i=0;i<=(y2-y1);i++)
    {
      r= i*k256;
      r= r>>8;   
      putgba(x1+r,y1+i,c);		//setzt pixel!
    }
  }
}
wie man hier sieht hab ich noch oben eine ifabfrage gemacht, diese ermöglicht es uns auch von unten nach oben linien zu zeichen -.-

mfg SnaG
SnaG ist offline   Mit Zitat antworten
Alt 03.06.2003, 18:37   #9
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Hi!

Wenn du noch mehr lust auf Linien zeichen hast
Dann sehe dir mal den Bresenham-Algorithmus,
den kann man unter anderem auch zum Linienziehen
nehmen.

Der braucht weder Multiplikation noch Division,
ich habe ihn in vor einiger Zeit mal Assembler für den
GBA geschrieben ( http://www.angelfire.com/droid/goldmomo ).

Mit den fliegen die Linien

mfg goldmomo
goldmomo ist offline   Mit Zitat antworten
Alt 03.06.2003, 21:50   #10
 
Registriert seit: 24.05.2003

SnaG hat die Renommee-Anzeige deaktiviert

SnaG eine Nachricht über ICQ schicken
Standard

hi
jo das bresenham zeug is super hab mir auch schon ne schöne kreis funktion rausgesucht:

Code:
void circlegba(int xk, int yk, int r, int c)
{
	int x = 0;
	int y = r;
	int p = 3 - 2 * r;
	while (x <= y)
	{ 
		putgba(xk + x, yk + y, c);
		putgba(xk - x, yk + y, c);
		putgba(xk + x, yk - y, c);
		putgba(xk - x, yk - y, c);
		putgba(xk + y, yk + x, c);
		putgba(xk - y, yk + x, c);
		putgba(xk + y, yk - x, c);
		putgba(xk - y, yk - x, c);
		if (p < 0)
		{
			p += 4 * x++ + 6;
		}
		else
		{
			p += 4 * (x++ - y--) + 10;
		}
	}
}
leider kann ich noch nicht wirklich asm...

lienen Bresenham hab ich auch gefunden

Code:
void linegba(int x1, int y1, int x2, int y2, int c)
{
	int i, deltax, deltay, numpixels;
	int d, dinc1, dinc2;
	int x, xinc1, xinc2;
	int y, yinc1, yinc2;

	if(x2-x1<0) deltax = x1 - x2;
	else deltax = x2 - x1;
	if(y2-y1<0) deltay = y1 - y2;
	else deltay = y2 - y1;

	if(deltax >= deltay)
	{
		numpixels = deltax + 1;
		d = (2 * deltay) - deltax;
		dinc1 = deltay << 1;
		dinc2 = (deltay - deltax) << 1;
		xinc1 = 1;
		xinc2 = 1;
		yinc1 = 0;
		yinc2 = 1;
	}
	else
	{
		numpixels = deltay + 1;
		d = (2 * deltax) - deltay;
		dinc1 = deltax << 1;
		dinc2 = (deltax - deltay) << 1;
		xinc1 = 0;
		xinc2 = 1;
		yinc1 = 1;
		yinc2 = 1;
	}

	if(x1 > x2)
	{
		xinc1 = -xinc1;
		xinc2 = -xinc2;
	}
	if(y1 > y2)
	{
		yinc1 = -yinc1;
		yinc2 = -yinc2;
	}

	x = x1;
	y = y1;

	for(i = 1; i < numpixels; i++)
	{
		putgba(x, y, c);

		if(d < 0)
		{
			d = d + dinc1;
			x = x + xinc1;
			y = y + yinc1;
		}
		else
		{
			d = d + dinc2;
			x = x + xinc2;
			y = y + yinc2;
		}
	}
}
is besser als mein rechenaufwändiges zeug *g*

EDIT1: (ich hab in dem forum öfter editiert als gepostet
da ich ja so ein freak bin.. gleich eine rahmenfunktion + rahmenfüllfunktion...
Code:
void quadratgba(int x1, int y1, int x2, int y2, int c)
{
  linegba(x1,y1,x1,y2,c);
  linegba(x1,y2,x2,y2,c);
  linegba(x2,y2,x2,y1,c);
  linegba(x2,y1,x1,y1,c);
}

void fullquadratgba(int x1, int y1, int x2, int y2, int c)
{
  int i,delta;
  if(y2-y1<0) delta = y1 - y2;
  else delta = y2 - y1;
  if (x1-x2<=0) for(i=0;i<=delta;i++) linegba(x1,y1+i,x2+1,y1+i,c);
  else for(i=0;i>=-delta;i--) linegba(x1,y1+i,x2-1,y1+i,c);
}
hmm bin gerade am testen eines vollen kreises,
leider macht er noch punkte vom hintergrund hinein
hier könnt ihr mal einen blick draufwerfen:
Code:
void fullcirclegba(int x, int y, int r, int c)
{
  int i;
  for (i=0;i<=r;i++) circlegba(x,y,r-i,c);
}
eigentlich ganz simpel wa? funtzt aber ned sauber LEIDER!

mfg SnaG
SnaG ist offline   Mit Zitat antworten
Alt 03.06.2003, 22:30   #11
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Einige Linienfunktionen, optimieren noch in soweit, dass sie prüfen ob eine Linie Horiz./Verti. ist und zeichenen dann in einer simplen Schleife diese Fälle extra. Man kann aber darüber streiten ob das notwendig ist. Beim GBA bremst wohl eher immer dieses 16Bit read/write Problem im VRAM (bei Mode4 z.B), weiss aber nicht ob der C-Compiler sich darum kümmert.

mfg goldmomo
goldmomo ist offline   Mit Zitat antworten
Alt 04.06.2003, 13:38   #12
 
Registriert seit: 24.05.2003

SnaG hat die Renommee-Anzeige deaktiviert

SnaG eine Nachricht über ICQ schicken
Standard

guck dir mal die
fullquadratgba
funktion an,
die bremmst echt total wenn ich damit den ganzen bildschirm umfärble,
entweder ich mach so eine abfrage beine linegba,
oder ich mach die funktion fullquadratgba direkt (was glaub ich am schnellsten ist (mit putgba))

mfg SnaG
SnaG ist offline   Mit Zitat antworten
Alt 04.06.2003, 14:03   #13
ehem. Teammitglied
 
Benutzerbild von Tharo
 
Registriert seit: 02.09.2002
Ort: フランクフルト
Spielt gerade: FF7 Remake

Tharo wird schon bald berühmt werdenTharo wird schon bald berühmt werden

Standard

Füllen solltest du per dma machen sag ich dir aus erfahrung. Dann geht das recht fix
__________________
Ney ney ney. So viel Sand und keine Förmchen

Code:
Hey DU! Join uns im PG Discord! https://discord.gg/SVqutfFpTc
Tharo ist offline   Mit Zitat antworten
Antwort

  portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Selber bauen [yb3r_R@t Sonstiges (Nintendo DS) 68 28.09.2007 22:33
Handheld selber bauen? sn!per Development Abteilung 26 02.07.2007 17:26
schutzfolie selber machen??!?!? portablezocker@ Sonstiges (Nintendo DS) 2 26.03.2007 15:23
EBOOT's selber machen ???? Krylle Sonstiges (PSP) 13 22.10.2005 23:13
Spiele selber machen? Toad Development Abteilung 17 16.10.2002 09:11


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:31 Uhr.


Powered by vBulletin® Version 3.8.9 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0
Template-Modifikationen durch TMS
PortableGaming.de © bk 2000 - 2010

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231