Hallo, das ist Hokkaido von Studenten. Grundsätzlich habe ich ein wenig Entwicklungserfahrung mit Android und die Sprachen, die ich verwenden kann, sind Java und C #. Vielen Dank. Als ich versuchte, so etwas wie RPG auf Android zu erstellen, blieb ich bei der Methode stecken, Text Zeichen für Zeichen in SurfaceView anzuzeigen, also werde ich es schreiben, damit ich es nicht vergesse. Ich denke, es gibt viele Fehler, aber bitte vergib mir.
――Ideal für Dinge, die Zeichnungsleistung erfordern, wie Animationen und Spiele, komplizierte Grafiken und Zeichnungsinhalte, die ständig aktualisiert werden.
Erstellen Sie eine Klasse für Grafiken und fügen Sie Zeichenanweisungen ein.
Graphics.java
//Konstrukteur
public Graphics(int w, int h, SurfaceHolder holder) {
this.holder = holder;
this.holder.setFormat(PixelFormat.RGBA_8888);
this.holder.setFixedSize(w, h);
paint = new Paint();
paint.setAntiAlias(true);
}
public Canvas getCanvas() {
return canvas;
}
//Sperren
public void lock() {
canvas = holder.lockCanvas();
if (canvas == null) return;
canvas.translate(originX, originY);
}
//Freischalten
public void unlock() {
if (canvas == null) return;
holder.unlockCanvasAndPost(canvas);
}
//Angabe des Zeichnungsursprungs
public void setOrigin(int x, int y) {
originX = x;
originY = y;
}
//Holen Sie sich die X-Koordinate des Zeichnungsursprungs
public int getOriginX() {
return originX;
}
//Ermitteln Sie die Y-Koordinate des Zeichnungsursprungs
public int getOriginY() {
return originY;
}
//Farbspezifikation
public void setColor(int color) {
paint.setColor(color);
}
//Geben Sie die Schriftgröße an
public void setTextSize(int fontSize) {
paint.setTextSize(fontSize);
}
//Holen Sie sich Schriftmetriken
public Paint.FontMetrics getFontMetrics() {
return paint.getFontMetrics();
}
//Zeichenbreite abrufen
public int measureText(String string) {
return (int)paint.measureText(string);
}
//Zeichnen eines gefüllten Rechtecks
public void fillRect(int x, int y, int w, int h) {
if (canvas == null) return;
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(new Rect(x, y, x+w, y+h), paint);
}
//Bitmap-Zeichnung
public void drawBitmap(Bitmap bitmap, int x, int y) {
if (canvas == null) return;
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Rect src = new Rect(0, 0, w, h);
Rect dst = new Rect(x, y, x+w, y+h);
canvas.drawBitmap(bitmap, src, dst, null);
}
//Bitmap-Zeichnung
public void drawBitmap(Bitmap bitmap, Rect src, Rect dst) {
if (canvas == null) return;
canvas.drawBitmap(bitmap, src, dst, null);
}
//Zeichne eine Schnur
public void drawText(String string, int x, int y) {
if (canvas == null) return;
canvas.drawText(string, x, y, paint);
}
Erstellen Sie dann eine Klasse, die SurfaceView erbt, und legen Sie sie in Aktivität fest. (Es wird etwas länger dauern)
IndexActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new RPGView(this, storyNum));
}
RPGView.java
public RPGView(Activity activity, int story) {
super(activity);
holder = getHolder();
holder.addCallback(this);
//Grafikgenerierung
g = new Graphics(dw, H, holder);
g.setOrigin((dw - W) / 2, 0);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
thread = null;
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
thread = new Thread(this);
thread.start();
}
@Override
public void run() {
while (thread != null) {
//Programmieren Sie hier den Hauptschleifen-Zeichenprozess
//schlafen
key = KEY_NONE;
sleep(200);
}
}
Danach schreibe ich den Zeichenvorgang in die Hauptschleife des Threads. (Was machst du?)
Die Ansicht wird jedes Mal im SurfaceView-Thread aktualisiert, daher habe ich die Zeichenfolge zeichenweise hinzugefügt und es hat funktioniert.
RPGView.java
//Zeichnen des Dialogbildschirms
private void talk(String message, Bitmap bitmap, String who) {
int color = Color.rgb(0, 0, 0);
if (bitmap != null) {
g.lock();
g.setColor(color);
g.fillRect(0, 0, W, H);
g.getCanvas().translate(0, 0);
g.fillRect(0, 0, realX, realY);
g.getCanvas().translate((dspW - W) / 2, 0);
g.drawBitmap(bitmap, 0, 0);
g.setColor(Color.rgb(255, 255, 255));
g.fillRect((W - 504) / 2, H - 122, 504, 104);
g.setColor(color);
g.fillRect((W - 500) / 2, H - 120, 500, 100);
//Brechen Sie die Linie des TODO-Charakters! !! !! !!
g.setColor(Color.rgb(255, 255, 255));
g.setTextSize(25);
if (message.length() > 18) {
String message1 = message.substring(0, 18);
String message2 = message.substring(18);
g.drawText(message1, (W - 500) / 2 + 25, 370 - (int) g.getFontMetrics().top);
g.drawText(message2, (W - 500) / 2 + 10, 410 - (int) g.getFontMetrics().top);
} else {
g.drawText(message,
(W - 500) / 2 + 25, 370 - (int) g.getFontMetrics().top);
}
g.unlock();
}
}
Wenn Sie diese Methode aus der Schleife aufrufen und den Text mit einem weiteren Zeichen übergeben ...
RPGView.java
String text = "AIUEO";
if (moji_count == text.length() || moji_count == 9999) {
talk(text, background, null);
moji_count = 9999;
} else {
talk(text.substring(0, moji_count), background, null);
moji_count++;
}
Ich konnte es Charakter für Charakter tun. Sie können es mit genau der richtigen Geschwindigkeit anzeigen, indem Sie es für kurze Zeit in den Ruhezustand versetzen.
Recommended Posts