Return to Phobos

Moderator: Rockford

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 57 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

....
die letzten Tage habe ich wieder an der Explosion und speziell heute an den Schüssen rumgebastelt...
Ziele sind folgende:
1. Die Explosion muss noch genauer werden - hier sind noch Fehler bei der genauen Erkennung der Position der Items und eigentlich sollen die Explosionen auch während des Scrolling fortwährend laufen und nicht direkt komplett, was ja immer einen kleinen Stopp bedeutet.
2. Ich habe das blinken umgebaut und überwiegend aus dem VBI rausgeholt - funktioniert ganz gut - und habe jetzt 4 Schüsse zur Verfügung.
Diese sollen im Wechsel rechts und links laufen und auch durchaus gleichzeitig. Das ganze muss so gestaltet werden, daß auch hier der VBI entlastet wird, da ich ihn noch für Sound brauche.

zu 1: Das habe ich leider noch nicht hinbekommen. Die momentane Idee ist folgende: Ich brauche 12 Charakter für die Explosion und habe 4 Animationsphasen. Die lasse ich ständig laufen im Hintergrund und bei einem Treffer werden die 12 Charakter fürs Item mit den 12 Charaktern der Explosion überschrieben - das Scrolling geht dann automatisch weiter und ich muss mich nicht ums Timing kümmern. Da können dann auch mehrere Explosionen nebeneinander laufen - Problem ist dann nur der Start-/ und Endpunkt der Explosion.... dafür habe ich noch keine Lösung!

zu 2: Ich habe heute die Schüsse komplett umgebaut. Die Joystickabfrage (Strig0) und das Setzen der benötigten Parameter für den jeweiligen Schuss kann ich im Hauptprogramm machen - mache ich redundant im Feinscroll und an anderen Stellen. Aber die eigentliche Bewegung des Schusses geht quasi nur im VBI da sonst der Schuss viel zu langsam ist... und hier bekomme ich wieder ein Zeit- und Kapazitätsproblem im VBI. Ein Schuss kein Problem, 2 Schüsse geht auch noch ist aber tricky, 4 Schüsse unabhängig ... puh... da steigt mir der VBI aus. Da habe ich einfach zu viele Bedingungen und Abfragen.... das muss doch einfach und schlank gehen !!!!!
Meine letzte Idee ist nun folgende: Alle 4 Schüsse laufen ständig unabhängig mit einer relativ schlanken Routine ständig im Hintergrund im VBI von oben nach unten durch - kommt dann der Impuls (durch Strig0) für einen Schuss, verändere ich einfach die x und y- Parameter für den jeweiligen Schuss und er wird sichtbar (x) und startet in Höhe Abschuss vom Raumschiff (y).
Das will ich jetzt mal die Tage umsetzen...

Vielleicht hat ja jemand für beide Probleme auch die zündende und bessere Idee wie man es am besten macht, denn wenn ich mir die ganzen Spiele so anschaue, muss das doch eigentlich ganz easy sein!
Grüße
Peter

Benutzeravatar
Kveldulfur
Beiträge: 209
Registriert: 17.08.2021 02:32
Has thanked: 62 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Ich habe so eine Routine für Missiles zwar noch nicht geschrieben, stelle es mir aber wie folgt vor:

Code: Alles auswählen

missile	.byte $00, $00, $00, $00 	; vier Schüsse
..
..
..
	.proc Schuessebewegen
	ldy $00
lp	ldx missile,y				; Lade Y-Position Schuss 0-3
	cpx #$00					
	bne mv					; Wenn ungleich 0 muss der Missile bewegt werden
nx	iny					; Schussnr. hochzählen
	cpy #$04				; max. 4 sind vorhanden
	bne lp					; Wenn der letzte Schuss noch nicht bearbeitet, zurück
	rts					; Unterroutine für Schüsse beendet
	
mv	tya					; y retten
	pha					; Unterroutine um den Schuss einen Schritt zu bewegen
      ..
      ..
      ..
	pla					; y zurück holen
	tay
	jmp nx					; nächsten Schuss bearbeiten
	.end


Wenn nun im Hauptprogramm festgestellt wird, dass geschossen wurde, bereitet man einen freien Missile vor, indem man ihn an die richtige Position setzt und setzt sta missile,x auf den y-Wert des Schusses. Die Routine erkennt nun dass der Missile bewegt werden muss.
Man kann im Hauptprogramm die Kollision abfragen und dann auswerten."missile" sollte auf 0 gesetzt werden, wenn der Schuss den untern Rand erreicht hat oder ein Treffer erfolgte.

Ich hoffe Du kannst meinen Gedanken folgen und es hilft Dir weiter.

Janko

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 57 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Hallo Janko und vielen Dank für deinen kreativen Lösungsansatz!
So ähnlich wie du es schreibst, habe ich es auch jetzt vor!
Allerdings möchte ich so wenig Abfragen und Bedingungen in die Missileroutine im VBI reinpacken wie möglich.
Rein theoretisch sollte es ja zu 4 Schüssen gleichzeitig kommen können, daher muss der VBI das auch zeitlich abarbeiten können - sonst macht es keinen Sinn. Dann kann das aber auch ständig im Hintergrund laufen und ich mache es nur jeweils (durch x-Positionierung) sichtbar.
Also alle 4 Missiles laufen ständig vom Bildschirmoberrand zum Unterrand - wenn der Unterrand erreicht wird, dann startet der Missile wieder von oben. Die X-Position wird auf 0 gesetzt - also sieht man die Missiles primär nicht. Die Joystickabfrage läuft im Hauptprogramm (das packe ich in die Feinscrollroutine, da ich hier noch Zeit habe und eh mit einer Warteschleife verzögern muss) - sobald der Feuerknopf gedrückt wurde kommt der entsprechende Werte in die y-Position und x-Position des jeweiligen Missile und er wird sichtbar. Läuft er nach ganz unten oder an den Boarderrand geht x auf Null und der Missile wird wieder unsichtbar - passiert eine Kollision mit einem Item startet die Explosionsroutine. Entsprechend läuft das mit den anderen drei Missiles....

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 57 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... hier nun das erste Ergebnis:

Ich habe zunächst ein Missile umgesetzt. Die Routine im VBI sieht. nun extrem abgespeckt so aus:
rtp2bild.jpg
Alles andere läuft im Hauptprogramm. Die Joystickabfrage für den Schuss und das Setzen der Parameter.
Ich habe den Schuss zur Kontrolle noch sichtbar am linken Bildrand mitlaufen lassen und man sieht im Video sehr schön, daß der Schuss ständig läuft und wegen des schlanken Codes den VBI praktisch gar nicht belastet. Drückt man den Feuerknopf, wird die Position auf x und y verändert und der Schuss wird sichtbar bis der untere Rand erreicht ist - dann geht die x Position wieder auf den hier noch gerade sichtbaren Bereich am linken Rand. Beim finalen Spiel wandert der dann natürlich ganz raus. Es sind noch ein paar Fehler drin und die Kollisionsabfrage muss noch rein!
Außerdem muss noch eine intelligente Steuerung der 4 Schüsse rein, die einmal abgefeuert ja bis nach unten oder bis zur Kollision durchlaufen müssen.
Hier das kurze Video:#
rtp2video.MOV
(1.8 MiB) 32-mal heruntergeladen
Peter

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 57 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Heute habe ich an den Schüssen gearbeitet und alle 4 Schüsse funktionieren jetzt gut. Der Hauptcode liegt im Hauptprogramm und der VBI ist schlank und wenig belastet. Leider habe ich schon das nächste massive Problem...
Aber hier erstmal der Code vom VBI und vom Hauptprogramm:

Code: Alles auswählen

;@com.wudsn.ide.asm.mainsourcefile=r2phobos.asm


								;vertical blank interrupt fr Joystick / PM

	.proc vbinter			
			pha
			txa
			pha
			tya
			pha
			mva #0 atract		;Bildschirmschoner aus
			
			clc					;Kollisionen abfragen
			lda p0pf
			cmp #1
			bcc @+
			mva #1 kollp0
@			
			clc					;Joystickabfragen Player1
			lda stick0
			cmp #15				;keine Joystickaktion
			bcs @+
			cmp #14
			bcs nachob
			cmp #13
			bcs nachun
			cmp #11
			bcs nachli
			cmp #10
			bcs nachliob
			cmp #9
			bcs nachliun
			sec
			cmp #7
			bcs nachre
			cmp #6
			bcs nachreob
			cmp #5
			bcs nachreun
@			jmp write
nachre		clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp write
nachreun
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp nachun
nachreob
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp nachob
nachli		sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp write
nachliun
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp nachun
nachliob
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp nachob
nachob
			dec yposp1
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			jmp write
nachun
			inc yposp1
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			jmp write
			clc
write		sec
			lda xposp1 					;x-Position der Player setzen
			sta hposp0
			sbc #0
			sta hposp2
			adc #2
			sta hposp3
	
			ldy yposp1					;Player printen
			clc
			lda blink
			tax
			dey
			mva #0 lms2						
@			lda pm41,x
			sta (play4),y
			lda pm42,x
			sta (play3),y
			iny
			inx
			inc lms2
			lda lms2
			cmp #14
			bne @-
										;Schüsse laufen ständig 
						
			jsr schuesse
			mva m0pf kollm1
			mva m1pf kollm2
			mva m2pf kollm3
			mva m3pf kollm4
			mva #1 hitclr
			
			;-------------------------------------------------------------
			
			
			pla
			tay
			pla
			tax
			pla
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!
	
	
			
	
	
	.endp

Code: Alles auswählen

			org $2000

			icl '../hardware.txt'
			icl 'header.txt'
			icl 'character.asm'
			icl 'lands.asm'	
        
	.proc dlist
		   	.by 112,112,112,100
			.by 30,75
:21			.by 36
:5			.by 4
			.by 65
			.wo dlist
	.endp


			icl 'pmg_vars.asm'
			
			.proc main
			
main1		mwa #dlist 560  
			mva #10 yposp1
			mva #120 xposp1
			mva #42 yposm1
			mva #0 xposm1
			mva #94 yposm2
			mva #49 xposm2
			mva #0 tank1x
			mva #0 tank1y
			mva #151 fuelzaehleritem
			mva #0 fuelzaehler
			jsr text
						
Start1		mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 
			mva #12 color3	;Schriftfarbe	
			mva #220 color1	;Gelb
			mva #153 color0	;Blau
			;mva #52 color0	;Rot
			mva #180 color2	; Grün
			mva #0 color4 ;Hintergrundfarbe
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1 \ sta feuer6
						
			; Player vorbereiten und initialisieren
			; Kollisionen:  4 = Grün   2 = Gelb
			lda ramtop
			sec
			sbc #16
			sta pmbase
			clc
			adc #3
			sta miss1+1						
			sta miss2+1
			sta miss3+1
			sta miss4+1
			adc #1
			sta play1+1
			adc #2
			sta play3+1
			adc #1
			sta play4+1
			lda #9
			sta play4
			lda #3
			sta play3
			
			mva #62 sdmctl
			mva #56 pcolr0
			mva #15 pcolr1
			mva #119 pcolr2
			mva #191 pcolr3
			mva #1 gprior
			mva #3 gractl
			mva #1 sizep0
			mva #1 sizep1
			mva #1 sizep2
			mva #0 sizem
			mva #0 rechts
			mva #2 hitclr
			mva #48 blink
			mva #40 p1pf
			mva #8 hposm0
			mva #8 hposm1
			mva #8 hposm2
			mva #8 hposm3
			mva #1 yschuss1
			mva #11 yschuss2
			mva #22 yschuss3
			mva #33 yschuss4
			mva #1 schussi

main2		mva <lands var6
			mva >lands var6+1
			mva #0 kollp0
			ldy #255				;Speicher Player 1 leeren
			lda #0
			sta play1
@			sta (play1),y
			sta (play4),y
			sta (play3),y
			dey
			bpl @-
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			clc
			ldy #0
			ldx #0
			
			
			ldx #>vbinter			;VB-Interrupt VektorHi
			ldy #<vbinter			;VB-Interrupt VektorLo
			lda #7					;Deferred Mode mit lda #7 festlegen
			jsr setvbv				;Vektor für die eigene Routine über setvbv eintragen
			
									
hauptprogramm
			
			
			
			
			#if .byte yschuss1>#207 .or .byte kollm1=#4
			ldy yschuss1
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm0
			mva #1 hitclr
			#end
			#if .byte yschuss2>#207 .or .byte kollm2=#4
			ldy yschuss2
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm1
			mva #1 hitclr
			#end
			#if .byte yschuss3>#207 .or .byte kollm3=#4
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm2
			mva #1 hitclr
			#end
			#if .byte yschuss4>#207 .or .byte kollm4=#4
			ldy yschuss4
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #1 hitclr
			mva #8 hposm3
			#end
			
			lda blink2
			adc #59
			sta blink2
			#if .byte blink2>=#0 .and .byte blink2<#60
			mva #0 blink
			#end
			#if .byte blink2>=#60 .and .byte blink2<#120
			mva #14 blink
			#end
			#if .byte blink2>=#120 .and .byte blink2<=#180
			mva #28 blink
			#end
			#if .byte blink2>=#180 .and .byte blink2<=#255
			mva #42 blink
			#end
			clc
			lda kollp0
			cmp #1
			bcc @+
			
			mva #0 kollp0
@			
			jsr letztereihe 		;letzte Reihe (lands) Bildschirm1 printen (sichtbar)	
			jsr feinscroll 			;Feinscroll Bildschirm1 ausführen (sichtbar)		
			
			mva #$30 var1			;var1 auf 30000 ($7530) setzen
			mva #$75 var1+1
			mva #$E4 var2			;var2 auf 31460 ($7AE4) setzen
			mva #$7A var2+1
			jsr grobscroll			;Bildschirm1 kopieren + grobscroll
			mva #$0C var1			;var1 + var2 auf 31500 ($7B0C) setzen
			mva #$0C var2
			mva #$7B var1+1
			mva #$7B var2+1	
			
			jsr schusslogik
			jsr umschalten
			
			inc fuelzaehleritem
			lda fuelzaehler
			tax
			lda fuelzaehleritem
			sta 31043,x
			sta 32543,x
			#if .byte fuelzaehleritem=#155
			mva #151 fuelzaehleritem
			inc fuelzaehler
			#end
			#if .byte fuelzaehler>#200
			mva #0 fuelzaehler
			#end
			#if .byte fuelzaehler=#20
			mva #52 color3
			#end
			#if .byte fuelzaehler>#34 .and .byte fuelzaehler<#200
			;jmp main1
			mva #0 fuelzaehler				;Fuel zuende Neustart
			#end
			
			jsr letztereihe			
			jsr feinscroll			;Feinscroll Bildschirm2 ausführen (sichtbar)						
			mva #$08 var2			;var1 auf 29960 ($7508) setzen
			mva #$75 var2+1
			mva #$0C var1			;var2 auf 31500 ($7B0C) setzen
			mva #$7B var1+1
			
			#if .byte kollges=#4
			mva #15 color3
			sec
			lda fuelzaehler
			sbc #10
			sta fuelzaehler	
			tax
			mva #151 fuelzaehleritem
			clc
			lda fuelzaehleritem
@			sta 31043,x
			sta 32543,x
			inx
			cpx #36
			bne @-
			jsr kollitem
			mva #0 kollm1
			#end
			
			mva #$08 var2			;var1 auf 29960 ($7508) setzen
			mva #$75 var2+1
			mva #$0C var1			;var2 auf 31500 ($7B0C) setzen
			mva #$7B var1+1
			jsr grobscroll			;;Bildschirm2 kopieren + grobscroll
			mva #$30 var1			;var1 + var2 auf 30000 ($7530) setzen
			mva #$30 var2
			mva #$75 var1+1
			mva #$75 var2+1
			
			jsr schusslogik
 			jsr umschalten			;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar
			
			inc fuelzaehleritem
			lda fuelzaehler
			tax
			lda fuelzaehleritem
			sta 31043,x
			sta 32543,x
			#if .byte fuelzaehleritem=#155
			mva #151 fuelzaehleritem
			inc fuelzaehler
			#end
			
			;Ende der Bildschirmausführung / Kontrolle Durchläufe
			sec
			lda #45 	; - 36 = Anzahl der Durchläufe - auf 4 beschränkt, da die Landschaft noch rudimentär ist und sich dann wiederholen soll
			sbc var6+1
			bpl @+
			jmp start1			;Stop hier
@	 	
			jmp hauptprogramm	 			;weiter
			
			.endp
			
			; _____________________________________________________________________________________
			;
			; ---------------------------- S U B R O U T I N E N ----------------------------------
			; _____________________________________________________________________________________

								
			icl 'VBI.asm'
			; -------------------------------------------------------------------------------------

	.proc kollision
			ldx #0
			clc
@			inx
			cpx #255
			bcc @-
			rts
	.endp
			; -------------------------------------------------------------------------------------

	.proc umschalten
			ldy #4 				;Bildschirme umschalten von unsichtbar auf sichtbar	
			mva sdlstl var5
			mva sdlstl+1 var5+1
			lda var1
			sta (var5),y
			iny
			lda var1+1
			sta (var5),y
			rts
	.endp
			; -------------------------------------------------------------------------------------

	.proc wartes
			clc
 		   	ldx delay ; Warteschleife
st  		lda RTCLOK+2    
wa   		cmp RTCLOK+2    
        	beq wa    
        	dex            
        	bpl st 
        	rts
        .endp
        
        
    .proc warte2
    		
 			clc
@			dec delay1
 			lda delay1
 			cmp #1
 			bne @-
  
  
    		rts

    	.endp
    	
        	; -------------------------------------------------------------------------------------
        	
	.proc feinscroll
			ldy #1
			mva #0 delay
			mva #255 delay1
@			jsr wartes
			
			sty vscrol
			iny
			cpy #8
			bne @-	
			
				
			rts
        .endp	
        	; --------------------------------------------------------------------------------------
   
   .proc schusslogik
   
   
   			#if .byte strig0=#0 
   			asl schussi
			#end
			
			#if .byte schussi=#2
			lda xposp1 
			sta hposm0
			lda #0
			ldy yschuss1
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss1
			asl schussi
			#end
			
			#if .byte schussi=#8
			lda xposp1 
			adc #12
			sta hposm1
			lda #0
			ldy yschuss2
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss2
			asl schussi
			#end
			
			#if .byte schussi=#32
			lda xposp1 
			sta hposm2
			lda #0
			ldy yschuss3
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss3
			asl schussi
			#end
			
			#if .byte schussi=#128
			lda xposp1
			adc #12 
			sta hposm3
			lda #0
			ldy yschuss4
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss4
			mva #1 schussi
			#end
			
   			rts
   
    	.endp
    	
    	   ; -------------------------------------------------------------------------------------- 	
	.proc grobscroll	
			;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile

			ldx #22
@			ldy #$28
			clc
@			lda (var1),y 
			sta itemex
			#if .byte itemex=#68
			jsr fuel
			#end
			sta (var2),y
			dey
			bpl @-
			clc
			lda var1
			adc #$28
			sta var1
			bcc @+
			inc var1+1
@			clc
			lda var2
			adc #$28
			sta var2
			bcc @+
			inc var2+1			
@			clc
			dex
			bpl @-3
			
			rts
	.endp		
			; -------------------------------------------------------------------------------
	
	.proc letztereihe
			;Die letzte Reihe printen 
			;Start der letzten Reihe bei var1 - Line 22
			;in Var6 (+1) wird die Position von lands gespeichert
			;in Var5 gehen Infos der Boarderanzahl rein
			;in y ist der Zähler für letzte Reihe
			;x wird als Zähler fürs printen benutzt
			
			lda var1+1
			;sta var8+1
			;sta var7+1
			lda var1
			;sta var8
			;sta var7
			adc #112
			sta var1
			inc var1+1
			inc var1+1
			inc var1+1
			ldy #0
			clc
			lda (var6),y 	;Boarderanzahl 1 holen
			sta var5
			tax				;Boarderanzahl 1 in x speichern
			jsr var6up
			lda (var6),y	;Boarderart 1 holen
			sta var7		;abspeichern in var7
@			iny
			sta (var1),y 	;Boarder1 printen
			dex
			bpl @-	
			jsr var6up
			lda (var6),y	;Boarderanzahl 2 holen
			tax
			jsr var6up
			lda (var6),y	;Boarderart 2 holen
			ldy var5
@			iny			 
			sta (var1),y 	;printen
			dex
			bpl @-
			sty var5		;Zeilenzähler sichern
			jsr var6up
			lda (var6),y 	;Rand Boarder2 holen
			inc var5		;Zeilenzähler eins weiter
			ldy var5	
			sta (var1),y 	;Rand Boarder1 printen
			jsr var6up
			lda(var6),y 	;leer holen
			tax
			lda #0
			ldy var5			
@			iny			 
			sta (var1),y 	;leer printen
			dex
			bpl @-
			sty var5 		;Zeilenzähler sichern
			jsr var6up
			lda(var6),y 	;Rand Boarder3 holen
			ldy var5
			iny
			sty var5
			sta (var1),y 	;Rand Boarder3 printen
			jsr var6up
			lda(var6),y 	;Boarder4 holen
			tax 			;Boarderanzahl in x speichern
			jsr var6up
			lda (var6),y
			ldy var5
@			iny
			sta (var1),y	;Boarder4 printen
			dex
			bpl @-
			sty var5 		;Zeilenzähler sichern
			jsr var6up
			lda(var6),y 	;Boarder5 holen
			tax 			;Boarderanzahl in x speichern
			jsr var6up
			lda (var6),y
			ldy var5
@			iny
			sta (var1),y	;Boarder5 printen
			dex
			bpl @-
			jsr var6up
			lda (var6),y	;Sonderitem holen
			sta var5		;Item in Var5 speichern
			#if .byte var5=#99
			jmp *
			#end
			jsr var6up
			#if .byte var5=#50	;Öltank printen
			ldx #11
			clc
@			mva tankol,x pr1,x
			dex
			bpl @-
			#if .byte tank1x=#0
			mva var1 tank1y
			mva var1+1 tank1y+1
			sec
			lda tank1y
			sbc #120
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			#end
			lda (var6),y		;Startposition des Items in y speichern
			sta tank1x
			tay
			jsr fuel			;Fueltank printen
			#end
			
			#if .byte var5=#51	;Rakete printen
			ldx #11
			clc
@			mva rakete,x pr1,x
			dex
			bpl @-	
			#if .byte tank1x=#0
			mva var1 tank1y
			mva var1+1 tank1y+1
			sec
			lda tank1y
			sbc #120
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			#end
			lda (var6),y		;Startposition des Items in y speichern
			sta tank1x
			tay
			jsr fuel			;Rakete printen
			#end
			
			#if .byte var5=#52	;Alien printen
			ldx #11
			clc
@			mva alien,x pr1,x
			dex
			bpl @-	
			#if .byte tank1x=#0
			mva var1 tank1y
			mva var1+1 tank1y+1
			sec
			lda tank1y
			sbc #120
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			#end
			lda (var6),y		;Startposition des Items in y speichern
			sta tank1x
			tay
			jsr fuel			;Alien printen
			#end
			#if .byte var5=#53	;TNT printen
			ldx #11
			clc
@			mva tnt,x pr1,x
			dex
			bpl @-	
			#if .byte tank1x=#0
			mva var1 tank1y
			mva var1+1 tank1y+1
			sec
			lda tank1y
			sbc #120
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			#end
			lda (var6),y		;Startposition des Items in y speichern
			sta tank1x
			tay
			jsr fuel			;TNT printen
			#end
			jsr var6up
			mva #0 vscrol
			sec
			lda tank1y
			sbc #40
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			lda tank1x
			tay
			mva #0 var5
			
			rts
						
var6up		clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1
		
			rts
	.endp
			; --------------------------------------------------------------------------------------
			
	.proc fuel
			sec				;Routine um den Öltank zu printen - es werden 12 Character meanderförmig geprinten 3x4 Matrix
			lda var1
			sbc #160
			sta var2
			lda var1+1
			sbc #0
			sta var2+1
fuelex		lda pr1
			sta (var2),y	;1
			
			lda pr2
			iny
			sta (var2),y	;2
			
			lda pr3
			iny
			sta (var2),y	;3
			clc
			lda var2
			adc #41
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dey
			
			lda pr4
			sta (var2),y	;4
			dey
			
			lda pr5
			sta (var2),y	;5
			dey
			
			lda pr6
			sta (var2),y	;6
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			
			lda pr7
			sta (var2),y	;7
			
			lda pr8
			iny
			sta (var2),y	;8
			
			lda pr9
			iny
			sta (var2),y	;9 
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			
			lda pr10
			sta (var2),y	;10
			dey
			
			lda pr11
			sta (var2),y	;11
			dey

			lda pr12
			sta (var2),y	;12
			tya
			rts
	.endp
			; ------------------------------------------------------------------------------


	.proc kollitem					;Kollisionsroutine
							;var8 unveränderter Bildschirmanfang 			
			lda yschuss1	;in Gr.0 -32 (sichtbarer Bereich ab 32 und /8
			sec
			sbc #32
			clc
			ror
			clc
			ror
			clc
			ror
			sta yschuss1	;y-Position in das x-Register schreiben
			tax	
			dex				; und einen abziehen
			lda xschuss1	;x-Position -48 (sichtbarer Bereich)und /4
			sec
			sbc #48
			clc
			ror
			clc
			ror
			tay				;in y geht die x-Position
			sec
			mva var1 var2		;holen der Bildschirmadresse -> var2
			mva var1+1 var2+1
			clc
@			lda var2		;jetzt die y-Position auf die richtige Höhe stellen
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dex
			bpl @-			;die y-Position steht in x - Addition von x Zeilen
@			dey				;die korrekte x-Position einstellen
			lda (var2),y	;linken Rand checken
			sta var8		
			iny
			iny
			lda (var2),y	;rechten Rand checken
			sta var9
			dey
			dey
			#if .byte var8=#0 .and .byte var9>#0	;Position nach rechts anpassen 
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0	;Position nach links anpassen
			dey
			#end
			lda (var2),y		;2. Durchgang der Anpassung um letzte 
			sta var8			;Fehler zu beseitigen
			iny
			iny
			lda (var2),y
			sta var9
			dey
			dey
			#if .byte var8=#0 .and .byte var9>#0
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0
			dey
			#end
			lda (var2),y		;Korrektur der y-Position
			sta var8			;in var8 aktuelle BS-Position
			sec
			lda var2			;eins drüber - bleibt wenn var2 zu tief
			sbc #40
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			lda (var2),y		;lade Bildschirminhalt eins drüber
			sta var9			;das geht in var9 rein
			#if .byte var8>#0 .and .byte var9=#0	;alte Position var2 
			clc										;wiederherstellen
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			#if .byte var8=#0 .and .byte var9=#0	;alte Position var2
			clc										;eins runter
			lda var2
			adc #80
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			lda (var2),y		;2. Durchgang der Anpassung um letzte 
			sta var8			;Fehler zu beseitigen
			sec
			lda var2
			sbc #40
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			lda (var2),y
			sta var9
			#if .byte var8>#0 .and .byte var9=#0
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			#if .byte var8=#0 .and .byte var9=#0
			clc
			lda var2
			adc #80
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
								;ab hier stimmt die Position des Items (meistens)
								;in der Variable y für x-Position
								;und in var2 für die y-Position 
expl11		
			mva var2 tank1pos		;y-Position für Explosion1
			mva var2+1 tank1pos+1
			ldx #11
			clc
@			mva expl1,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
expl22		
			mva #80 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			ldx #11
			clc
@			mva expl2,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
			
expl33		
			mva #92 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			ldx #11
			clc
@			mva expl3,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
expl44		
			mva #104 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			ldx #11
			clc
@			mva expl4,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
			rts
	.endp
			; ------------------------------------------------------------------------------
	.proc schuesse
	
			ldy yschuss1
			iny
			iny
			lda #1
			sta (miss1),Y
			sty yschuss1
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m0pf kollm1
			
			ldy yschuss2
			iny
			iny
			lda #4
			sta (miss1),Y
			sty yschuss2
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m1pf kollm2
			
			ldy yschuss3
			iny
			iny
			lda #16
			sta (miss1),Y
			sty yschuss3
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m2pf kollm3
			
			ldy yschuss4
			iny
			iny
			lda #64
			sta (miss1),Y
			sty yschuss4
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m3pf kollm4
			rts
	
	
	
	.endp
	
	.proc text
			ldx #0
			lda #52
			jsr prte
			inx
			lda #45
			jsr prte
			inx
			lda #54
			jsr prte
			inx
			lda #31
			jsr prte
			inx
			lda #52
			jsr prte
			inx
			lda #49
			jsr prte
			inx
			lda #0
			jsr prte
			inx
			lda #54
			jsr prte
			inx
			lda #50
			jsr prte
			inx
			lda #0
			jsr prte
			inx
			lda #51
			jsr prte
			inx
			lda #47
			jsr prte
			inx
			lda #50
			jsr prte
			inx
			lda #42
			jsr prte
			inx
			lda #50
			jsr prte
			inx
			lda #53
			jsr prte
			inx
			lda #0
			jsr prte 
			inx
			lda #55
			jsr prte 
			inx
			lda #34
			jsr prte 
			inx
			lda #32
			jsr prte 
			inx
			lda #34
			jsr prte 
			inx
			lda #34
			jsr prte 
			inx
			lda #0
			jsr prte 
			inx
			lda #51
			jsr prte 
			inx
			lda #45
			jsr prte 
			inx
			lda #54
			jsr prte 
			inx
			lda #45
			jsr prte 
			inx
			lda #52
			jsr prte 
			inx
			lda #0
			jsr prte 
			inx
			lda #51
			jsr prte 
			inx
			lda #52
			jsr prte 
			inx
			lda #50
			jsr prte 
			inx
			lda #44
			jsr prte 
			inx
			lda #45
			jsr prte 
			inx
			lda #47
			jsr prte 
			inx
			lda #48
			jsr prte 
			inx 
			lda #0
			jsr prte			
			
			ldx #0		;Fuel
			lda #46
			jsr prte2
			inx
			lda #31
			jsr prte2
			inx
			lda #45
			jsr prte2
			inx
			lda #48
			jsr prte2
			
			ldx #10		;Score
			lda #53
			jsr prte2
			inx
			lda #43
			jsr prte2
			inx
			lda #50
			jsr prte2
			inx
			lda #52
			jsr prte2
			inx
			lda #45
			jsr prte2
			inx
			lda #0
			jsr prte2
			inx
			lda #160
			jsr prte2
			inx
			lda #32
			jsr prte2
			inx
			lda #32
			jsr prte2
			inx
			lda #32
			jsr prte2
			ldx #23		;Ships
			lda #53
			jsr prte2
			inx
			lda #47
			jsr prte2
			inx
			lda #33
			jsr prte2
			inx
			lda #51
			jsr prte2
			inx
			lda #53
			jsr prte2
			inx 
			lda #0
			jsr prte2
			inx
			lda #28
			jsr prte2
			inx
			lda #29
			jsr prte2
			inx 
			lda #0
			jsr prte2
			inx
			lda #28
			jsr prte2
			inx
			lda #29
			jsr prte2
			inx 
			lda #0
			jsr prte2
			inx
			lda #28
			jsr prte2
			inx
			lda #29
			jsr prte2
			ldx #0
fuellauf	
			clc
			lda fuelzaehleritem
@			jsr prte3
			inx
			cpx #36
			bne @-
			rts
prte		sta 30923,x
			sta 32423,x
			rts
prte2		sta 31003,x
			sta 32503,x
			rts
prte3		sta 31043,x
			sta 32543,x
			rts
	.endp
			; ------------------------------------------------------------------------------
			
			
			run main
und noch ein kleines Video:
rtp2.MOV
(2.43 MiB) 25-mal heruntergeladen

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 57 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

und nun das Problem:

Es sind die Kollisionen...
Die Missiles laufen ja im VBI und erkennen dort auch die Kollisionen. Wenn jetzt im Hauptprogramm die Abfragen kommen und die verschiedenen Aktionen der jeweiligen Kollision, ist der Missile ja bevor überhaupt was passiert im VBI schon ein paar Zeilen weitergegangen und hat dann schon ganz andere Kollisionen gemacht bzw. die eigentliche Aktion kommt im Hauptprogramm zu spät.... ich habe heute einige Stunden mit allen möglichen Varianten experimentiert aber keine gute Lösung gefunden. Programmiere ich die ganze Schusslogik im Hauptprogramm, laufen die Missiles zu langsam und ruckeln.
Programmiere ich alles im VBI dann verbrauche ich dort wieder zu viel Zeit. Ich fürchte aber es geht nicht anders...
Oder übersehe ich da etwas??
LG
Peter

Benutzeravatar
Kveldulfur
Beiträge: 209
Registriert: 17.08.2021 02:32
Has thanked: 62 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Hi!

Evtl. geht ja ein Gemisch?
Im VBI wird die Kollision erkannt und der Missile ausgeblendet. Du setzt eine Variable Kollision auf true und merkst Dir die Position der Kollision.
Im Hauptprogramm erkennst Du nun die Kollision und die Position und kümmerst Dich um die weitere Logik.

Wenn die Animation der Kollision minimal verzögert kommt, sollte das kein Problem sein. Der Schuss ist weg und somit optisch kollidiert.

Grüße
Janko

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 57 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Hallo Janko,
wo kommst du nochmal her?? Vielleicht sollten wir mal ein Projekt zusammen machen, ich glaube wir ticken ganz ähnlich.
Ich habe mir natürlich auch nebenher Gedanken gemacht, wie ich das lösen kann und bin auf den gleichen Ansatz gekommen.

Die Schüsse müssen gut laufen und die Kollisionen müssen stabil klappen, sonst geht ja der Spielspass flöten. Also habe ich mir jetzt gesagt: VBI erstmal egal, ich muss da noch mehr Code reinpacken.
Das habe ich jetzt auch umgesetzt und es jetzt so zunächst gelöst:
Die Missiles laufen ja ständig im VBI unsichtbar und ich biege nur die x- und y-Position jeweils um, wenn der Feuerknopf gedrückt wird. Für die Abfolge der Schüsse nehme ich eine Extravariable, da steht eine 1 drin, die mit dem Befehl ASL bitweise verschoben wird. Das steuert die Schüsse in der Folge rechts links rechts links. Diese Schusslogik findet im Hauptprogramm statt.
Damit die Schüsse schneller laufen, incrementiere ich sie im VBI 2x - das Problem dabei ist, daß dann 2 verschiedene Kollisionen stattfinden können. Eine gewollte und eine ungewollte. Dafür halte ich 4x2 Variablen bereit und packe die jeweilige Kollisionsart in diese Variable rein - für alle 4 Schüsse. Das läuft auch ständig im VBI. Sobald eine Kollision eines Missiles stattfindet, biege ich den x-Vektor dieses Missiles im VBI weg, damit dann keine weiteren Kollisionen stattfinden können und die ersten Ereignisse überschreiben können. Dieser Aufwand muss wohl im VBI sein, vielleicht kann ich den Code noch etwas optimieren. Alles andere muss dann im Hauptprogramm erfolgen. Wahrscheinlich muss ich im VBI auch noch die jeweiligen x und y-Positionen retten!

Das System ist zunehmend sensibel finde ich. Nach diesen Änderungen bekomme ich ab und zu ein unangenehmes Ruckeln rein - mal ja und mal nicht. Habe noch nicht rausgefunden woher das kommt.... ich dachte erst an der Lände des VBI, aber wenn ich den Emulator auf 60 Hz umstelle, läuft es stabiler - dann kann es ja nicht an der Codelänge im VBI liegen.

Ganz schön kompliziert so ein Shooter....... ich glaube als nächstes Projekt mache ich mal ein feines Jump ´n Run - Spiel ;-)
Gruß
Peter

Benutzeravatar
Prodehl
Beiträge: 297
Registriert: 24.08.2021 14:40